diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cee2040285d..436e2d4ad0f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -29,12 +29,12 @@ libs/tools @bitwarden/team-tools-dev bitwarden_license/bit-web/src/app/tools @bitwarden/team-tools-dev bitwarden_license/bit-common/src/tools @bitwarden/team-tools-dev -## Localization/Crowdin (Tools team) -apps/browser/src/_locales @bitwarden/team-tools-dev -apps/browser/store/locales @bitwarden/team-tools-dev -apps/cli/src/locales @bitwarden/team-tools-dev -apps/desktop/src/locales @bitwarden/team-tools-dev -apps/web/src/locales @bitwarden/team-tools-dev +## Localization/Crowdin (Platform and Tools team) +apps/browser/src/_locales @bitwarden/team-tools-dev @bitwarden/team-platform-dev +apps/browser/store/locales @bitwarden/team-tools-dev @bitwarden/team-platform-dev +apps/cli/src/locales @bitwarden/team-tools-dev @bitwarden/team-platform-dev +apps/desktop/src/locales @bitwarden/team-tools-dev @bitwarden/team-platform-dev +apps/web/src/locales @bitwarden/team-tools-dev @bitwarden/team-platform-dev ## Vault team files ## apps/browser/src/vault @bitwarden/team-vault-dev @@ -134,7 +134,7 @@ libs/key-management @bitwarden/team-key-management-dev libs/key-management-ui @bitwarden/team-key-management-dev libs/common/src/key-management @bitwarden/team-key-management-dev -apps/desktop/destkop_native/core/src/biometric/ @bitwarden/team-key-management-dev +apps/desktop/desktop_native/core/src/biometric/ @bitwarden/team-key-management-dev apps/desktop/src/services/native-messaging.service.ts @bitwarden/team-key-management-dev apps/browser/src/background/nativeMessaging.background.ts @bitwarden/team-key-management-dev apps/desktop/src/services/biometric-message-handler.service.ts @bitwarden/team-key-management-dev diff --git a/.github/codecov.yml b/.github/codecov.yml index b79cdd9f413..0a6b3ceacff 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -56,11 +56,11 @@ component_management: - apps/browser/src/key-management/** - apps/browser/src/background/nativeMessaging.background.ts - apps/cli/src/key-management/** - - apps/desktop/destkop_native/core/src/biometric/** + - apps/desktop/desktop_native/core/src/biometric/** - apps/desktop/src/key-management/** - apps/desktop/src/services/biometric-message-handler.service.ts - apps/desktop/src/services/native-messaging.service.ts - - apps/web/src/app/key-managemen/** + - apps/web/src/app/key-management/** - libs/common/src/key-management/** - libs/key-management/** - libs/key-management-ui/** diff --git a/apps/browser/package.json b/apps/browser/package.json index 8fc1d733921..154543d85cc 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.1.4", + "version": "2025.2.0", "scripts": { "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", diff --git a/apps/browser/scripts/package-safari.ps1 b/apps/browser/scripts/package-safari.ps1 index 075ed606070..ce208478098 100755 --- a/apps/browser/scripts/package-safari.ps1 +++ b/apps/browser/scripts/package-safari.ps1 @@ -52,7 +52,7 @@ foreach ($subBuildPath in $subBuildPaths) { "--verbose", "--force", "--sign", - "E7C9978F6FBCE0553429185C405E61F5380BE8EB", + "4B9662CAB74E8E4F4ECBDD9EDEF2543659D95E3C", "--entitlements", $entitlementsPath ) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 269c9d9937a..50442228b7c 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "تم إرسال إشعار إلى جهازك." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "بَدْء تسجيل الدخول" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "كلمة المرور الرئيسية مكشوفة" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index e06f7117e49..5361782b104 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Cihazınıza bir bildiriş göndərildi." }, + "notificationSentDevicePart1": { + "message": "Cihazınızda Bitwarden kilidini açın, ya da " + }, + "notificationSentDeviceAnchor": { + "message": "veb tətbiqinizdə" + }, + "notificationSentDevicePart2": { + "message": "Təsdiqləməzdən əvvəl Barmaq izi ifadəsinin aşağıdakı ifadə ilə uyuşduğuna əmin olun." + }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildiriş göndərildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Hesabınızın kilidinin açıq olduğuna və barmaq izi ifadəsinin digər cihazda uyuşduğuna əmin olun" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Tələbiniz təsdiqləndikdə bildiriş alacaqsınız" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Giriş başladıldı" }, + "logInRequestSent": { + "message": "Tələb göndərildi" + }, "exposedMasterPassword": { "message": "İfşa olunmuş ana parol" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Element adı" }, - "cannotRemoveViewOnlyCollections": { - "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Təşkilat deaktiv edildi" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Ekstra enli" }, + "cannotRemoveViewOnlyCollections": { + "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Lütfən masaüstü tətbiqinizi güncəlləyin" }, diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 04d3ad78982..3c63e22406d 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Апавяшчэнне было адпраўлена на вашу прыладу." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Ініцыяваны ўваход" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Скампраметаваны асноўны пароль" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Назва элемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 1423e64e8a3..d40c4f82e3f 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Към устройството Ви е изпратено известие." }, + "notificationSentDevicePart1": { + "message": "Отключете Битоурден на устройството си или в" + }, + "notificationSentDeviceAnchor": { + "message": "приложението по уеб" + }, + "notificationSentDevicePart2": { + "message": "Уверете се, че уникалната фраза съвпада с тази по-долу, преди да одобрите." + }, "aNotificationWasSentToYourDevice": { "message": "Към устройството Ви е изпратено известие" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверете се, че регистрацията Ви е отключена и че уникалната фраза съвпада с другото устройство" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Ще получите уведомление когато заявката бъде одобрена" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Вписването е стартирано" }, + "logInRequestSent": { + "message": "Заявката е изпратена" + }, "exposedMasterPassword": { "message": "Разобличена главна парола" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Име на елемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Организацията е деактивирана" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Много широко" }, + "cannotRemoveViewOnlyCollections": { + "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Моля, обновете самостоятелното приложение" }, diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index a4459b177e4..6de7161004b 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index f826d33ae35..f2c3c1c0002 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index ca168332c12..cb5fc9fb61a 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -879,7 +879,7 @@ "message": "Enllaç caducat" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "Reinicieu el registre o proveu d'iniciar sessió." }, "youMayAlreadyHaveAnAccount": { "message": "És possible que ja tingueu un compte" @@ -2062,7 +2062,7 @@ "message": "Generador de nom d'usuari" }, "useThisEmail": { - "message": "Use this email" + "message": "Utilitza aquest correu" }, "useThisPassword": { "message": "Utilitzeu aquesta contrasenya" @@ -2826,7 +2826,7 @@ "message": "Error de desxifrat" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden no ha pogut desxifrar els elements de la caixa forta que s'indiquen a continuació." }, "contactCSToAvoidDataLossPart1": { "message": "Contacteu amb el servei d'atenció al client", @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "S'ha enviat una notificació al vostre dispositiu." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "S'ha enviat una notificació al vostre dispositiu" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assegureu-vos que la vostra caixa forta estiga desbloquejada i que la frase d'empremta digital coincidisca en l'altre dispositiu" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Se us notificarà un vegada s'haja aprovat la sol·licitud" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "S'ha iniciat la sessió" }, + "logInRequestSent": { + "message": "Sol·licitud enviada" + }, "exposedMasterPassword": { "message": "Contrasenya mestra exposada" }, @@ -3917,7 +3926,7 @@ "description": "Label indicating the most common import formats" }, "confirmContinueToBrowserSettingsTitle": { - "message": "Continue to browser settings?", + "message": "Voleu continuar a la configuració del navegador?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nom d'element" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4184,7 +4184,7 @@ "message": "Enllaçat" }, "copySuccessful": { - "message": "Copy Successful" + "message": "Còpia correcta" }, "upload": { "message": "Puja" @@ -4196,7 +4196,7 @@ "message": "La mida màxima del fitxer és de 500 MB" }, "deleteAttachmentName": { - "message": "Delete attachment $NAME$", + "message": "Suprimeix adjunt $NAME$", "placeholders": { "name": { "content": "$1", @@ -4214,7 +4214,7 @@ } }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Are you sure you want to permanently delete this attachment?" + "message": "Esteu segur que voleu suprimir definitivament aquest adjunt?" }, "premium": { "message": "Premium" @@ -4511,13 +4511,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Col·leccions assignades correctament" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "No heu seleccionat res." }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "Els elements seleccionats s'han desplaçat a $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4526,7 +4526,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "S'han desplaçat elements a $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4535,7 +4535,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "S'ha desplaçat un element a $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4564,16 +4564,16 @@ "message": "Item Location" }, "fileSend": { - "message": "File Send" + "message": "Send de fitxer" }, "fileSends": { - "message": "File Sends" + "message": "Sends de fitxer" }, "textSend": { - "message": "Text Send" + "message": "Send de text" }, "textSends": { - "message": "Text Sends" + "message": "Sends de text" }, "accountActions": { "message": "Account actions" @@ -4585,10 +4585,10 @@ "message": "Mostra accions de còpia ràpida a la caixa forta" }, "systemDefault": { - "message": "System default" + "message": "Per defecte del sistema" }, "enterprisePolicyRequirementsApplied": { - "message": "Enterprise policy requirements have been applied to this setting" + "message": "Els requisits de la política empresarial s'han aplicat a aquesta configuració" }, "sshPrivateKey": { "message": "Clau privada" @@ -4618,7 +4618,7 @@ "message": "Torneu-ho a provar" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "El temps d'espera personalitzat mínim és d'1 minut." }, "additionalContentAvailable": { "message": "Additional content is available" @@ -4627,10 +4627,10 @@ "message": "File saved to device. Manage from your device downloads." }, "showCharacterCount": { - "message": "Show character count" + "message": "Mostra el recompte de caràcters" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Amaga el recompte de caràcters" }, "itemsInTrash": { "message": "Items in trash" @@ -4642,7 +4642,7 @@ "message": "Items you delete will appear here and be permanently deleted after 30 days" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "Els elements que porten més de 30 dies a la paperera se suprimiran automàticament" }, "restore": { "message": "Restaura" @@ -4651,7 +4651,7 @@ "message": "Suprimeix per sempre" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "No tens permisos per editar aquest fitxer" }, "biometricsStatusHelptextUnlockNeeded": { "message": "Biometric unlock is unavailable because PIN or password unlock is required first." @@ -4688,7 +4688,7 @@ "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Password regenerated", + "message": "Contrasenya regenerada", "description": "Notification message for when a password has been regenerated" }, "saveLoginToBitwarden": { @@ -4696,7 +4696,7 @@ "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { - "message": "Space", + "message": "Espai", "description": "Represents the space key in screen reader content as a readable word" }, "tildeCharacterDescriptor": { @@ -4708,7 +4708,7 @@ "description": "Represents the ` key in screen reader content as a readable word" }, "exclamationCharacterDescriptor": { - "message": "Exclamation mark", + "message": "Signe d'exclamació", "description": "Represents the ! key in screen reader content as a readable word" }, "atSignCharacterDescriptor": { @@ -4867,13 +4867,13 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "No, jo no" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { "message": "Yes, I can reliably access my email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Activa l'inici de sessió en dos passos" }, "changeAcctEmail": { "message": "Change account email" @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 9c427edf5cf..025e2028537 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení." }, + "notificationSentDevicePart1": { + "message": "Odemknout Bitwarden na Vašem zařízení nebo na" + }, + "notificationSentDeviceAnchor": { + "message": "webová aplikace" + }, + "notificationSentDevicePart2": { + "message": "Před schválením se ujistěte, že fráze otisku prstu odpovídá frázi níže." + }, "aNotificationWasSentToYourDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ujistěte se, že je Váš trezor odemčen a fráze otisku prstu se shodují s druhým zařízením" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Budete upozorněni, jakmile bude žádost schválena" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Bylo zahájeno přihlášení" }, + "logInRequestSent": { + "message": "Požadavek odeslán" + }, "exposedMasterPassword": { "message": "Odhalené hlavní heslo" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Název položky" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organizace je deaktivována" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra široký" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Aktualizujte aplikaci pro stolní počítač" }, diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 31208e2e020..12485e20120 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index b553afdbe2f..9a5e61d6daa 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "En notifikation er sendt til din enhed." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "En notifikation er sendt til enheden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Sørg for, at boksen er oplåst, samt at fingeraftrykssætningen matcher på den anden enhed" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Man vil få besked, når anmodningen er godkendt" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Indlogning påbegyndt" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Kompromitteret hovedadgangskode" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Emnenavn" }, - "cannotRemoveViewOnlyCollections": { - "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisation er deaktiveret" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Ekstra bred" }, + "cannotRemoveViewOnlyCollections": { + "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Opdatér venligst computerapplikationen" }, diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 1dca0804873..23f35fc931c 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." }, + "notificationSentDevicePart1": { + "message": "Entsperre Bitwarden auf deinem Gerät oder mit der" + }, + "notificationSentDeviceAnchor": { + "message": "Web-App" + }, + "notificationSentDevicePart2": { + "message": "Stelle vor der Genehmigung sicher, dass die Fingerabdruck-Phrase mit der unten stehenden übereinstimmt." + }, "aNotificationWasSentToYourDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Stelle sicher, dass dein Konto entsperrt ist und die Fingerabdruck-Phrase mit der vom anderen Gerät übereinstimmt" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Du wirst benachrichtigt, sobald die Anfrage genehmigt wurde" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Anmeldung eingeleitet" }, + "logInRequestSent": { + "message": "Anfrage gesendet" + }, "exposedMasterPassword": { "message": "Kompromittiertes Master-Passwort" }, @@ -3994,7 +4003,7 @@ "message": "Passkey entfernt" }, "autofillSuggestions": { - "message": "Vorschläge zum Auto-Ausfüllen" + "message": "Auto-Ausfüllen-Vorschläge" }, "itemSuggestions": { "message": "Vorgeschlagene Einträge" @@ -4146,15 +4155,6 @@ "itemName": { "message": "Eintrags-Name" }, - "cannotRemoveViewOnlyCollections": { - "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisation ist deaktiviert" }, @@ -4579,7 +4579,7 @@ "message": "Konto-Aktionen" }, "showNumberOfAutofillSuggestions": { - "message": "Anzahl der Vorschläge zum Auto-Ausfüllen von Zugangsdaten auf dem Erweiterungssymbol anzeigen" + "message": "Anzahl der Auto-Ausfüllen-Vorschläge von Zugangsdaten auf dem Erweiterungssymbol anzeigen" }, "showQuickCopyActions": { "message": "Schnellkopier-Aktionen im Tresor anzeigen" @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra breit" }, + "cannotRemoveViewOnlyCollections": { + "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Bitte aktualisiere deine Desktop-Anwendung" }, diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 7d2afbf9969..7c9f6a7740e 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Μια ειδοποίηση στάλθηκε στη συσκευή σας" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Βεβαιωθείτε ότι ο λογαριασμός σας είναι ξεκλείδωτος και ότι η φράση δακτυλικού αποτυπώματος ταιριάζει στην άλλη συσκευή" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Θα ειδοποιηθείτε μόλις εγκριθεί η αίτηση" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Η σύνδεση ξεκίνησε" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Εκτεθειμένος Κύριος Κωδικός Πρόσβασης" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Όνομα αντικειμένου" }, - "cannotRemoveViewOnlyCollections": { - "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Ο οργανισμός απενεργοποιήθηκε" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Εξαιρετικά φαρδύ" }, + "cannotRemoveViewOnlyCollections": { + "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 6ede9cab724..d591603c420 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisation is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 1be001abea4..a5bccf2ae83 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisation is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index df5f38f878c..d440e170928 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Se ha enviado una notificación a tu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Inicio de sesión en proceso" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Contraseña maestra comprometida" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nombre del elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "La organización está desactivada" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index a5c69ed7cac..30be22a7d6e 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Sinu seadmesse saadeti teavitus." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Sisselogimine on käivitatud" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Ülemparool on haavatav" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 7f0da4e1d41..4730c5918c6 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 034a79b3d35..8f414b35725 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "یک اعلان به دستگاه شما ارسال شده است." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "ورود به سیستم آغاز شد" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "کلمه عبور اصلی افشا شده" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 8e327cbe222..e06f927072a 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Laitteellesi on lähetetty ilmoitus." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Laitteeseesi lähetettiin ilmoitus" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelausekkeen" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Sinulle ilmoitetaan, kun pyyntö on hyväksytty" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Kirjautuminen aloitettu" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Paljastunut pääsalasana" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Kohteen nimi" }, - "cannotRemoveViewOnlyCollections": { - "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisaatio on poistettu käytöstä" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Erittäin leveä" }, + "cannotRemoveViewOnlyCollections": { + "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Päivitä työpöytäsovellus" }, diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index a37756ece9a..d5f1ee430a5 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Naipadala na ang notification sa iyong device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Nakalantad na Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 26d3c1c352e..a52cb300532 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Une notification a été envoyée à votre appareil." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Une notification a été envoyée à votre appareil" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assurez-vous que votre compte est déverrouillé et que la phrase d'empreinte correspond à l'autre appareil" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Vous serez notifié une fois que la demande sera approuvée" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Connexion initiée" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Mot de passe principal exposé" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nom de l’élément" }, - "cannotRemoveViewOnlyCollections": { - "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "L'organisation est désactivée" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Très large" }, + "cannotRemoveViewOnlyCollections": { + "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 423f5f4c471..e92bf5c06b8 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -382,7 +382,7 @@ "message": "Aniñar un cartafol engadindo o nome do cartafol pai seguido dun \"/\". Exemplo: Social/Foros" }, "noFoldersAdded": { - "message": "Sen cartafois" + "message": "Sen cartafoles" }, "createFoldersToOrganize": { "message": "Crea cartafoles para organizar as entradas da túa caixa forte" @@ -394,10 +394,10 @@ "message": "Eliminar cartafol" }, "folders": { - "message": "Cartafois" + "message": "Cartafoles" }, "noFolders": { - "message": "Non hai cartafois que listar." + "message": "Non hai cartafoles que listar." }, "helpFeedback": { "message": "Axuda e comentarios" @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Enviouse unha notificación ó teu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Enviouse unha notificación ó teu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Por favor asegúrate de que a sesión está aberta e a frase de pegada dixital coincide ca do outro dispositivo" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Serás notificado unha vez se aprobe a solicitude" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Inicio de sesión comezado" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Contrasinal mestre filtrado" }, @@ -3810,7 +3819,7 @@ "message": "Autenticación multifactor fallida" }, "includeSharedFolders": { - "message": "Incluír cartafois compartidos" + "message": "Incluír cartafoles compartidos" }, "lastPassEmail": { "message": "Correo de LastPass" @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nome da entrada" }, - "cannotRemoveViewOnlyCollections": { - "message": "Non podes eliminar coleccións con permisos de Só lectura: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "A organización está desactivada" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Moi ancho" }, + "cannotRemoveViewOnlyCollections": { + "message": "Non podes eliminar coleccións con permisos de Só lectura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 93600eaf6a9..a5e126046a7 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 071c7acdb0f..e3a1b690bf3 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index a8f9c8b672f..b604d562181 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -446,16 +446,16 @@ "message": "Generiraj frazu lozinke" }, "passwordGenerated": { - "message": "Password generated" + "message": "Lozinka generirana" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Frazna lozinka generirana" }, "usernameGenerated": { - "message": "Username generated" + "message": "Korisničko ime generirano" }, "emailGenerated": { - "message": "Email generated" + "message": "e-pošta generirana" }, "regeneratePassword": { "message": "Ponovno generiraj lozinku" @@ -660,10 +660,10 @@ "message": "Potvrdi identitet" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Nastavi prijavu" }, "yourVaultIsLocked": { "message": "Tvoj trezor je zaključan. Potvrdi glavnu lozinku za nastavak." @@ -1005,7 +1005,7 @@ "message": "Pitaj za dodavanje stavke ako nije pronađena u tvojem trezoru. Primjenjuje se na sve prijavljene račune." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Uvijek prikaži kartice kao prijedloge za auto-ispunu u prikazu trezora" }, "showCardsCurrentTab": { "message": "Prikaži platne kartice" @@ -1014,7 +1014,7 @@ "message": "Prikazuj platne kartice za jednostavnu auto-ispunu." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Uvijek prikaži identitete kao prijedloge za auto-ispunu u prikazu trezora" }, "showIdentitiesCurrentTab": { "message": "Prikaži identitete" @@ -2062,7 +2062,7 @@ "message": "Generator korisničkih imena" }, "useThisEmail": { - "message": "Use this email" + "message": "Koristi ovu e-poštu" }, "useThisPassword": { "message": "Koristi ovu lozinku" @@ -2343,7 +2343,7 @@ "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "Blokirane domene" }, "excludedDomains": { "message": "Izuzete domene" @@ -2355,13 +2355,13 @@ "message": "Bitwarden neće nuditi spremanje podataka za prijavu za ove domene za sve prijavljene račune. Moraš osvježiti stranicu kako bi promjene stupile na snagu." }, "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": "Auto-ispuna i druge vezane značajke neće biti ponuđene za ova web mjesta. Potrebno je osvježiti stranicu zaprimjenu postavki." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "Auto-ispuna je blokirana za ovu web stranicu." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Promijeni ovo u postavkama" }, "websiteItemLabel": { "message": "Web stranica $number$ (URI)", @@ -2382,7 +2382,7 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "Spremljene promjene blokiranih domena" }, "excludedDomainsSavedSuccess": { "message": "Spremljene promjene izuzete domene" @@ -2823,17 +2823,17 @@ "message": "Pogreška" }, "decryptionError": { - "message": "Decryption error" + "message": "Pogreška pri dešifriranju" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nije mogao dešifrirati sljedeće stavke trezora." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Kontaktiraj službu za korisnike", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "kako bi izbjegli gubitak podataka.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Obavijest je poslana na tvoj uređaj." }, + "notificationSentDevicePart1": { + "message": "Otključaj Bitwarden na svojem uređaju ili na" + }, + "notificationSentDeviceAnchor": { + "message": "web trezoru" + }, + "notificationSentDevicePart2": { + "message": "Provjeri slaže li se jedinstvena fraza s ovdje prikazanom prije odobravanja." + }, "aNotificationWasSentToYourDevice": { "message": "Obavijest je poslana na tvoj uređaj" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Provjeri je li trezor otključan i slaže li se jedinstvena fraza s drugim uređajem" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Dobiti ćeš obavijest kada je tvoj zahtjev odobren" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Prijava pokrenuta" }, + "logInRequestSent": { + "message": "Zahtjev poslan" + }, "exposedMasterPassword": { "message": "Ukradena glavna lozinka" }, @@ -3994,10 +4003,10 @@ "message": "Pristupni ključ uklonjen" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Prijedlozi auto-ispune" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Predložene stavke" }, "autofillSuggestionsTip": { "message": "Spremi u auto-ispunu stavku prijave za ovu stranicu" @@ -4146,15 +4155,6 @@ "itemName": { "message": "Naziv stavke" }, - "cannotRemoveViewOnlyCollections": { - "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organizacija je deaktivirana" }, @@ -4654,22 +4654,22 @@ "message": "Nemaš prava za uređivanje ove stavke" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Biometrijsko otključavanje nije dostupno jer je prvo potrebno otključati PIN-om ili lozinkom." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrijsko otključavanje trenutno nije dostupno." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrijsko otključavanje nije dostupno zbog pogrešno konfiguriranih sistemskih datoteka." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrijsko otključavanje nije dostupno zbog pogrešno konfiguriranih sistemskih datoteka." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Biometrijsko otključavanje nije dostupno jer je Bitwarden dekstop aplikacija zatvorena." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Biometrijsko otključavanje nije dostupno jer nije omogućeno za $EMAIL$ u Bitwarden desktop aplikaciji.", "placeholders": { "email": { "content": "$1", @@ -4678,7 +4678,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Biometrijsko otključavanje trenutno nije dostupno iz nepoznatog razloga." }, "authenticating": { "message": "Autentifikacija" @@ -4887,10 +4887,19 @@ "extraWide": { "message": "Ekstra široko" }, + "cannotRemoveViewOnlyCollections": { + "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Molimo, ažuriraj svoju desktop aplikaciju" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Za korištenje biometrijskog otključavanja ažuriraj desktop aplikaciju ili nemogući otključavanje otiskom prsta u desktop aplikaciji." } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 9ac2cea07ce..14f6431b4cb 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, + "notificationSentDevicePart1": { + "message": "A Bitwarden zárolás feloldása az eszközön vagy: " + }, + "notificationSentDeviceAnchor": { + "message": "webalkalmazás" + }, + "notificationSentDevicePart2": { + "message": "Jóváhagyás előtt győződjünk meg arról, hogy az ujjlenyomat kifejezés megegyezik az alábbi kifejezéssel." + }, "aNotificationWasSentToYourDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ellenőrizzük, hogy a széf feloldásra került és az ujjlenyomat kifejezés egyezik a másik eszközön levővel." - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "A kérelem jóváhagyása után értesítés érkezik." }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "A bejelentkezés elindításra került." }, + "logInRequestSent": { + "message": "A kérés elküldésre került." + }, "exposedMasterPassword": { "message": "Kiszivárgott mesterjelszó" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Elem neve" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra széles" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Frissítsük az asztali alkalmazást." }, diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index b059303d5a2..53810e85f77 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Sebuah pemberitahuan dikirim ke perangkat Anda." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Sebuah pemberitahuan telah dikirim ke perangkat Anda" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Pastikan akun Anda terbuka dan frasa sidik jari cocok pada perangkat lainnya" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Anda akan diberitahu setelah permintaan disetujui" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Memulai login" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Kata Sandi Utama yang Terpapar" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nama benda" }, - "cannotRemoveViewOnlyCollections": { - "message": "Anda tidak dapat menghapus koleksi dengan izin hanya lihat: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisasi dinonaktifkan" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Ekstra lebar" }, + "cannotRemoveViewOnlyCollections": { + "message": "Anda tidak dapat menghapus koleksi dengan izin hanya lihat: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 0765cd0e419..9c00396b450 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Una notifica è stata inviata al tuo dispositivo." }, + "notificationSentDevicePart1": { + "message": "Sblocca Bitwarden sul tuo dispositivo o su" + }, + "notificationSentDeviceAnchor": { + "message": "app web" + }, + "notificationSentDevicePart2": { + "message": "Assicurarsi che la frase di impronta digitale corrisponda a quella sottostante prima dell'approvazione." + }, "aNotificationWasSentToYourDevice": { "message": "Una notifica è stata inviata al tuo dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assicurati che il tuo account sia sbloccato e che la frase dell'impronta digitale corrisponda nell'altro dispositivo" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Sarai notificato una volta che la richiesta sarà approvata" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Accesso avviato" }, + "logInRequestSent": { + "message": "Richiesta inviata" + }, "exposedMasterPassword": { "message": "Password principale violata" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nome elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "L'organizzazione è disattivata" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Molto larga" }, + "cannotRemoveViewOnlyCollections": { + "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Aggiornare l'applicazione desktop" }, diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index fb927551b30..ca8141cb59f 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "デバイスに通知を送信しました。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "お使いのデバイスに通知が送信されました" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "アカウントがロック解除されていることと、フィンガープリントフレーズが他の端末で一致していることを確認してください" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "リクエストが承認されると通知されます" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "ログイン開始" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "流出したマスターパスワード" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "アイテム名" }, - "cannotRemoveViewOnlyCollections": { - "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "組織は無効化されています" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "エクストラワイド" }, + "cannotRemoveViewOnlyCollections": { + "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index b1c5b7a5e58..5b81c015383 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "ჩანაწერის სახელი" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index eb44a6806d1..800523bdc2e 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 69d05d03fe6..90359b0f73b 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 93cde61315c..896e22d57bb 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -1005,7 +1005,7 @@ "message": "보관함에 항목이 없을 경우 추가하라는 메시지를 표시합니다. 모든 로그인된 계정에 적용됩니다." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "보관함 보기에서 언제나 카드 자동 완성 제안을 표시" }, "showCardsCurrentTab": { "message": "탭 페이지에 카드 표시" @@ -1014,7 +1014,7 @@ "message": "간편한 자동완성을 위해 탭에 카드 항목들을 나열" }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "보관함 보기에서 언제나 신원의 자동 완성 제안을 표시" }, "showIdentitiesCurrentTab": { "message": "탭 페이지에 신원들을 표시" @@ -1125,10 +1125,10 @@ "message": "이 비밀번호는 이 파일을 파일 내보내거나, 가져오는데 사용됩니다." }, "accountRestrictedOptionDescription": { - "message": "계정의 사용자 이름과 마스터 비밀번호에서 파생된 계정 암호화 키를 사용하여 내보내기를 암호화하고, 현재 Bitwarden계정으만 가져오기를 제한합니다." + "message": "내보내기를 당신의 계정의 사용자이름과 마스터비밀번호로부터 파생된 계정 암호화 키를 사용하여 암호화하고, 현재의 Bitwarden 계정으로만 가져오도록 제한합니다." }, "passwordProtectedOptionDescription": { - "message": "파일 비밀번호를 설정하여 내보내기를 암호화하고, 어느 Bitwarden 계정으로든 해독에 그 파일 비밀번호를 사용하여 가져오세요." + "message": "파일에 비밀번호를 설정하여 내보내기를 암호화하고, 어느 Bitwarden 계정으로든 그 비밀번호로 해독하여 가져오기 합니다." }, "exportTypeHeading": { "message": "내보내기 유형" @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "기기에 알림이 전송되었습니다." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "기기에 알림이 전송되었습니다." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "반드시 계정이 잠금 해제되었고, 지문 구절이 다른 기기에서 일치하는지 확인해주세요." - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "요청이 승인되면 알림을 받게 됩니다" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "로그인 시작" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "노출된 마스터 비밀번호" }, @@ -3994,7 +4003,7 @@ "message": "패스키 제거됨" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "자동 완성 제안" }, "itemSuggestions": { "message": "Suggested items" @@ -4146,15 +4155,6 @@ "itemName": { "message": "항목 이름" }, - "cannotRemoveViewOnlyCollections": { - "message": "보기 권한만 있는 컬렉션은 제거할 수 없습니다: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "조직이 비활성화되었습니다" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "매우 넓게" }, + "cannotRemoveViewOnlyCollections": { + "message": "보기 권한만 있는 컬렉션은 제거할 수 없습니다: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index bb3e7e2357c..f64eb8b5189 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Pradėtas prisijungimas" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Elemento pavadinimas" }, - "cannotRemoveViewOnlyCollections": { - "message": "Negalite pašalinti kolekcijų su Peržiūrėti tik leidimus: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "Negalite pašalinti kolekcijų su Peržiūrėti tik leidimus: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index d256bed25a9..3306cdf5a8f 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -2062,7 +2062,7 @@ "message": "Lietotājvārdu veidotājs" }, "useThisEmail": { - "message": "Use this email" + "message": "Izmantot šo e-pasta adresi" }, "useThisPassword": { "message": "Izmantot šo paroli" @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Uz ierīci ir nosūtīts paziņojums." }, + "notificationSentDevicePart1": { + "message": "Bitwarden jāatslēdz savā ierīcē vai" + }, + "notificationSentDeviceAnchor": { + "message": "tīmekļa lietotnē" + }, + "notificationSentDevicePart2": { + "message": "Pirms apstiprināšanas jāpārliecinās, ka pirkstu nospieduma vārdkopa atbilst zemāk esošajai." + }, "aNotificationWasSentToYourDevice": { "message": "Uz ierīci tika nosūtīts paziņojums" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lūgums pārliecināties, ka konts ir atslēgts un atpazīšanas vārdkopa ir tāda pati arī otrā ierīcē" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Tiks paziņots, tiklīdz pieprasījums būs apstiprināts" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Uzsākta pieteikšanās" }, + "logInRequestSent": { + "message": "Pieprasījums nosūtīts" + }, "exposedMasterPassword": { "message": "Noplūdusi galvenā parole" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Vienuma nosaukums" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Apvienība ir atspējota" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Ļoti plats" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Lūgums atjaunināt darbvirsmas lietotni" }, diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index b9d2858a5c9..75cf2bdd567 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 501f02e4e54..622cb1be639 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index eb44a6806d1..800523bdc2e 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 101b314c9c2..ce50ff4f90a 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -7,7 +7,7 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "message": "Hjemme, på jobben eller på farten sikrer Bitwarden enkelt alle dine passord, passnøkler og sensitiv informasjon", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -141,7 +141,7 @@ "message": "Kopiér navn" }, "copyCompany": { - "message": "Copy company" + "message": "Kopiér firma" }, "copySSN": { "message": "Kopiér fødselsnummer" @@ -281,13 +281,13 @@ "message": "Endre hovedpassordet" }, "continueToWebApp": { - "message": "Continue to web app?" + "message": "Vil du fortsette til nettappen?" }, "continueToWebAppDesc": { "message": "Explore more features of your Bitwarden account on the web app." }, "continueToHelpCenter": { - "message": "Continue to Help Center?" + "message": "Vil du fortsette til Hjelpesenteret?" }, "continueToHelpCenterDesc": { "message": "Learn more about how to use Bitwarden on the Help Center." @@ -299,7 +299,7 @@ "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." }, "changeMasterPasswordOnWebConfirmation": { - "message": "You can change your master password on the Bitwarden web app." + "message": "Du kan endre hovedpassordet ditt i Bitwardens nettapp." }, "fingerprintPhrase": { "message": "Fingeravtrykksfrase", @@ -322,16 +322,16 @@ "message": "Om" }, "moreFromBitwarden": { - "message": "More from Bitwarden" + "message": "Mer fra Bitwarden" }, "continueToBitwardenDotCom": { "message": "Vil du fortsette til bitwarden.com?" }, "bitwardenForBusiness": { - "message": "Bitwarden for Business" + "message": "Bitwarden for bedrifter" }, "bitwardenAuthenticator": { - "message": "Bitwarden Authenticator" + "message": "Bitwarden-autentiserer" }, "continueToAuthenticatorPageDesc": { "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" @@ -431,7 +431,7 @@ "message": "Generer automatisk sterke og unike passord for dine innlogginger." }, "bitWebVaultApp": { - "message": "Bitwarden web app" + "message": "Bitwardens nett-app" }, "importItems": { "message": "Importer elementer" @@ -443,19 +443,19 @@ "message": "Generer et passord" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Generér passordfrase" }, "passwordGenerated": { - "message": "Password generated" + "message": "Passord generert" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Passordfrase generert" }, "usernameGenerated": { - "message": "Username generated" + "message": "Brukernavn generert" }, "emailGenerated": { - "message": "Email generated" + "message": "E-postadresse generert" }, "regeneratePassword": { "message": "Omgenerer et passord" @@ -567,7 +567,7 @@ "message": "Passord" }, "totp": { - "message": "Authenticator secret" + "message": "Autentiseringsnøkkel" }, "passphrase": { "message": "Passfrase" @@ -633,7 +633,7 @@ "message": "Annet" }, "unlockMethods": { - "message": "Unlock options" + "message": "Opplåsingsalternativer" }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." @@ -642,10 +642,10 @@ "message": "Set up an unlock method in Settings" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Tidsavbrudd for økten" }, "vaultTimeoutHeader": { - "message": "Vault timeout" + "message": "Tidsavbrudd for hvelvet" }, "otherOptions": { "message": "Andre valg" @@ -663,16 +663,16 @@ "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Fortsett innloggingen" }, "yourVaultIsLocked": { "message": "Hvelvet ditt er låst. Kontroller hovedpassordet ditt for å fortsette." }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Hvelvet ditt er låst" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Kontoen din er låst" }, "or": { "message": "eller" @@ -797,10 +797,10 @@ "message": "Din nye konto har blitt opprettet! Du kan nå logge på." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "Den nye kontoen din er opprettet!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "Du har blitt logget inn!" }, "youSuccessfullyLoggedIn": { "message": "Du har vellykket logget inn" @@ -861,7 +861,7 @@ "message": "Logget av" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Du har blitt logget ut av kontoen din." }, "loginExpired": { "message": "Din innloggingsøkt har utløpt." @@ -873,7 +873,7 @@ "message": "Logg inn på Bitwarden" }, "restartRegistration": { - "message": "Restart registration" + "message": "Start registreringen på nytt" }, "expiredLink": { "message": "Utløpt lenke" @@ -909,7 +909,7 @@ "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." }, "twoStepLoginConfirmationTitle": { - "message": "Continue to web app?" + "message": "Vil du fortsette til nettappen?" }, "editedFolder": { "message": "Redigerte mappen" @@ -1290,7 +1290,7 @@ "message": "Takk for at du støtter Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to Premium and receive:" + "message": "Oppgrader til Premium og motta:" }, "premiumPrice": { "message": "Og alt det for %price%/år!", @@ -1477,29 +1477,29 @@ "message": "Miljø-nettadressene har blitt lagret." }, "showAutoFillMenuOnFormFields": { - "message": "Show autofill menu on form fields", + "message": "Vis autoutfyll-menyen i tekstbokser", "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { "message": "Autoutfyllingsforslag" }, "showInlineMenuLabel": { - "message": "Show autofill suggestions on form fields" + "message": "Vis autoutfyll-forslag i tekstbokser" }, "showInlineMenuIdentitiesLabel": { - "message": "Display identities as suggestions" + "message": "Vis identiteter som forslag" }, "showInlineMenuCardsLabel": { - "message": "Display cards as suggestions" + "message": "Vis kort som forslag" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Display suggestions when icon is selected" + "message": "Vis forslag når ikonet er valgt" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "Applies to all logged in accounts." }, "turnOffBrowserBuiltInPasswordManagerSettings": { - "message": "Turn off your browser's built in password manager settings to avoid conflicts." + "message": "Skru av din nettlesers innebygde passordbehandler for å unngå konflikter." }, "turnOffBrowserBuiltInPasswordManagerSettingsLink": { "message": "Rediger nettleserinnstillingene." @@ -1538,7 +1538,7 @@ "message": "Standard autofyll innstilling for innloggingselementer" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Etter aktivering av auto-utfylling på sidelasser, kan du aktivere eller deaktivere funksjonen for individuelle innloggingselementer. Dette er standardinnstillingen for innloggingselementer som ikke er satt opp separat." + "message": "Du kan skru av auto-utfylling ved sideinnlastinger for individuelle innloggingsgjenstander fra gjenstandens «Redigér»-visning." }, "itemAutoFillOnPageLoad": { "message": "Auto-utfyll på sideinnlastning (hvis aktivert i Alternativer)" @@ -1598,7 +1598,7 @@ "message": "Boolsk verdi" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Avkryssingsboks" }, "cfTypeLinked": { "message": "Tilkoblet", @@ -1819,7 +1819,7 @@ "message": "Generatorhistorikk" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Tøm generatorhistorikk" }, "cleargGeneratorHistoryDescription": { "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" @@ -1831,7 +1831,7 @@ "message": "Samlinger" }, "nCollections": { - "message": "$COUNT$ collections", + "message": "$COUNT$ samlinger", "placeholders": { "count": { "content": "$1", @@ -1887,7 +1887,7 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Grunndomene (anbefalt)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -1947,7 +1947,7 @@ "message": "Ingenting å vise" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Du har ikke generert noe i det siste" }, "remove": { "message": "Fjern" @@ -2017,7 +2017,7 @@ "message": "Angi PIN-koden din for å låse opp Bitwarden. PIN-innstillingene tilbakestilles hvis du logger deg helt ut av programmet." }, "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "message": "PIN-koden din vil bli brukt til å låse opp Bitwarden i stedet for hovedpassordet ditt. PIN-koden din tilbakestilles hvis du noen gang logger deg helt ut av Bitwarden." }, "pinRequired": { "message": "PIN-kode er påkrevd." @@ -2026,7 +2026,7 @@ "message": "Ugyldig PIN-kode." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "Too many invalid PIN entry attempts. Logging out." + "message": "For mange ugyldige PIN-kodeforsøk. Logger ut." }, "unlockWithBiometrics": { "message": "Lås opp med biometri" @@ -2062,7 +2062,7 @@ "message": "Brukernavngenerator" }, "useThisEmail": { - "message": "Use this email" + "message": "Bruk denne E-postadressen" }, "useThisPassword": { "message": "Bruk dette passordet" @@ -2078,14 +2078,14 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "for å lage et sterkt og unikt passord", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { "message": "Handling ved tidsavbrudd i hvelvet" }, "vaultTimeoutAction1": { - "message": "Timeout action" + "message": "Handling ved tidsavbrudd" }, "lock": { "message": "Lås", @@ -2135,7 +2135,7 @@ "message": "Autoutfylt element" }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "Advarsel: Dette er en usikret HTTP-side, og all informasjon du sender inn kan potensielt bli sett og endret av andre. Denne påloggingen ble opprinnelig lagret på et sikkert (HTTPS) nettsted." }, "insecurePageWarningFillPrompt": { "message": "Ønsker du likevel å fylle ut denne innloggingen?" @@ -2306,7 +2306,7 @@ "message": "Please unlock this user in the desktop application and try again." }, "biometricsNotAvailableTitle": { - "message": "Biometric unlock unavailable" + "message": "Biometrisk opplåsing er utilgjengelig" }, "biometricsNotAvailableDesc": { "message": "Biometric unlock is currently unavailable. Please try again later." @@ -2361,10 +2361,10 @@ "message": "Autofill is blocked for this website." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Endre dette i innstillingene" }, "websiteItemLabel": { - "message": "Website $number$ (URI)", + "message": "Nettsted $number$ (URİ)", "placeholders": { "number": { "content": "$1", @@ -2391,11 +2391,11 @@ "message": "Begrens visninger" }, "limitSendViewsHint": { - "message": "No one can view this Send after the limit is reached.", + "message": "Ingen kan se denne Send-en etter at grensen er nådd.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ views left", + "message": "$ACCESSCOUNT$ visninger igjen", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -2409,7 +2409,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "Send details", + "message": "Send-detaljer", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -2426,7 +2426,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "hideTextByDefault": { - "message": "Hide text by default" + "message": "Skjul tekst som standard" }, "expired": { "message": "Utløpt" @@ -2506,7 +2506,7 @@ "message": "Egendefinert" }, "sendPasswordDescV3": { - "message": "Add an optional password for recipients to access this Send.", + "message": "Legg til et valgfritt passord for at mottakerne skal få tilgang til denne Send-en.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -2561,7 +2561,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send-lenken ble kopiert", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2569,7 +2569,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogText": { - "message": "Pop out extension?", + "message": "Vil du sprette ut utvidelsen?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { @@ -2586,7 +2586,7 @@ "message": "For å velge en fil med Safari, popp ut i et nytt vindu ved å klikke på dette banneret." }, "popOut": { - "message": "Pop out" + "message": "Sprett ut" }, "sendFileCalloutHeader": { "message": "Før du starter" @@ -2607,7 +2607,7 @@ "message": "Det oppstod en feil ved lagring av slettingen og utløpsdatoene." }, "hideYourEmail": { - "message": "Hide your email address from viewers." + "message": "Skjul E-postadressen din fra seere." }, "passwordPrompt": { "message": "Forespørsel om hovedpassord på nytt" @@ -2833,14 +2833,14 @@ "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "for å unngå ytterligere datatap.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { "message": "Generer brukernavn" }, "generateEmail": { - "message": "Generate email" + "message": "Generér E-post" }, "spinboxBoundariesHint": { "message": "Verdien må være mellom $MIN$ og $MAX$.", @@ -2857,7 +2857,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Bruk minst $RECOMMENDED$ tegn for å generere et sterkt passord.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -2912,7 +2912,7 @@ "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Velg et domene som støttes av den valgte tjenesten", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -2944,7 +2944,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Ugyldig $SERVICENAME$-API-sjetong", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -2954,7 +2954,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Ugyldig $SERVICENAME$-API-sjetong: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2998,7 +2998,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Ukjent $SERVICENAME$-feil oppstod.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Et varsel er sendt til enheten din." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "nett-app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Et varsel ble sendt til enheten din" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3136,7 +3142,10 @@ "message": "Trenger du et annet alternativ?" }, "loginInitiated": { - "message": "Login initiated" + "message": "Innlogging igangsatt" + }, + "logInRequestSent": { + "message": "Forespørsel sendt" }, "exposedMasterPassword": { "message": "Eksponert hovedpassord" @@ -3196,10 +3205,10 @@ "message": "Autofill shortcut" }, "autofillKeyboardShortcutUpdateLabel": { - "message": "Change shortcut" + "message": "Endre snarvei" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Manage shortcuts" + "message": "Behandle snarveier" }, "autofillShortcut": { "message": "Auto-utfyll tastatursnarvei" @@ -3208,7 +3217,7 @@ "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "Autoutfyll-snarveien for pålogging er $COMMAND$. Håndter alle snarveiene i nettleserens innstillinger.", "placeholders": { "command": { "content": "$1", @@ -3262,16 +3271,16 @@ "message": "Oppretter en konto på" }, "checkYourEmail": { - "message": "Check your email" + "message": "Sjekk E-postinnboksen din" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "Følg lenken i E-postadressen som ble sendt til" }, "andContinueCreatingYourAccount": { "message": "and continue creating your account." }, "noEmail": { - "message": "No email?" + "message": "Ingen E-post?" }, "goBack": { "message": "Gå tilbake" @@ -3320,11 +3329,11 @@ "message": "Enheten er betrodd" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "message": "Ingen aktive Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", + "message": "Bruk Send til å dele kryptert informasjon med noen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3401,10 +3410,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 felt trenger din oppmerksomhet." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ felter trenger din oppmerksomhet.", "placeholders": { "count": { "content": "$1", @@ -3440,7 +3449,7 @@ "message": "Undermeny" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Utvid eller klapp sammen", "description": "Toggling an expand/collapse state." }, "aliasDomain": { @@ -3646,7 +3655,7 @@ "message": "Popout extension" }, "launchDuo": { - "message": "Launch Duo" + "message": "Start Duo" }, "importFormatError": { "message": "Data is not formatted correctly. Please check your import file and try again." @@ -3720,13 +3729,13 @@ "message": "Bekreft filpassord" }, "exportSuccess": { - "message": "Vault data exported" + "message": "Hvelvdataen ble eksportert" }, "typePasskey": { "message": "Passnøkkel" }, "accessing": { - "message": "Accessing" + "message": "Logger inn på" }, "loggedInExclamation": { "message": "Innlogget!" @@ -3756,7 +3765,7 @@ "message": "No matching logins for this site" }, "searchSavePasskeyNewLogin": { - "message": "Search or save passkey as new login" + "message": "Søk eller lagre passnøkkelen som en ny innlogging" }, "confirm": { "message": "Bekreft" @@ -3774,7 +3783,7 @@ "message": "Choose a passkey to log in with" }, "passkeyItem": { - "message": "Passkey Item" + "message": "Passkode-gjenstand" }, "overwritePasskey": { "message": "Overwrite passkey?" @@ -3921,7 +3930,7 @@ "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { - "message": "Continue to Help Center?", + "message": "Vil du fortsette til Hjelpesenteret?", "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { @@ -3941,7 +3950,7 @@ "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { - "message": "Make Bitwarden your default password manager?", + "message": "Vil du sette Bitwarden som din standard passordbehandler?", "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutofillDescription": { @@ -3994,10 +4003,10 @@ "message": "Passkey removed" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Autoutfyllingsforslag" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Foreslåtte gjenstander" }, "autofillSuggestionsTip": { "message": "Save a login item for this site to autofill" @@ -4012,7 +4021,7 @@ "message": "Clear filters or try another search term" }, "copyInfoTitle": { - "message": "Copy info - $ITEMNAME$", + "message": "Kopiér info - $ITEMNAME$", "description": "Title for a button that opens a menu with options to copy information from an item.", "placeholders": { "itemname": { @@ -4022,7 +4031,7 @@ } }, "copyNoteTitle": { - "message": "Copy Note - $ITEMNAME$", + "message": "Kopiér notat - $ITEMNAME$", "description": "Title for a button copies a note to the clipboard.", "placeholders": { "itemname": { @@ -4072,7 +4081,7 @@ } }, "noValuesToCopy": { - "message": "No values to copy" + "message": "Ingen verdier å kopiere" }, "assignToCollections": { "message": "Legg til i samlinger" @@ -4081,10 +4090,10 @@ "message": "Copy email" }, "copyPhone": { - "message": "Copy phone" + "message": "Kopiér telefonnummer" }, "copyAddress": { - "message": "Copy address" + "message": "Kopiér adresse" }, "adminConsole": { "message": "Admin Console" @@ -4146,15 +4155,6 @@ "itemName": { "message": "Gjenstandens navn" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4178,13 +4178,13 @@ "message": "Nyligst redigert" }, "ownerYou": { - "message": "Owner: You" + "message": "Eier: Du" }, "linked": { "message": "Tilknyttet" }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiering lyktes" }, "upload": { "message": "Last opp" @@ -4196,7 +4196,7 @@ "message": "Maksimal filstørrelse er 500 MB" }, "deleteAttachmentName": { - "message": "Delete attachment $NAME$", + "message": "Slett $NAME$-vedlegget", "placeholders": { "name": { "content": "$1", @@ -4272,10 +4272,10 @@ "message": "Autoutfyllings-innstillinger" }, "websiteUri": { - "message": "Website (URI)" + "message": "Nettsted (URİ)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Nettsted (URİ) $COUNT$", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -4403,7 +4403,7 @@ "message": "Feltetikett" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Bruk tekstfelter for data som sikkerhetsspørsmål" }, "hiddenHelpText": { "message": "Use hidden fields for sensitive data like a password" @@ -4421,7 +4421,7 @@ "message": "Rediger felt" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Rediger $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4474,7 +4474,7 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Velg samlinger å tilordne" }, "personalItemTransferWarningSingular": { "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." @@ -4514,10 +4514,10 @@ "message": "Successfully assigned collections" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Du har ikke valgt noe." }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "De valgte gjenstandene ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4526,7 +4526,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Gjenstandene ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4535,7 +4535,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Gjenstanden ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4576,13 +4576,13 @@ "message": "Text Sends" }, "accountActions": { - "message": "Account actions" + "message": "Kontohandlinger" }, "showNumberOfAutofillSuggestions": { "message": "Show number of login autofill suggestions on extension icon" }, "showQuickCopyActions": { - "message": "Show quick copy actions on Vault" + "message": "Vis hurtigkopieringshandlinger i hvelvet" }, "systemDefault": { "message": "Systemforvalg" @@ -4618,7 +4618,7 @@ "message": "Prøv igjen" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Minste egendefinerte tidsavbrudd er 1 minutt." }, "additionalContentAvailable": { "message": "Ytterligere innhold er tilgjengelig" @@ -4639,10 +4639,10 @@ "message": "Ingen gjenstander i papirkurven" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Gjenstander du sletter, vises her og slettes permanent etter 30 dager" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "Gjenstander som har ligget i papirkurven i mer enn 30 dager, blir automatisk slettet" }, "restore": { "message": "Gjenopprett" @@ -4657,7 +4657,7 @@ "message": "Biometric unlock is unavailable because PIN or password unlock is required first." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrisk opplåsing er utilgjengelig for øyeblikket." }, "biometricsStatusHelptextAutoSetupNeeded": { "message": "Biometric unlock is unavailable due to misconfigured system files." @@ -4684,11 +4684,11 @@ "message": "Autentiserer" }, "fillGeneratedPassword": { - "message": "Fill generated password", + "message": "Fyll inn generert passord", "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Password regenerated", + "message": "Passord ble generert på nytt", "description": "Notification message for when a password has been regenerated" }, "saveLoginToBitwarden": { @@ -4855,7 +4855,7 @@ "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." }, "remindMeLater": { - "message": "Remind me later" + "message": "Minn meg på det senere" }, "newDeviceVerificationNoticePageOneFormContent": { "message": "Do you have reliable access to your email, $EMAIL$?", @@ -4873,7 +4873,7 @@ "message": "Yes, I can reliably access my email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Slå på 2-trinnsinnlogging" }, "changeAcctEmail": { "message": "Endre kontoens E-postadresse" @@ -4887,10 +4887,19 @@ "extraWide": { "message": "Ekstra bred" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Vennligst oppdater skrivebordsprogrammet ditt" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "For å bruke biometrisk opplåsing, må du oppdatere skrivebordsprogrammet eller skru av fingeravtrykksopplåsing i skrivebordsinnstillingene." } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index eb44a6806d1..800523bdc2e 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 46dc3e1166d..076c35732c0 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Er is een melding naar je apparaat verzonden." }, + "notificationSentDevicePart1": { + "message": "Ontgrendel Bitwarden op je apparaat of op de" + }, + "notificationSentDeviceAnchor": { + "message": "webapp" + }, + "notificationSentDevicePart2": { + "message": "Zorg ervoor dat de Vingerafdrukzin overeenkomt met de onderstaande voor je deze goedkeurt." + }, "aNotificationWasSentToYourDevice": { "message": "Er is een melding naar je apparaat verzonden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Zorg ervoor dat je kluis is ontgrendeld en de vingerafdrukzin hetzelfde is op het andere apparaat" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Je krijgt een melding zodra de aanvraag is goedgekeurd" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Inloggen gestart" }, + "logInRequestSent": { + "message": "Verzoek verzonden" + }, "exposedMasterPassword": { "message": "Gelekt hoofdwachtwoord" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Itemnaam" }, - "cannotRemoveViewOnlyCollections": { - "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organisatie is gedeactiveerd" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra breed" }, + "cannotRemoveViewOnlyCollections": { + "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Werk je desktopapplicatie bij" }, diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index eb44a6806d1..800523bdc2e 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index eb44a6806d1..800523bdc2e 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 8d8f38603c5..232ec85c80a 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -23,7 +23,7 @@ "message": "Nowy użytkownik Bitwarden?" }, "logInWithPasskey": { - "message": "Zaloguj się używając passkey" + "message": "Zaloguj się używając klucza dostępu" }, "useSingleSignOn": { "message": "Użyj jednokrotnego logowania" @@ -120,7 +120,7 @@ "message": "Kopiuj hasło" }, "copyPassphrase": { - "message": "Kopiuj frazę bezpieczeństwa" + "message": "Skopiuj hasło wyrazowe" }, "copyNote": { "message": "Kopiuj notatkę" @@ -147,7 +147,7 @@ "message": "Kopiuj numer PESEL" }, "copyPassportNumber": { - "message": "Kopiuj numer paszportu" + "message": "Skopiuj numer paszportu" }, "copyLicenseNumber": { "message": "Kopiuj numer licencji" @@ -443,19 +443,19 @@ "message": "Wygeneruj hasło" }, "generatePassphrase": { - "message": "Wygenruj frazę zabezpieczającą" + "message": "Wygeneruj hasło wyrazowe" }, "passwordGenerated": { - "message": "Password generated" + "message": "Hasło zostało wygenerowane" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Hasło wyrazowe zostało wygenerowane" }, "usernameGenerated": { - "message": "Username generated" + "message": "Nazwa użytkownika została wygenerowana" }, "emailGenerated": { - "message": "Email generated" + "message": "E-mail został wygenerowany" }, "regeneratePassword": { "message": "Wygeneruj ponownie hasło" @@ -660,10 +660,10 @@ "message": "Zweryfikuj tożsamość" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Kontynuuj logowanie" }, "yourVaultIsLocked": { "message": "Sejf jest zablokowany. Zweryfikuj swoją tożsamość, aby kontynuować." @@ -806,7 +806,7 @@ "message": "Zalogowałeś się pomyślnie" }, "youMayCloseThisWindow": { - "message": "Możesz zamknąć to okno." + "message": "Możesz zamknąć to okno" }, "masterPassSent": { "message": "Wysłaliśmy Tobie wiadomość e-mail z podpowiedzią do hasła głównego." @@ -1005,7 +1005,7 @@ "message": "Poproś o dodanie elementu, jeśli nie zostanie znaleziony w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Zawsze pokazuj karty jako sugestie autouzupełniania w widoku sejfu" }, "showCardsCurrentTab": { "message": "Pokaż karty na stronie głównej" @@ -1014,7 +1014,7 @@ "message": "Pokaż elementy karty na stronie głównej, aby ułatwić autouzupełnianie." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Zawsze pokazuj tożsamości jako sugestie autouzupełniania w widoku sejfu" }, "showIdentitiesCurrentTab": { "message": "Pokaż tożsamości na stronie głównej" @@ -1049,10 +1049,10 @@ "message": "Poproś o aktualizację hasła, gdy zmiana zostanie wykryta na stronie. Dotyczy wszystkich zalogowanych kont." }, "enableUsePasskeys": { - "message": "Pytaj o zapisywanie i używanie passkey" + "message": "Pytaj o zapisywanie i używanie kluczy dostępu" }, "usePasskeysDesc": { - "message": "Pytaj o zapisywanie nowych passkey albo danych logowania z passkey w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." + "message": "Pytaj o zapisywanie nowych kluczy dostępu albo danych logowania z kluczy w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." }, "notificationChangeDesc": { "message": "Czy chcesz zaktualizować to hasło w Bitwarden?" @@ -1073,7 +1073,7 @@ "message": "Pokaż opcje menu kontekstowego" }, "contextMenuItemDesc": { - "message": "Użyj drugiego kliknięcia, aby uzyskać dostęp do generowania haseł i pasujących danych logowania do witryny. " + "message": "Użyj drugiego kliknięcia, aby uzyskać dostęp do generowania haseł i pasujących danych logowania do witryny." }, "contextMenuItemDescAlt": { "message": "Użyj drugiego kliknięcia, aby uzyskać dostęp do generowania haseł i pasujących danych logowania do witryny. Dotyczy wszystkich zalogowanych kont." @@ -1493,7 +1493,7 @@ "message": "Pokazuj karty jako sugestie" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Wyświetlaj sugestie kiedy ikona jest zaznaczona" + "message": "Wyświetlaj sugestie, kiedy ikona jest zaznaczona" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "Dotyczy wszystkich zalogowanych kont." @@ -1538,7 +1538,7 @@ "message": "Domyślne ustawienie autouzupełniania" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Po włączeniu autouzupełnianiu po załadowaniu strony, możesz włączyć lub wyłączyć tę funkcję dla poszczególnych wpisów." + "message": "Po włączeniu autouzupełnianiu po załadowaniu strony możesz włączyć lub wyłączyć tę funkcję dla poszczególnych wpisów." }, "itemAutoFillOnPageLoad": { "message": "Automatycznie uzupełniaj po załadowaniu strony (jeśli włączono w opcjach)" @@ -2062,7 +2062,7 @@ "message": "Generator nazw użytkownika" }, "useThisEmail": { - "message": "Use this email" + "message": "Użyj tego adresu e-mail" }, "useThisPassword": { "message": "Użyj tego hasła" @@ -2132,7 +2132,7 @@ "message": "URI został zapisany i automatycznie uzupełniony" }, "autoFillSuccess": { - "message": "Element został automatycznie uzupełniony" + "message": "Element został automatycznie uzupełniony " }, "insecurePageWarning": { "message": "Ostrzeżenie: Jest to niezabezpieczona strona HTTP i wszelkie przekazane informacje mogą być potencjalnie widoczne i zmienione przez innych. Ten login został pierwotnie zapisany na stronie bezpiecznej (HTTPS)." @@ -2141,7 +2141,7 @@ "message": "Nadal chcesz uzupełnić ten login?" }, "autofillIframeWarning": { - "message": "Formularz jest hostowany przez inną domenę niż zapisany adres URI dla tego loginu. Wybierz OK, aby i tak automatycznie wypełnić lub anuluj aby zatrzymać." + "message": "Formularz jest hostowany przez inną domenę niż zapisany adres URI dla tego loginu. Wybierz OK, aby i tak automatycznie wypełnić lub anuluj, aby zatrzymać." }, "autofillIframeWarningTip": { "message": "Aby zapobiec temu ostrzeżeniu w przyszłości, zapisz ten URI, $HOSTNAME$, dla tej witryny.", @@ -2285,7 +2285,7 @@ "message": "Klucz biometryczny jest niepoprawny" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Odblokowanie biometryczne nie powiodło się. Sekretny klucz biometryczny nie odblokował sejfu. Spróbuj skonfigurować biometrię ponownie." + "message": "Odblokowanie biometryczne się nie powiodło. Sekretny klucz biometryczny nie odblokował sejfu. Spróbuj skonfigurować biometrię ponownie." }, "biometricsNotEnabledTitle": { "message": "Dane biometryczne są wyłączone" @@ -2355,7 +2355,7 @@ "message": "Aplikacja Bitwarden nie będzie proponować zapisywania danych logowania dla tych domen dla wszystkich zalogowanych kont. Musisz odświeżyć stronę, aby zastosowywać zmiany." }, "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": "Autouzupełnianie i inne powiązane funkcje nie będą oferowane dla tych stron. Aby zmiany zaczęły obowiązywać, musisz odświeżyć stronę." }, "autofillBlockedNoticeV2": { "message": "Autouzupełnianie jest zablokowane dla tej witryny." @@ -2573,7 +2573,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { - "message": "To create a file Send, you need to pop out the extension to a new window.", + "message": "Aby utworzyć plik Send, musisz wysunąć rozszerzenie do nowego okna.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -2829,11 +2829,11 @@ "message": "Bitwarden nie mógł odszyfrować elementów sejfu wymienionych poniżej." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Skontaktuj się z działem obsługi klienta,", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "aby uniknąć dalszej utraty danych.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Powiadomienie zostało wysłane na urządzenie." }, + "notificationSentDevicePart1": { + "message": "Odblokuj Bitwarden na swoim urządzeniu lub w" + }, + "notificationSentDeviceAnchor": { + "message": "aplikacji internetowej" + }, + "notificationSentDevicePart2": { + "message": "Upewnij się, że fraza odcisku palca zgadza się z tą poniżej, zanim zatwierdzisz." + }, "aNotificationWasSentToYourDevice": { "message": "Powiadomienie zostało wysłane na twoje urządzenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Upewnij się, że Twoje konto jest odblokowane, a unikalny identyfikator konta pasuje do drugiego urządzenia" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Zostaniesz powiadomiony po zatwierdzeniu prośby" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Logowanie rozpoczęte" }, + "logInRequestSent": { + "message": "Żądanie wysłane" + }, "exposedMasterPassword": { "message": "Ujawnione hasło główne" }, @@ -3169,7 +3178,7 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Twoja organizacji włączyła autouzupełnianie podczas wczytywania strony." + "message": "Twoja organizacja włączyła autouzupełnianie podczas wczytywania strony." }, "howToAutofill": { "message": "Jak autouzupełniać" @@ -3244,7 +3253,7 @@ "message": "Zapamiętaj to urządzenie" }, "uncheckIfPublicDevice": { - "message": "Odznacz jeśli używasz publicznego urządzenia" + "message": "Odznacz, jeśli używasz publicznego urządzenia" }, "approveFromYourOtherDevice": { "message": "Zatwierdź z innego twojego urządzenia" @@ -3447,7 +3456,7 @@ "message": "Domena aliasu" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Elementy z pytaniem o hasło głównege nie mogą być automatycznie wypełniane przy wczytywaniu strony. Automatyczne wypełnianie po wczytywania strony zostało wyłączone.", + "message": "Elementy z pytaniem o hasło główne nie mogą być autouzupełniane przy wczytywaniu strony. Autouzupełnianie podczas wczytywania strony zostało wyłączone.", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { @@ -3493,7 +3502,7 @@ "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { - "message": "Time-based One-Time Password Verification Code", + "message": "Kod weryfikacyjny jednorazowego hasła oparty na czasie", "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { @@ -3723,7 +3732,7 @@ "message": "Dane sejfu zostały wyeksportowane" }, "typePasskey": { - "message": "Passkey" + "message": "Klucz dostępu" }, "accessing": { "message": "Uzyskiwanie dostępu" @@ -3732,22 +3741,22 @@ "message": "Zalogowano!" }, "passkeyNotCopied": { - "message": "Passkey nie zostanie skopiowany" + "message": "Klucz dostępu nie zostanie skopiowany" }, "passkeyNotCopiedAlert": { - "message": "Passkey nie zostanie skopiowane do sklonowanego elementu. Czy chcesz kontynuować klonowanie tego elementu?" + "message": "Klucz dostępu nie zostanie skopiowany do sklonowanego elementu. Czy chcesz kontynuować klonowanie tego elementu?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "message": "Weryfikacja jest wymagana przez stronę inicjującą. Ta funkcja nie jest jeszcze zaimplementowana dla kont bez hasła głównego." }, "logInWithPasskeyQuestion": { - "message": "Zaloguj się za pomocą passkey?" + "message": "Zalogować za pomocą klucza dostępu?" }, "passkeyAlreadyExists": { - "message": "Passkey już istnieje dla tej aplikacji." + "message": "Klucz dostępu już istnieje dla tej aplikacji." }, "noPasskeysFoundForThisApplication": { - "message": "Nie znaleziono passkey'a dla tej aplikacji." + "message": "Nie znaleziono klucza dostępu dla tej aplikacji." }, "noMatchingPasskeyLogin": { "message": "Nie masz pasujących danych logowania do tej witryny." @@ -3756,37 +3765,37 @@ "message": "Brak pasujących loginów dla tej witryny" }, "searchSavePasskeyNewLogin": { - "message": "Wyszukaj alb zapisz passkey jako nowy login" + "message": "Wyszukaj albo zapisz klucz dostępu jako nowy login" }, "confirm": { "message": "Potwierdź" }, "savePasskey": { - "message": "Zapisz passkey" + "message": "Zapisz klucz dostępu" }, "savePasskeyNewLogin": { - "message": "Zapisz passkey jako nowe dane logowania" + "message": "Zapisz klucz dostępu jako nowe dane logowania" }, "chooseCipherForPasskeySave": { - "message": "Wybierz dane logowania do których przypisać passkey" + "message": "Wybierz dane logowania, do których przypisać klucz dostępu" }, "chooseCipherForPasskeyAuth": { - "message": "Wybierz passkey żeby się zalogować" + "message": "Wybierz klucz dostępu, żeby się zalogować" }, "passkeyItem": { - "message": "Element Passkey" + "message": "Element klucza dostępu" }, "overwritePasskey": { - "message": "Zastąpić passkey?" + "message": "Zastąpić klucz dostępu?" }, "overwritePasskeyAlert": { - "message": "Ten element zawiera już passkey. Czy na pewno chcesz nadpisać bieżący passkey?" + "message": "Ten element zawiera już klucz dostępu. Czy na pewno chcesz nadpisać bieżący klucza dostępu?" }, "featureNotSupported": { "message": "Funkcja nie jest jeszcze obsługiwana" }, "yourPasskeyIsLocked": { - "message": "Wymagane uwierzytelnienie aby używać passkey. Sprawdź swoją tożsamość, aby kontynuować." + "message": "Wymagane uwierzytelnienie, aby używać klucza dostępu. Sprawdź swoją tożsamość, aby kontynuować." }, "multifactorAuthenticationCancelled": { "message": "Uwierzytelnianie wieloskładnikowe zostało anulowane" @@ -3988,10 +3997,10 @@ "message": "Sukces" }, "removePasskey": { - "message": "Usuń passkey" + "message": "Usuń klucz dostępu" }, "passkeyRemoved": { - "message": "Passkey został usunięty" + "message": "Klucz dostępu został usunięty" }, "autofillSuggestions": { "message": "Sugestie autouzupełniania" @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nazwa elementu" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organizacja jest wyłączona" }, @@ -4358,7 +4358,7 @@ "message": "Dane" }, "passkeys": { - "message": "Passkeys", + "message": "Klucze dostępu", "description": "A section header for a list of passkeys." }, "passwords": { @@ -4366,7 +4366,7 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Zaloguj się za pomocą passkey", + "message": "Zaloguj się za pomocą klucza dostępu", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4448,7 +4448,7 @@ } }, "reorderToggleButton": { - "message": "Zmień kolejność $LABEL$. Użyj klawiszy że strzałkami aby przenieść element w górę lub w dół.", + "message": "Zmień kolejność $LABEL$. Użyj klawiszy ze strzałkami, aby przenieść element w górę lub w dół.", "placeholders": { "label": { "content": "$1", @@ -4564,16 +4564,16 @@ "message": "Lokalizacja elementu" }, "fileSend": { - "message": "File Send" + "message": "Wysyłka pliku" }, "fileSends": { - "message": "File Sends" + "message": "Wysyłki plików" }, "textSend": { - "message": "Text Send" + "message": "Wysyłka tekstu" }, "textSends": { - "message": "Text Sends" + "message": "Wysyłki tekstów" }, "accountActions": { "message": "Akcje konta" @@ -4704,7 +4704,7 @@ "description": "Represents the ~ key in screen reader content as a readable word" }, "backtickCharacterDescriptor": { - "message": "Backtick", + "message": "Grawis", "description": "Represents the ` key in screen reader content as a readable word" }, "exclamationCharacterDescriptor": { @@ -4728,7 +4728,7 @@ "description": "Represents the % key in screen reader content as a readable word" }, "caretCharacterDescriptor": { - "message": "Caret", + "message": "Daszek", "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { @@ -4784,7 +4784,7 @@ "description": "Represents the | key in screen reader content as a readable word" }, "backSlashCharacterDescriptor": { - "message": "Back slash", + "message": "Ukośnik wsteczny", "description": "Represents the back slash key in screen reader content as a readable word" }, "colonCharacterDescriptor": { @@ -4824,7 +4824,7 @@ "description": "Represents the ? key in screen reader content as a readable word" }, "forwardSlashCharacterDescriptor": { - "message": "Forward slash", + "message": "Ukośnik prawy", "description": "Represents the / key in screen reader content as a readable word" }, "lowercaseAriaLabel": { @@ -4852,7 +4852,7 @@ "message": "Bitwarden wyśle kod na Twój adres e-mail w celu zweryfikowania logowania z nowych urządzeń, począwszy od lutego 2025 r." }, "newDeviceVerificationNoticeContentPage2": { - "message": "Możesz skonfigurować dwustopniowe logowanie jako alternatywny sposób ochrony konta lub zmienić swój adres e-mail do którego masz dostęp." + "message": "Możesz skonfigurować dwustopniowe logowanie jako alternatywny sposób ochrony konta lub zmienić swój adres e-mail, do którego masz dostęp." }, "remindMeLater": { "message": "Przypomnij mi później" @@ -4887,10 +4887,19 @@ "extraWide": { "message": "Bardzo szerokie" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Zaktualizuj aplikację na komputer" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Aby używać odblokowywania biometrycznego, zaktualizuj aplikację na komputerze lub wyłącz odblokowywanie odciskiem palca w ustawieniach aplikacji na komputerze." } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 2de90042386..a383a450358 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para o seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se que sua conta esteja desbloqueada e que a frase de identificação corresponda à do outro dispositivo" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Você será notificado assim que a requisição for aprovada" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login iniciado" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Senha mestra comprometida" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nome do item" }, - "cannotRemoveViewOnlyCollections": { - "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "A organização está desativada" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra Grande" }, + "cannotRemoveViewOnlyCollections": { + "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 706e39bff9a..da0f34a1166 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -296,7 +296,7 @@ "message": "Continuar para a loja de extensões do navegador?" }, "continueToBrowserExtensionStoreDesc": { - "message": "Ajude outras pessoas a descobrir se o Bitwarden lhes é adequado. Visite a loja de extensões do seu navegador e deixe uma avaliação agora." + "message": "Ajude outras pessoas a descobrir se o Bitwarden lhes é adequado. Visite a loja de extensões do seu navegador e deixe uma classificação agora." }, "changeMasterPasswordOnWebConfirmation": { "message": "Pode alterar a sua palavra-passe mestra na aplicação Web Bitwarden." @@ -340,7 +340,7 @@ "message": "Gestor de Segredos Bitwarden" }, "continueToSecretsManagerPageDesc": { - "message": "Armazene, gira e partilhe segredos de programador de forma segura com o Gestor de Segredos Bitwarden. Saiba mais no site bitwarden.com." + "message": "Armazene, faça a gestão e partilhe de forma segura os segredos dos programadores com o Gestor de Segredos Bitwarden. Saiba mais no site bitwarden.com." }, "passwordlessDotDev": { "message": "Passwordless.dev" @@ -379,7 +379,7 @@ "message": "Nome da pasta" }, "folderHintText": { - "message": "Aninhe uma pasta adicionando o nome da pasta principal seguido de um \"/\". Exemplo: Redes Sociais/Fóruns" + "message": "Crie uma subpasta adicionando o nome da pasta principal seguido de um \"/\". Exemplo: Redes Sociais/Fóruns" }, "noFoldersAdded": { "message": "Nenhuma pasta adicionada" @@ -651,7 +651,7 @@ "message": "Outras opções" }, "rateExtension": { - "message": "Avaliar a extensão" + "message": "Classificar a extensão" }, "browserNotSupportClipboard": { "message": "O seu navegador Web não suporta a cópia fácil da área de transferência. Em vez disso, copie manualmente." @@ -1598,7 +1598,7 @@ "message": "Booleano" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Caixa de verificação" }, "cfTypeLinked": { "message": "Associado", @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Foi enviada uma notificação para o seu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " + }, + "notificationSentDeviceAnchor": { + "message": "aplicação web" + }, + "notificationSentDevicePart2": { + "message": "Certifique-se de que a frase da impressão digital corresponde à frase abaixo indicada antes de a aprovar." + }, "aNotificationWasSentToYourDevice": { "message": "Foi enviada uma notificação para o seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se de que a sua conta está desbloqueada e que a frase de impressão digital corresponde à do outro dispositivo" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Será notificado quando o pedido for aprovado" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "A preparar o início de sessão" }, + "logInRequestSent": { + "message": "Pedido enviado" + }, "exposedMasterPassword": { "message": "Palavra-passe mestra exposta" }, @@ -3208,7 +3217,7 @@ "message": "O atalho de preenchimento automático de credenciais não está definido. Altere-o nas definições do navegador." }, "autofillLoginShortcutText": { - "message": "O atalho de preenchimento automático de credenciais é $COMMAND$. Gira todos os atalhos nas definidções do navegador.", + "message": "O atalho de preenchimento automático de credenciais é $COMMAND$. Organize todos os atalhos nas definições do navegador.", "placeholders": { "command": { "content": "$1", @@ -4146,15 +4155,6 @@ "itemName": { "message": "Nome do item" }, - "cannotRemoveViewOnlyCollections": { - "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "A organização está desativada" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Muito ampla" }, + "cannotRemoveViewOnlyCollections": { + "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Por favor, atualize a sua aplicação para computador" }, diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 966d2b4e01d..32cb0215916 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "O notificare a fost trimisă pe dispozitivul dvs." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Conectare inițiată" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Parolă principală compromisă" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index f0e3b53bfb2..8d390e83332 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "На ваше устройство отправлено уведомление." }, + "notificationSentDevicePart1": { + "message": "Разблокируйте Bitwarden на своем устройстве или" + }, + "notificationSentDeviceAnchor": { + "message": "веб-приложении" + }, + "notificationSentDevicePart2": { + "message": "Перед одобрением убедитесь, что фраза отпечатка совпадает с приведенной ниже." + }, "aNotificationWasSentToYourDevice": { "message": "На ваше устройство было отправлено уведомление" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Убедитесь, что ваш аккаунт разблокирован и фраза отпечатка совпадает с фразой на другом устройстве" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Вы получите уведомление, когда запрос будет одобрен" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Вход инициирован" }, + "logInRequestSent": { + "message": "Запрос отправлен" + }, "exposedMasterPassword": { "message": "Мастер-пароль скомпрометирован" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Название элемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Организация деактивирована" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Очень широкое" }, + "cannotRemoveViewOnlyCollections": { + "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Пожалуйста, обновите приложение для компьютера" }, diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 9bd2006f1b2..bda76601e90 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index d8bbe1645fa..f2b50505e8a 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -2902,7 +2902,7 @@ "message": "Služba" }, "forwardedEmail": { - "message": "Alias preposlaného e-mailu" + "message": "Alias presmerovaného e-mailu" }, "forwardedEmailDesc": { "message": "Vytvoriť e-mailový alias pomocou externej služby preposielania." @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie." }, + "notificationSentDevicePart1": { + "message": "Odomknúť Bitwarden vo svojom zariadení alebo vo" + }, + "notificationSentDeviceAnchor": { + "message": "webovej aplikácii" + }, + "notificationSentDevicePart2": { + "message": "Pred schválením sa uistite, že sa odtlačok prístupovej frázy zhoduje s tou uvedenou nižšie." + }, "aNotificationWasSentToYourDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Uistite sa, že je váš účet odomknutý a fráza odtlačku prsta sa zhoduje s frázou na druhom zariadení" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Po schválení žiadosti budete informovaní" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Iniciované prihlásenie" }, + "logInRequestSent": { + "message": "Požiadavka bola odoslaná" + }, "exposedMasterPassword": { "message": "Odhalené hlavné heslo" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Názov položky" }, - "cannotRemoveViewOnlyCollections": { - "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organizácia je vypnutá" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra široké" }, + "cannotRemoveViewOnlyCollections": { + "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Aktualizujte desktopovú aplikáciu" }, diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index d533c3e02dc..cbff6df98c2 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 3cf637b21f1..cb143049ca3 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -2062,7 +2062,7 @@ "message": "Генератор корисничког имена" }, "useThisEmail": { - "message": "Use this email" + "message": "Користи ову епошту" }, "useThisPassword": { "message": "Употреби ову лозинку" @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Обавештење је послато на ваш уређај." }, + "notificationSentDevicePart1": { + "message": "Откључај Bitwarden на твом уређају или на" + }, + "notificationSentDeviceAnchor": { + "message": "веб апликација" + }, + "notificationSentDevicePart2": { + "message": "Потврдите да се фраза отиска прста поклапа са овом испод пре одобравања." + }, "aNotificationWasSentToYourDevice": { "message": "Обавештење је послато на ваш уређај" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверите се да је ваш налог откључан и да се фраза отиска подудара на другом уређају" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Бићете обавештени када захтев буде одобрен" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Пријава је покренута" }, + "logInRequestSent": { + "message": "Захтев је послат" + }, "exposedMasterPassword": { "message": "Изложена главна лозинка" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Име ставке" }, - "cannotRemoveViewOnlyCollections": { - "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Организација је деактивирана" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Врло широко" }, + "cannotRemoveViewOnlyCollections": { + "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Молим вас надоградите вашу апликацију на рачунару" }, diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index c999454fa9d..727326e1cd6 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "En avisering har skickats till din enhet." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Inloggning påbörjad" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Huvudlösenordet har exponerats" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Objektnamn" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index eb44a6806d1..800523bdc2e 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 991fc80f6d6..04775fa0f91 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Organization is deactivated" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index e54944e8222..b6d54e96ecf 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Cihazınıza bir bildirim gönderildi." }, + "notificationSentDevicePart1": { + "message": "Bitwarden kilidini cihazınızdan veya" + }, + "notificationSentDeviceAnchor": { + "message": "web uygulamasından açın" + }, + "notificationSentDevicePart2": { + "message": "Onay vermeden önce parmak izi ifadesinin aşağıdakiyle eşleştiğini kontrol edin." + }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildirim gönderildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lütfen hesabınızın kilidinin açık olduğundan ve parmak izi ifadesinin diğer cihazla eşleştiğinden emin olun" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "İsteğiniz onaylanınca size haber vereceğiz" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Giriş başlatıldı" }, + "logInRequestSent": { + "message": "İstek gönderildi" + }, "exposedMasterPassword": { "message": "Açığa Çıkmış Ana Parola" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Kayıt adı" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Kuruluş pasifleştirilmiş" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Ekstra geniş" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Lütfen masaüstü uygulamanızı güncelleyin" }, diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index dfc8f700352..9c9041dd008 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Сповіщення було надіслано на ваш пристрій." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Сповіщення надіслано на ваш пристрій" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Переконайтеся, що ваш обліковий запис розблоковано і фраза відбитка на іншому пристрої збігається" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Після схвалення запиту ви отримаєте сповіщення" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Ініційовано вхід" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Головний пароль викрито" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Назва запису" }, - "cannotRemoveViewOnlyCollections": { - "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Організацію деактивовано" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Дуже широке" }, + "cannotRemoveViewOnlyCollections": { + "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Оновіть свою комп'ютерну програму" }, diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 9394ebdc8d7..b398b43bab3 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "Một thông báo đã được gửi đến thiết bị của bạn." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "You will be notified once the request is approved" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "Bắt đầu đăng nhập" }, + "logInRequestSent": { + "message": "Request sent" + }, "exposedMasterPassword": { "message": "Mật khẩu chính bị lộ" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "Tên mục" }, - "cannotRemoveViewOnlyCollections": { - "message": "Bạn không thể xóa các bộ sưu tập với quyền chỉ xem: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "Tổ chức không còn hoạt động" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "Extra wide" }, + "cannotRemoveViewOnlyCollections": { + "message": "Bạn không thể xóa các bộ sưu tập với quyền chỉ xem: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "Please update your desktop application" }, diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index cc0cc7b8bd2..78783b63729 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -379,7 +379,7 @@ "message": "文件夹名称" }, "folderHintText": { - "message": "通过在父文件夹名后面跟随「/」来嵌套文件夹。示例:Social/Forums" + "message": "通过在父文件夹名后面添加「/」来嵌套文件夹。示例:Social/Forums" }, "noFoldersAdded": { "message": "未添加文件夹" @@ -591,7 +591,7 @@ "message": "私密备注" }, "note": { - "message": "备注" + "message": "笔记" }, "editItem": { "message": "编辑项目" @@ -2062,7 +2062,7 @@ "message": "用户名生成器" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此电子邮箱" }, "useThisPassword": { "message": "使用此密码" @@ -2664,7 +2664,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", @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "通知已发送到您的设备。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "网页 App" + }, + "notificationSentDevicePart2": { + "message": "在批准前,请确保指纹短语与下面的一致。" + }, "aNotificationWasSentToYourDevice": { "message": "通知已发送到您的设备" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "确保您的账户已解锁,并且指纹短语与其他设备上的相匹配。" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "请求获得批准后,您将收到通知" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "登录已发起" }, + "logInRequestSent": { + "message": "请求已发送" + }, "exposedMasterPassword": { "message": "已暴露的主密码" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "项目名称" }, - "cannotRemoveViewOnlyCollections": { - "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "组织已停用" }, @@ -4226,7 +4226,7 @@ "message": "筛选" }, "filterVault": { - "message": "密码库筛选" + "message": "筛选密码库" }, "filterApplied": { "message": "已应用一个筛选" @@ -4887,6 +4887,15 @@ "extraWide": { "message": "超宽" }, + "cannotRemoveViewOnlyCollections": { + "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "请更新您的桌面应用程序" }, diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index f9ef4d56a49..30351228927 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -35,7 +35,7 @@ "message": "設定一個強密碼" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "設定密碼以完成創建您的帳戶。" + "message": "設定密碼以完成建立您的帳號" }, "enterpriseSingleSignOn": { "message": "企業單一登入" @@ -763,7 +763,7 @@ "message": "若您忘記主密碼,將會無法找回!" }, "masterPassHintLabel": { - "message": "您已成功創建新帳戶!" + "message": "主密碼提示" }, "errorOccurred": { "message": "發生錯誤" @@ -797,7 +797,7 @@ "message": "帳戶已建立!現在可以登入了。" }, "newAccountCreated2": { - "message": "您已成功創建新帳戶!" + "message": "您已成功建立新帳號!" }, "youHaveBeenLoggedIn": { "message": "你已經登入!" @@ -2062,7 +2062,7 @@ "message": "使用者名稱產生器" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此電子郵件" }, "useThisPassword": { "message": "使用此密碼" @@ -2529,7 +2529,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send 創建成功!", + "message": "Send 建立成功!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { @@ -3123,12 +3123,18 @@ "notificationSentDevice": { "message": "已傳送通知至您的裝置。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the" + }, + "notificationSentDeviceAnchor": { + "message": "網頁應用程式" + }, + "notificationSentDevicePart2": { + "message": "在核准前請確保您的指紋短語與下面完全相符。" + }, "aNotificationWasSentToYourDevice": { "message": "已傳送通知至您的裝置" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "請確保您的帳號已解鎖,並且指紋短語與其他裝置一致。" - }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "一旦您的請求被通過,您會獲得通知。" }, @@ -3138,6 +3144,9 @@ "loginInitiated": { "message": "登入已啟動" }, + "logInRequestSent": { + "message": "已傳送請求" + }, "exposedMasterPassword": { "message": "已洩露的主密碼" }, @@ -4146,15 +4155,6 @@ "itemName": { "message": "項目名稱" }, - "cannotRemoveViewOnlyCollections": { - "message": "若您只有檢視權限,無法移除集合 $COLLECTIONS$。", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "organizationIsDeactivated": { "message": "組織已被停用" }, @@ -4887,6 +4887,15 @@ "extraWide": { "message": "更寬" }, + "cannotRemoveViewOnlyCollections": { + "message": "若您只有檢視權限,無法移除集合 $COLLECTIONS$。", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "updateDesktopAppOrDisableFingerprintDialogTitle": { "message": "請更新您的桌面應用程式" }, diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index ad3bee97d8a..a091256b28d 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -25,6 +25,7 @@ import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-stat import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; +import { buildCipherIcon } from "@bitwarden/common/vault/icon/build-cipher-icon"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; @@ -32,6 +33,7 @@ import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; import { BrowserApi } from "../../platform/browser/browser-api"; import { openAddEditVaultItemPopout } from "../../vault/popup/utils/vault-popout-window"; +import { NotificationCipherData } from "../content/components/cipher/types"; import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum"; import { AutofillService } from "../services/abstractions/autofill.service"; @@ -82,6 +84,7 @@ export default class NotificationBackground { bgGetActiveUserServerConfig: () => this.getActiveUserServerConfig(), getWebVaultUrlForNotification: () => this.getWebVaultUrl(), notificationRefreshFlagValue: () => this.getNotificationFlag(), + bgGetDecryptedCiphers: () => this.getNotificationCipherData(), }; private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); @@ -132,6 +135,40 @@ export default class NotificationBackground { return await firstValueFrom(this.domainSettingsService.neverDomains$); } + /** + * + * Gets the current active tab and retrieves all decrypted ciphers + * for the tab's URL. It constructs and returns an array of `NotificationCipherData` objects. + * If no active tab or URL is found, it returns an empty array. + * + * @returns {Promise} + */ + + async getNotificationCipherData(): Promise { + const [currentTab, showFavicons, env] = await Promise.all([ + BrowserApi.getTabFromCurrentWindow(), + firstValueFrom(this.domainSettingsService.showFavicons$), + firstValueFrom(this.environmentService.environment$), + ]); + const iconsServerUrl = env.getIconsUrl(); + const decryptedCiphers = await this.cipherService.getAllDecryptedForUrl(currentTab.url); + + return decryptedCiphers.map((view) => { + const { id, name, reprompt, favorite, login } = view; + return { + id, + name, + type: CipherType.Login, + reprompt, + favorite, + icon: buildCipherIcon(iconsServerUrl, view, showFavicons), + login: login && { + username: login.username, + }, + }; + }); + } + /** * Gets the active user server config from the config service. */ diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-info.ts b/apps/browser/src/autofill/content/components/cipher/cipher-info.ts index de374b44a97..6ff32353938 100644 --- a/apps/browser/src/autofill/content/components/cipher/cipher-info.ts +++ b/apps/browser/src/autofill/content/components/cipher/cipher-info.ts @@ -6,10 +6,10 @@ import { Theme } from "@bitwarden/common/platform/enums"; import { themes, typography } from "../../../content/components/constants/styles"; import { CipherInfoIndicatorIcons } from "./cipher-indicator-icons"; -import { CipherData } from "./types"; +import { NotificationCipherData } from "./types"; // @TODO support other cipher types (card, identity, notes, etc) -export function CipherInfo({ cipher, theme }: { cipher: CipherData; theme: Theme }) { +export function CipherInfo({ cipher, theme }: { cipher: NotificationCipherData; theme: Theme }) { const { name, login } = cipher; return html` diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-item.ts b/apps/browser/src/autofill/content/components/cipher/cipher-item.ts index 651c20cac3a..96b44d2c0cc 100644 --- a/apps/browser/src/autofill/content/components/cipher/cipher-item.ts +++ b/apps/browser/src/autofill/content/components/cipher/cipher-item.ts @@ -12,7 +12,7 @@ import { import { CipherAction } from "./cipher-action"; import { CipherIcon } from "./cipher-icon"; import { CipherInfo } from "./cipher-info"; -import { CipherData } from "./types"; +import { NotificationCipherData } from "./types"; const cipherIconWidth = "24px"; @@ -22,7 +22,7 @@ export function CipherItem({ notificationType, theme = ThemeTypes.Light, }: { - cipher: CipherData; + cipher: NotificationCipherData; handleAction?: (e: Event) => void; notificationType?: NotificationType; theme: Theme; diff --git a/apps/browser/src/autofill/content/components/cipher/types.ts b/apps/browser/src/autofill/content/components/cipher/types.ts index acdee756570..ff29f9b559f 100644 --- a/apps/browser/src/autofill/content/components/cipher/types.ts +++ b/apps/browser/src/autofill/content/components/cipher/types.ts @@ -1,6 +1,4 @@ -// FIXME: Remove when updating file. Eslint update -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const CipherTypes = { +export const CipherTypes = { Login: 1, SecureNote: 2, Card: 3, @@ -9,9 +7,7 @@ const CipherTypes = { type CipherType = (typeof CipherTypes)[keyof typeof CipherTypes]; -// FIXME: Remove when updating file. Eslint update -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const CipherRepromptTypes = { +export const CipherRepromptTypes = { None: 0, Password: 1, } as const; @@ -25,13 +21,16 @@ export type WebsiteIconData = { icon: string; }; -export type CipherData = { +type BaseCipherData = { id: string; name: string; - type: CipherType; + type: CipherTypeValue; reprompt: CipherRepromptType; favorite: boolean; icon: WebsiteIconData; +}; + +export type CipherData = BaseCipherData & { accountCreationFieldType?: string; login?: { username: string; @@ -46,3 +45,9 @@ export type CipherData = { username?: string; }; }; + +export type NotificationCipherData = BaseCipherData & { + login?: { + username: string; + }; +}; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/body.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/body.lit-stories.ts index 90616647b0e..c4b32e8b0f1 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/notification/body.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/body.lit-stories.ts @@ -5,11 +5,11 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { NotificationType } from "../../../../notification/abstractions/notification-bar"; -import { CipherData } from "../../cipher/types"; +import { NotificationCipherData } from "../../cipher/types"; import { NotificationBody } from "../../notification/body"; type Args = { - ciphers: CipherData[]; + ciphers: NotificationCipherData[]; notificationType: NotificationType; theme: Theme; }; @@ -38,7 +38,7 @@ export default { fallbackImage: "https://example.com/fallback.png", icon: "icon-class", }, - login: { username: "user@example.com", passkey: null }, + login: { username: "user@example.com" }, }, ], theme: ThemeTypes.Light, diff --git a/apps/browser/src/autofill/content/components/notification/body.ts b/apps/browser/src/autofill/content/components/notification/body.ts index 6a3ed2e5d1e..6dc957ab8b8 100644 --- a/apps/browser/src/autofill/content/components/notification/body.ts +++ b/apps/browser/src/autofill/content/components/notification/body.ts @@ -5,7 +5,7 @@ import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; import { NotificationType } from "../../../notification/abstractions/notification-bar"; import { CipherItem } from "../cipher"; -import { CipherData } from "../cipher/types"; +import { NotificationCipherData } from "../cipher/types"; import { scrollbarStyles, spacing, themes, typography } from "../constants/styles"; import { ItemRow } from "../rows/item-row"; @@ -20,7 +20,7 @@ export function NotificationBody({ notificationType, theme = ThemeTypes.Light, }: { - ciphers: CipherData[]; + ciphers: NotificationCipherData[]; customClasses?: string[]; notificationType?: NotificationType; theme: Theme; diff --git a/apps/browser/src/autofill/content/components/notification/container.ts b/apps/browser/src/autofill/content/components/notification/container.ts index 8bd07ab8296..8d1b57c80cd 100644 --- a/apps/browser/src/autofill/content/components/notification/container.ts +++ b/apps/browser/src/autofill/content/components/notification/container.ts @@ -8,8 +8,7 @@ import { NotificationTypes, NotificationType, } from "../../../notification/abstractions/notification-bar"; -import { createAutofillOverlayCipherDataMock } from "../../../spec/autofill-mocks"; -import { CipherData } from "../cipher/types"; +import { NotificationCipherData } from "../cipher/types"; import { themes, spacing } from "../constants/styles"; import { NotificationBody, componentClassPrefix as notificationBodyClassPrefix } from "./body"; @@ -24,23 +23,15 @@ export function NotificationContainer({ i18n, theme = ThemeTypes.Light, type, + ciphers, }: NotificationBarIframeInitData & { handleCloseNotification: (e: Event) => void } & { i18n: { [key: string]: string }; type: NotificationType; // @TODO typing override for generic `NotificationBarIframeInitData.type` + ciphers: NotificationCipherData[]; }) { const headerMessage = getHeaderMessage(i18n, type); const showBody = true; - // @TODO remove mock ciphers for development - const ciphers = [ - createAutofillOverlayCipherDataMock(1), - { ...createAutofillOverlayCipherDataMock(2), icon: { imageEnabled: false } }, - { - ...createAutofillOverlayCipherDataMock(3), - icon: { imageEnabled: true, image: "https://localhost:8443/icons/webtests.dev/icon.png" }, - }, - ] as CipherData[]; - return html`
${NotificationHeader({ diff --git a/apps/browser/src/autofill/notification/bar.ts b/apps/browser/src/autofill/notification/bar.ts index 202b144258d..2316df19857 100644 --- a/apps/browser/src/autofill/notification/bar.ts +++ b/apps/browser/src/autofill/notification/bar.ts @@ -84,23 +84,25 @@ function initNotificationBar(message: NotificationBarWindowMessage) { 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; - // @TODO use context to avoid prop drilling - return render( - NotificationContainer({ - ...notificationBarIframeInitData, - type: notificationBarIframeInitData.type as NotificationType, - theme: resolvedTheme, - handleCloseNotification, - i18n, - }), - document.body, - ); + sendPlatformMessage({ command: "bgGetDecryptedCiphers" }, (cipherData) => { + // @TODO use context to avoid prop drilling + return render( + NotificationContainer({ + ...notificationBarIframeInitData, + type: notificationBarIframeInitData.type as NotificationType, + theme: resolvedTheme, + handleCloseNotification, + i18n, + ciphers: cipherData, + }), + document.body, + ); + }); } setNotificationBarTheme(); diff --git a/apps/browser/src/autofill/services/autofill.service.spec.ts b/apps/browser/src/autofill/services/autofill.service.spec.ts index 378521cfc42..16b11b98866 100644 --- a/apps/browser/src/autofill/services/autofill.service.spec.ts +++ b/apps/browser/src/autofill/services/autofill.service.spec.ts @@ -747,7 +747,7 @@ describe("AutofillService", () => { jest.spyOn(autofillService as any, "generateFillScript"); jest.spyOn(autofillService as any, "generateLoginFillScript"); jest.spyOn(logService, "info"); - jest.spyOn(chrome.runtime, "sendMessage"); + jest.spyOn(cipherService, "updateLastUsedDate"); jest.spyOn(eventCollectionService, "collect"); const autofillResult = await autofillService.doAutoFill(autofillOptions); @@ -769,10 +769,7 @@ describe("AutofillService", () => { ); expect(autofillService["generateLoginFillScript"]).toHaveBeenCalled(); expect(logService.info).not.toHaveBeenCalled(); - expect(chrome.runtime.sendMessage).toHaveBeenCalledWith({ - cipherId: autofillOptions.cipher.id, - command: "updateLastUsedDate", - }); + expect(cipherService.updateLastUsedDate).toHaveBeenCalledWith(autofillOptions.cipher.id); expect(chrome.tabs.sendMessage).toHaveBeenCalledWith( autofillOptions.pageDetails[0].tab.id, { @@ -893,11 +890,11 @@ describe("AutofillService", () => { it("skips updating the cipher's last used date if the passed options indicate that we should skip the last used cipher", async () => { autofillOptions.skipLastUsed = true; - jest.spyOn(chrome.runtime, "sendMessage"); + jest.spyOn(cipherService, "updateLastUsedDate"); await autofillService.doAutoFill(autofillOptions); - expect(chrome.runtime.sendMessage).not.toHaveBeenCalled(); + expect(cipherService.updateLastUsedDate).not.toHaveBeenCalled(); }); it("returns early if the fillScript cannot be generated", async () => { diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index c35b19990cb..6d0e9954ade 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -463,13 +463,8 @@ export default class AutofillService implements AutofillServiceInterface { fillScript.properties.delay_between_operations = 20; didAutofill = true; - if (!options.skipLastUsed) { - // In order to prevent a UI update send message to background script to update last used date - await chrome.runtime.sendMessage({ - command: "updateLastUsedDate", - cipherId: options.cipher.id, - }); + await this.cipherService.updateLastUsedDate(options.cipher.id); } // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index ec33a867e9b..68fa65f8528 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -75,12 +75,16 @@ import { DefaultBillingAccountProfileStateService } from "@bitwarden/common/bill import { ClientType } from "@bitwarden/common/enums"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; +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 { 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 { 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 { 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"; import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { RegionConfig } from "@bitwarden/common/platform/abstractions/environment.service"; import { Fido2ActiveRequestManager as Fido2ActiveRequestManagerAbstraction } from "@bitwarden/common/platform/abstractions/fido2/fido2-active-request-manager.abstraction"; import { Fido2AuthenticatorService as Fido2AuthenticatorServiceAbstraction } from "@bitwarden/common/platform/abstractions/fido2/fido2-authenticator.service.abstraction"; @@ -123,10 +127,6 @@ import { ConfigApiService } from "@bitwarden/common/platform/services/config/con import { DefaultConfigService } from "@bitwarden/common/platform/services/config/default-config.service"; import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; import { ContainerService } from "@bitwarden/common/platform/services/container.service"; -import { BulkEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/bulk-encrypt.service.implementation"; -import { EncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/encrypt.service.implementation"; -import { FallbackBulkEncryptService } from "@bitwarden/common/platform/services/cryptography/fallback-bulk-encrypt.service"; -import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation"; import { Fido2ActiveRequestManager } from "@bitwarden/common/platform/services/fido2/fido2-active-request-manager"; import { Fido2AuthenticatorService } from "@bitwarden/common/platform/services/fido2/fido2-authenticator.service"; import { Fido2ClientService } from "@bitwarden/common/platform/services/fido2/fido2-client.service"; @@ -1142,7 +1142,6 @@ export default class MainBackground { this.accountService, lockService, this.billingAccountProfileStateService, - this.cipherService, ); this.nativeMessagingBackground = new NativeMessagingBackground( this.keyService, diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index 21c8f351e8d..8100ff3cffa 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -1,12 +1,10 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { delay, filter, firstValueFrom, from, map, race, timer } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; @@ -57,26 +55,29 @@ type ReceiveMessageOuter = { messageId?: number; // Should only have one of these. - message?: EncString; + message?: ReceiveMessage | EncString; sharedSecret?: string; }; type Callback = { - resolver: any; - rejecter: any; + resolver: (value?: unknown) => void; + rejecter: (reason?: any) => void; +}; + +type SecureChannel = { + privateKey: Uint8Array; + publicKey: Uint8Array; + sharedSecret?: SymmetricCryptoKey; + setupResolve: (value?: unknown) => void; }; export class NativeMessagingBackground { connected = false; - private connecting: boolean; - private port: browser.runtime.Port | chrome.runtime.Port; + private connecting: boolean = false; + private port?: browser.runtime.Port | chrome.runtime.Port; + private appId?: string; - private privateKey: Uint8Array = null; - private publicKey: Uint8Array = null; - private secureSetupResolve: any = null; - private sharedSecret: SymmetricCryptoKey; - private appId: string; - private validatingFingerprint: boolean; + private secureChannel?: SecureChannel; private messageId = 0; private callbacks = new Map(); @@ -108,11 +109,13 @@ export class NativeMessagingBackground { async connect() { this.logService.info("[Native Messaging IPC] Connecting to Bitwarden Desktop app..."); - this.appId = await this.appIdService.getAppId(); + const appId = await this.appIdService.getAppId(); + this.appId = appId; await this.biometricStateService.setFingerprintValidated(false); return new Promise((resolve, reject) => { - this.port = BrowserApi.connectNative("com.8bit.bitwarden"); + const port = BrowserApi.connectNative("com.8bit.bitwarden"); + this.port = port; this.connecting = true; @@ -131,7 +134,8 @@ export class NativeMessagingBackground { connectedCallback(); } - this.port.onMessage.addListener(async (message: ReceiveMessageOuter) => { + port.onMessage.addListener(async (messageRaw: unknown) => { + const message = messageRaw as ReceiveMessageOuter; switch (message.command) { case "connected": connectedCallback(); @@ -142,7 +146,7 @@ export class NativeMessagingBackground { reject(new Error("startDesktop")); } this.connected = false; - this.port.disconnect(); + port.disconnect(); // reject all for (const callback of this.callbacks.values()) { callback.rejecter("disconnected"); @@ -151,18 +155,31 @@ export class NativeMessagingBackground { break; case "setupEncryption": { // Ignore since it belongs to another device - if (message.appId !== this.appId) { + if (message.appId !== appId) { + return; + } + + if (message.sharedSecret == null) { + this.logService.info( + "[Native Messaging IPC] Unable to create secureChannel channel, no shared secret", + ); + return; + } + if (this.secureChannel == null) { + this.logService.info( + "[Native Messaging IPC] Unable to create secureChannel channel, no secureChannel communication setup", + ); return; } const encrypted = Utils.fromB64ToArray(message.sharedSecret); const decrypted = await this.cryptoFunctionService.rsaDecrypt( encrypted, - this.privateKey, + this.secureChannel.privateKey, HashAlgorithmForEncryption, ); - this.sharedSecret = new SymmetricCryptoKey(decrypted); + this.secureChannel.sharedSecret = new SymmetricCryptoKey(decrypted); this.logService.info("[Native Messaging IPC] Secure channel established"); if ("messageId" in message) { @@ -173,26 +190,27 @@ export class NativeMessagingBackground { this.isConnectedToOutdatedDesktopClient = true; } - this.secureSetupResolve(); + this.secureChannel.setupResolve(); break; } case "invalidateEncryption": // Ignore since it belongs to another device - if (message.appId !== this.appId) { + if (message.appId !== appId) { return; } this.logService.warning( "[Native Messaging IPC] Secure channel encountered an error; disconnecting and wiping keys...", ); - this.sharedSecret = null; - this.privateKey = null; + this.secureChannel = undefined; this.connected = false; - if (this.callbacks.has(message.messageId)) { - this.callbacks.get(message.messageId).rejecter({ - message: "invalidateEncryption", - }); + if (message.messageId != null) { + if (this.callbacks.has(message.messageId)) { + this.callbacks.get(message.messageId)?.rejecter({ + message: "invalidateEncryption", + }); + } } return; case "verifyFingerprint": { @@ -217,21 +235,25 @@ export class NativeMessagingBackground { break; } case "wrongUserId": - if (this.callbacks.has(message.messageId)) { - this.callbacks.get(message.messageId).rejecter({ - message: "wrongUserId", - }); + if (message.messageId != null) { + if (this.callbacks.has(message.messageId)) { + this.callbacks.get(message.messageId)?.rejecter({ + message: "wrongUserId", + }); + } } return; default: // Ignore since it belongs to another device - if (!this.platformUtilsService.isSafari() && message.appId !== this.appId) { + if (!this.platformUtilsService.isSafari() && message.appId !== appId) { return; } - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onMessage(message.message); + if (message.message != null) { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.onMessage(message.message); + } } }); @@ -240,16 +262,15 @@ export class NativeMessagingBackground { if (BrowserApi.isWebExtensionsApi) { error = p.error.message; } else { - error = chrome.runtime.lastError.message; + error = chrome.runtime.lastError?.message; } - this.sharedSecret = null; - this.privateKey = null; + this.secureChannel = undefined; this.connected = false; this.logService.error("NativeMessaging port disconnected because of error: " + error); - const reason = error != null ? "desktopIntegrationDisabled" : null; + const reason = error != null ? "desktopIntegrationDisabled" : undefined; reject(new Error(reason)); }); }); @@ -293,13 +314,13 @@ export class NativeMessagingBackground { ); const callback = this.callbacks.get(messageId); this.callbacks.delete(messageId); - callback.rejecter("errorConnecting"); + callback?.rejecter("errorConnecting"); } setTimeout(() => { if (this.callbacks.has(messageId)) { this.logService.info("[Native Messaging IPC] Message timed out and received no response"); - this.callbacks.get(messageId).rejecter({ + this.callbacks.get(messageId)!.rejecter({ message: "timeout", }); this.callbacks.delete(messageId); @@ -320,16 +341,19 @@ export class NativeMessagingBackground { if (this.platformUtilsService.isSafari()) { this.postMessage(message as any); } else { - this.postMessage({ appId: this.appId, message: await this.encryptMessage(message) }); + this.postMessage({ appId: this.appId!, message: await this.encryptMessage(message) }); } } async encryptMessage(message: Message) { - if (this.sharedSecret == null) { + if (this.secureChannel?.sharedSecret == null) { await this.secureCommunication(); } - return await this.encryptService.encrypt(JSON.stringify(message), this.sharedSecret); + return await this.encryptService.encrypt( + JSON.stringify(message), + this.secureChannel!.sharedSecret!, + ); } private postMessage(message: OuterMessage, messageId?: number) { @@ -346,7 +370,7 @@ export class NativeMessagingBackground { mac: message.message.mac, }; } - this.port.postMessage(msg); + this.port!.postMessage(msg); // FIXME: Remove when updating file. Eslint update // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { @@ -354,26 +378,30 @@ export class NativeMessagingBackground { "[Native Messaging IPC] Disconnected from Bitwarden Desktop app because of the native port disconnecting.", ); - this.sharedSecret = null; - this.privateKey = null; + this.secureChannel = undefined; this.connected = false; - if (this.callbacks.has(messageId)) { - this.callbacks.get(messageId).rejecter("invalidateEncryption"); + if (messageId != null && this.callbacks.has(messageId)) { + this.callbacks.get(messageId)!.rejecter("invalidateEncryption"); } } } private async onMessage(rawMessage: ReceiveMessage | EncString) { - let message = rawMessage as ReceiveMessage; + let message: ReceiveMessage; if (!this.platformUtilsService.isSafari()) { + if (this.secureChannel?.sharedSecret == null) { + return; + } message = JSON.parse( await this.encryptService.decryptToUtf8( rawMessage as EncString, - this.sharedSecret, + this.secureChannel.sharedSecret, "ipc-desktop-ipc-channel-key", ), ); + } else { + message = rawMessage as ReceiveMessage; } if (Math.abs(message.timestamp - Date.now()) > MessageValidTimeout) { @@ -390,15 +418,17 @@ export class NativeMessagingBackground { this.logService.info( `[Native Messaging IPC] Received legacy message of type ${message.command}`, ); - const messageId = this.callbacks.keys().next().value; - const resolver = this.callbacks.get(messageId); - this.callbacks.delete(messageId); - resolver.resolver(message); + const messageId: number | undefined = this.callbacks.keys().next().value; + if (messageId != null) { + const resolver = this.callbacks.get(messageId); + this.callbacks.delete(messageId); + resolver!.resolver(message); + } return; } if (this.callbacks.has(messageId)) { - this.callbacks.get(messageId).resolver(message); + this.callbacks.get(messageId)!.resolver(message); } else { this.logService.info("[Native Messaging IPC] Received message without a callback", message); } @@ -406,8 +436,6 @@ export class NativeMessagingBackground { private async secureCommunication() { const [publicKey, privateKey] = await this.cryptoFunctionService.rsaGenerateKeyPair(2048); - this.publicKey = publicKey; - this.privateKey = privateKey; const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. @@ -419,7 +447,13 @@ export class NativeMessagingBackground { messageId: this.messageId++, }); - return new Promise((resolve, reject) => (this.secureSetupResolve = resolve)); + return new Promise((resolve) => { + this.secureChannel = { + publicKey, + privateKey, + setupResolve: resolve, + }; + }); } private async sendUnencrypted(message: Message) { @@ -429,11 +463,17 @@ export class NativeMessagingBackground { message.timestamp = Date.now(); - this.postMessage({ appId: this.appId, message: message }); + this.postMessage({ appId: this.appId!, message: message }); } private async showFingerprintDialog() { - const fingerprint = await this.keyService.getFingerprint(this.appId, this.publicKey); + if (this.secureChannel?.publicKey == null) { + return; + } + const fingerprint = await this.keyService.getFingerprint( + this.appId!, + this.secureChannel.publicKey, + ); this.messagingService.send("showNativeMessagingFingerprintDialog", { fingerprint: fingerprint, diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index b9622e82005..2a756293070 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -16,7 +16,6 @@ import { MessageListener, isExternalMessage } from "@bitwarden/common/platform/m import { devFlagEnabled } from "@bitwarden/common/platform/misc/flags"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { NotificationsService } from "@bitwarden/common/platform/notifications"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { BiometricsCommands } from "@bitwarden/key-management"; @@ -54,7 +53,6 @@ export default class RuntimeBackground { private accountService: AccountService, private readonly lockService: LockService, private billingAccountProfileStateService: BillingAccountProfileStateService, - private cipherService: CipherService, ) { // onInstalled listener must be wired up before anything else, so we do it in the ctor chrome.runtime.onInstalled.addListener((details: any) => { @@ -202,9 +200,6 @@ export default class RuntimeBackground { case BiometricsCommands.GetBiometricsStatusForUser: { return await this.main.biometricsService.getBiometricsStatusForUser(msg.userId); } - case "updateLastUsedDate": { - return await this.cipherService.updateLastUsedDate(msg.cipherId); - } case "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag": { return await this.configService.getFeatureFlag( FeatureFlag.UseTreeWalkerApiForPageDetailsCollection, diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 90ae271fd14..a71de8506ea 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2025.1.4", + "version": "2025.2.0", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index c88796fd201..8da048e04f2 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2025.1.4", + "version": "2025.2.0", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts b/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts index 4d6a403a18a..1b93e33a94e 100644 --- a/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts +++ b/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts @@ -1,6 +1,6 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Lazy } from "@bitwarden/common/platform/misc/lazy"; diff --git a/apps/browser/src/platform/services/local-backed-session-storage.service.ts b/apps/browser/src/platform/services/local-backed-session-storage.service.ts index 900212ddefa..b030ff46270 100644 --- a/apps/browser/src/platform/services/local-backed-session-storage.service.ts +++ b/apps/browser/src/platform/services/local-backed-session-storage.service.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { Subject } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts index 762380071b7..fe049c4f1db 100644 --- a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts @@ -147,7 +147,9 @@ describe("Browser Utils Service", () => { describe("isViewOpen", () => { it("returns false if a heartbeat response is not received", async () => { - BrowserApi.sendMessageWithResponse = jest.fn().mockResolvedValueOnce(undefined); + chrome.runtime.sendMessage = jest.fn().mockImplementation((message, callback) => { + callback(undefined); + }); const isViewOpen = await browserPlatformUtilsService.isViewOpen(); @@ -155,16 +157,29 @@ describe("Browser Utils Service", () => { }); it("returns true if a heartbeat response is received", async () => { - BrowserApi.sendMessageWithResponse = jest - .fn() - .mockImplementationOnce((subscriber) => - Promise.resolve((subscriber === "checkVaultPopupHeartbeat") as any), - ); + chrome.runtime.sendMessage = jest.fn().mockImplementation((message, callback) => { + callback(message.command === "checkVaultPopupHeartbeat"); + }); const isViewOpen = await browserPlatformUtilsService.isViewOpen(); expect(isViewOpen).toBe(true); }); + + it("returns false if special error is sent", async () => { + chrome.runtime.sendMessage = jest.fn().mockImplementation((message, callback) => { + chrome.runtime.lastError = new Error( + "Could not establish connection. Receiving end does not exist.", + ); + callback(undefined); + }); + + const isViewOpen = await browserPlatformUtilsService.isViewOpen(); + + expect(isViewOpen).toBe(false); + + chrome.runtime.lastError = null; + }); }); describe("copyToClipboard", () => { @@ -228,6 +243,7 @@ describe("Browser Utils Service", () => { }); it("copies the passed text using the offscreen document if the extension is using manifest v3", async () => { + BrowserApi.sendMessageWithResponse = jest.fn(); const text = "test"; offscreenDocumentService.offscreenApiSupported.mockReturnValue(true); getManifestVersionSpy.mockReturnValue(3); @@ -302,6 +318,7 @@ describe("Browser Utils Service", () => { }); it("reads the clipboard text using the offscreen document", async () => { + BrowserApi.sendMessageWithResponse = jest.fn(); offscreenDocumentService.offscreenApiSupported.mockReturnValue(true); getManifestVersionSpy.mockReturnValue(3); offscreenDocumentService.withDocument.mockImplementationOnce((_, __, callback) => diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts index 3679b2731e3..c9200ecc1a4 100644 --- a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts @@ -169,7 +169,28 @@ export abstract class BrowserPlatformUtilsService implements PlatformUtilsServic // Query views on safari since chrome.runtime.sendMessage does not timeout and will hang. return BrowserApi.isPopupOpen(); } - return Boolean(await BrowserApi.sendMessageWithResponse("checkVaultPopupHeartbeat")); + + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage({ command: "checkVaultPopupHeartbeat" }, (response) => { + if (chrome.runtime.lastError != null) { + // This error means that nothing was there to listen to the message, + // meaning the view is not open. + if ( + chrome.runtime.lastError.message === + "Could not establish connection. Receiving end does not exist." + ) { + resolve(false); + return; + } + + // All unhandled errors still reject + reject(chrome.runtime.lastError); + return; + } + + resolve(Boolean(response)); + }); + }); } lockTimeout(): number { diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 1a78492d555..257497fb13d 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -55,13 +55,13 @@ import { } from "@bitwarden/common/autofill/services/user-notification-settings.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ClientType } from "@bitwarden/common/enums"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { AnimationControlService, DefaultAnimationControlService, } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts index 86131176a6e..851509ab17f 100644 --- a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts +++ b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts @@ -34,6 +34,6 @@ export class ExportBrowserV2Component { constructor(private router: Router) {} protected async onSuccessfulExport(organizationId: string): Promise { - await this.router.navigate(["/vault-settings"]); + await this.router.navigate(["/tabs/settings"]); } } diff --git a/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts b/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts index 66cb5c62f48..1c5558bd90e 100644 --- a/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts +++ b/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts @@ -4,7 +4,7 @@ import { Router } from "@angular/router"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/components"; -import { ImportComponent } from "@bitwarden/importer/ui"; +import { ImportComponent } from "@bitwarden/importer-ui"; import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; diff --git a/apps/browser/store/locales/pt_PT/copy.resx b/apps/browser/store/locales/pt_PT/copy.resx index 65b81e2d2d4..fa62a0f1d5c 100644 --- a/apps/browser/store/locales/pt_PT/copy.resx +++ b/apps/browser/store/locales/pt_PT/copy.resx @@ -175,7 +175,7 @@ As soluções de gestão de credenciais encriptadas ponto a ponto do Bitwarden p Sincronize e aceda ao seu cofre através de vários dispositivos - Gira todas as suas credenciais e palavras-passe a partir de um cofre seguro + Faça a gestão de todas as suas credenciais e palavras-passe a partir de um cofre seguro Preencha rapidamente e de forma automática as suas credenciais de início de sessão em qualquer site que visite diff --git a/apps/browser/tsconfig.json b/apps/browser/tsconfig.json index e29d0446120..8055260db57 100644 --- a/apps/browser/tsconfig.json +++ b/apps/browser/tsconfig.json @@ -25,7 +25,7 @@ "@bitwarden/generator-legacy": ["../../libs/tools/generator/extensions/legacy/src"], "@bitwarden/generator-navigation": ["../../libs/tools/generator/extensions/navigation/src"], "@bitwarden/importer-core": ["../../libs/importer/src"], - "@bitwarden/importer/ui": ["../../libs/importer/src/components"], + "@bitwarden/importer-ui": ["../../libs/importer/src/components"], "@bitwarden/key-management": ["../../libs/key-management/src"], "@bitwarden/key-management-ui": ["../../libs/key-management-ui/src"], "@bitwarden/platform": ["../../libs/platform/src"], @@ -51,8 +51,8 @@ }, "include": [ "src", - "../../libs/common/src/platform/services/**/*.worker.ts", "../../libs/common/src/autofill/constants", - "../../libs/common/custom-matchers.d.ts" + "../../libs/common/custom-matchers.d.ts", + "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts" ] } diff --git a/apps/browser/webpack.config.js b/apps/browser/webpack.config.js index bce41d64d1f..ba60a577a71 100644 --- a/apps/browser/webpack.config.js +++ b/apps/browser/webpack.config.js @@ -205,7 +205,7 @@ const mainConfig = { "./src/autofill/deprecated/overlay/pages/button/bootstrap-autofill-overlay-button.deprecated.ts", "overlay/list": "./src/autofill/deprecated/overlay/pages/list/bootstrap-autofill-overlay-list.deprecated.ts", - "encrypt-worker": "../../libs/common/src/platform/services/cryptography/encrypt.worker.ts", + "encrypt-worker": "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts", "content/send-on-installed-message": "./src/vault/content/send-on-installed-message.ts", }, optimization: { diff --git a/apps/cli/package.json b/apps/cli/package.json index 391c9c80808..17dfca83dfa 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/cli", "description": "A secure and free password manager for all of your devices.", - "version": "2025.1.3", + "version": "2025.2.0", "keywords": [ "bitwarden", "password", diff --git a/apps/cli/src/admin-console/commands/confirm.command.ts b/apps/cli/src/admin-console/commands/confirm.command.ts index 5f5f58163e3..0d5c7ba069c 100644 --- a/apps/cli/src/admin-console/commands/confirm.command.ts +++ b/apps/cli/src/admin-console/commands/confirm.command.ts @@ -5,7 +5,7 @@ import { OrganizationUserConfirmRequest, } from "@bitwarden/admin-console/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { KeyService } from "@bitwarden/key-management"; diff --git a/apps/cli/src/commands/download.command.ts b/apps/cli/src/commands/download.command.ts index 6a7cda2ac91..01ef675d2a8 100644 --- a/apps/cli/src/commands/download.command.ts +++ b/apps/cli/src/commands/download.command.ts @@ -1,7 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncArrayBuffer } from "@bitwarden/common/platform/models/domain/enc-array-buffer"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; diff --git a/apps/cli/src/commands/edit.command.ts b/apps/cli/src/commands/edit.command.ts index 6a7506a450d..9af28863c09 100644 --- a/apps/cli/src/commands/edit.command.ts +++ b/apps/cli/src/commands/edit.command.ts @@ -6,10 +6,10 @@ import { CollectionRequest } from "@bitwarden/admin-console/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; import { FolderExport } from "@bitwarden/common/models/export/folder.export"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index c8a6f314240..a90bfa64894 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -13,6 +13,7 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EventType } from "@bitwarden/common/enums"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CardExport } from "@bitwarden/common/models/export/card.export"; import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; @@ -23,7 +24,6 @@ import { LoginUriExport } from "@bitwarden/common/models/export/login-uri.export import { LoginExport } from "@bitwarden/common/models/export/login.export"; import { SecureNoteExport } from "@bitwarden/common/models/export/secure-note.export"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; diff --git a/apps/cli/src/platform/services/node-env-secure-storage.service.ts b/apps/cli/src/platform/services/node-env-secure-storage.service.ts index 2807509e428..5e31995606f 100644 --- a/apps/cli/src/platform/services/node-env-secure-storage.service.ts +++ b/apps/cli/src/platform/services/node-env-secure-storage.service.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { throwError } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index 7fca7ee1008..f7dad133f94 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -61,6 +61,8 @@ import { import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { DefaultBillingAccountProfileStateService } from "@bitwarden/common/billing/services/account/billing-account-profile-state.service"; import { 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 { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { @@ -83,8 +85,6 @@ import { AppIdService } from "@bitwarden/common/platform/services/app-id.service import { ConfigApiService } from "@bitwarden/common/platform/services/config/config-api.service"; import { DefaultConfigService } from "@bitwarden/common/platform/services/config/default-config.service"; import { ContainerService } from "@bitwarden/common/platform/services/container.service"; -import { EncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/encrypt.service.implementation"; -import { FallbackBulkEncryptService } from "@bitwarden/common/platform/services/cryptography/fallback-bulk-encrypt.service"; import { DefaultEnvironmentService } from "@bitwarden/common/platform/services/default-environment.service"; import { FileUploadService } from "@bitwarden/common/platform/services/file-upload/file-upload.service"; import { KeyGenerationService } from "@bitwarden/common/platform/services/key-generation.service"; diff --git a/apps/cli/src/tools/send/commands/get.command.ts b/apps/cli/src/tools/send/commands/get.command.ts index 0e650c8503d..1d651c50bf0 100644 --- a/apps/cli/src/tools/send/commands/get.command.ts +++ b/apps/cli/src/tools/send/commands/get.command.ts @@ -5,7 +5,7 @@ import { firstValueFrom } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; diff --git a/apps/cli/src/tools/send/commands/receive.command.ts b/apps/cli/src/tools/send/commands/receive.command.ts index 41a6681af55..879d03f6dae 100644 --- a/apps/cli/src/tools/send/commands/receive.command.ts +++ b/apps/cli/src/tools/send/commands/receive.command.ts @@ -5,9 +5,9 @@ import * as inquirer from "inquirer"; import { firstValueFrom } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; diff --git a/apps/cli/src/vault/create.command.ts b/apps/cli/src/vault/create.command.ts index 73027e80112..28f58187fdb 100644 --- a/apps/cli/src/vault/create.command.ts +++ b/apps/cli/src/vault/create.command.ts @@ -11,10 +11,10 @@ import { OrganizationService } from "@bitwarden/common/admin-console/abstraction import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; 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 { CipherExport } from "@bitwarden/common/models/export/cipher.export"; import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; import { FolderExport } from "@bitwarden/common/models/export/folder.export"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; diff --git a/apps/desktop/native-messaging-test-runner/src/native-message.service.ts b/apps/desktop/native-messaging-test-runner/src/native-message.service.ts index 71c55a17d1e..c01d581afe8 100644 --- a/apps/desktop/native-messaging-test-runner/src/native-message.service.ts +++ b/apps/desktop/native-messaging-test-runner/src/native-message.service.ts @@ -3,11 +3,11 @@ import "module-alias/register"; import { v4 as uuidv4 } from "uuid"; +import { EncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/encrypt.service.implementation"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; -import { EncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/encrypt.service.implementation"; import { NodeCryptoFunctionService } from "@bitwarden/node/services/node-crypto-function.service"; // eslint-disable-next-line no-restricted-imports diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 249145eb3ea..c0dcd9a504a 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2025.1.4", + "version": "2025.2.1", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/scripts/after-pack.js b/apps/desktop/scripts/after-pack.js index 30b17a44d12..45b79c0fe86 100644 --- a/apps/desktop/scripts/after-pack.js +++ b/apps/desktop/scripts/after-pack.js @@ -42,7 +42,7 @@ async function run(context) { if (process.env.GITHUB_ACTIONS === "true") { if (is_mas) { id = is_mas_dev - ? "E7C9978F6FBCE0553429185C405E61F5380BE8EB" + ? "4B9662CAB74E8E4F4ECBDD9EDEF2543659D95E3C" : "3rd Party Mac Developer Application: Bitwarden Inc"; } else { id = "Developer ID Application: 8bit Solutions LLC"; diff --git a/apps/desktop/src/app/services/init.service.ts b/apps/desktop/src/app/services/init.service.ts index 4dca9f4cd76..6a58f36cfb9 100644 --- a/apps/desktop/src/app/services/init.service.ts +++ b/apps/desktop/src/app/services/init.service.ts @@ -7,7 +7,7 @@ import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service"; 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/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; 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"; diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts index c00b88eb110..c23d9d62ee8 100644 --- a/apps/desktop/src/app/services/services.module.ts +++ b/apps/desktop/src/app/services/services.module.ts @@ -50,10 +50,10 @@ import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/ import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; 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 { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { Fido2AuthenticatorService as Fido2AuthenticatorServiceAbstraction } from "@bitwarden/common/platform/abstractions/fido2/fido2-authenticator.service.abstraction"; import { Fido2UserInterfaceService as Fido2UserInterfaceServiceAbstraction } from "@bitwarden/common/platform/abstractions/fido2/fido2-user-interface.service.abstraction"; diff --git a/apps/desktop/src/app/tools/import/import-desktop.component.ts b/apps/desktop/src/app/tools/import/import-desktop.component.ts index 62fc007731d..72fe02b14fd 100644 --- a/apps/desktop/src/app/tools/import/import-desktop.component.ts +++ b/apps/desktop/src/app/tools/import/import-desktop.component.ts @@ -4,7 +4,7 @@ import { Component } from "@angular/core"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/components"; -import { ImportComponent } from "@bitwarden/importer/ui"; +import { ImportComponent } from "@bitwarden/importer-ui"; @Component({ templateUrl: "import-desktop.component.html", diff --git a/apps/desktop/src/auth/set-password.component.ts b/apps/desktop/src/auth/set-password.component.ts index a5849992864..ed4e8de5b3d 100644 --- a/apps/desktop/src/auth/set-password.component.ts +++ b/apps/desktop/src/auth/set-password.component.ts @@ -11,8 +11,8 @@ import { PolicyService } from "@bitwarden/common/admin-console/abstractions/poli import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; 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 eebafd8d48b..1605f650e12 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 @@ -32,6 +32,9 @@ export class MainBiometricsIPCListener { case BiometricAction.GetStatusForUser: return await this.biometricService.getBiometricsStatusForUser(message.userId as UserId); case BiometricAction.SetKeyForUser: + if (message.key == null) { + return; + } return await this.biometricService.setBiometricProtectedUnlockKeyForUser( message.userId as UserId, message.key, @@ -41,6 +44,9 @@ 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.ts b/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts index d0ba66fdad4..013e69f118c 100644 --- a/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts +++ b/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts @@ -25,10 +25,6 @@ export class MainBiometricsService extends DesktopBiometricsService { private biometricStateService: BiometricStateService, ) { super(); - this.loadOsBiometricService(this.platform); - } - - private loadOsBiometricService(platform: NodeJS.Platform) { if (platform === "win32") { // eslint-disable-next-line const OsBiometricsServiceWindows = require("./os-biometrics-windows.service").default; @@ -117,13 +113,16 @@ export class MainBiometricsService extends DesktopBiometricsService { } async unlockWithBiometricsForUser(userId: UserId): Promise { - return SymmetricCryptoKey.fromString( - await this.osBiometricsService.getBiometricKey( - "Bitwarden_biometric", - `${userId}_user_biometric`, - this.clientKeyHalves.get(userId), - ), - ) as UserKey; + const biometricKey = await this.osBiometricsService.getBiometricKey( + "Bitwarden_biometric", + `${userId}_user_biometric`, + this.clientKeyHalves.get(userId), + ); + if (biometricKey == null) { + return null; + } + + return SymmetricCryptoKey.fromString(biometricKey) as UserKey; } async setBiometricProtectedUnlockKeyForUser(userId: UserId, value: string): Promise { diff --git a/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts b/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts index 791b4d6f885..fb150f2a653 100644 --- a/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts +++ b/apps/desktop/src/key-management/biometrics/os-biometrics-linux.service.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { spawn } from "child_process"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -138,23 +136,27 @@ export default class OsBiometricsServiceLinux implements OsBiometricService { // Nulls out key material in order to force a re-derive. This should only be used in getBiometricKey // when we want to force a re-derive of the key material. - private setIv(iv: string) { - this._iv = iv; + private setIv(iv?: string) { + this._iv = iv ?? null; this._osKeyHalf = null; } private async getStorageDetails({ clientKeyHalfB64, }: { - clientKeyHalfB64: string; + clientKeyHalfB64: string | undefined; }): Promise<{ key_material: biometrics.KeyMaterial; ivB64: string }> { if (this._osKeyHalf == null) { const keyMaterial = await biometrics.deriveKeyMaterial(this._iv); - // osKeyHalf is based on the iv and in contrast to windows is not locked behind user verefication! + // osKeyHalf is based on the iv and in contrast to windows is not locked behind user verification! this._osKeyHalf = keyMaterial.keyB64; this._iv = keyMaterial.ivB64; } + if (this._iv == null) { + throw new Error("Initialization Vector is null"); + } + return { key_material: { osKeyPartB64: this._osKeyHalf, diff --git a/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts b/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts index 9643c2b6f15..cd8c94329bc 100644 --- a/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts +++ b/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; @@ -104,7 +102,7 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { private async getStorageDetails({ clientKeyHalfB64, }: { - clientKeyHalfB64: string; + clientKeyHalfB64: string | undefined; }): Promise<{ key_material: biometrics.KeyMaterial; ivB64: string }> { if (this._osKeyHalf == null) { // Prompts Windows Hello @@ -113,6 +111,10 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { this._iv = keyMaterial.ivB64; } + if (this._iv == null) { + throw new Error("Initialization Vector is null"); + } + const result = { key_material: { osKeyPartB64: this._osKeyHalf, @@ -130,8 +132,8 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { // Nulls out key material in order to force a re-derive. This should only be used in getBiometricKey // when we want to force a re-derive of the key material. - private setIv(iv: string) { - this._iv = iv; + private setIv(iv?: string) { + this._iv = iv ?? null; this._osKeyHalf = null; } @@ -149,9 +151,9 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { encryptedValue: EncString, service: string, storageKey: string, - clientKeyPartB64: string, + clientKeyPartB64: string | undefined, ) { - if (encryptedValue.iv == null || encryptedValue == null) { + if (encryptedValue.iv == null) { return; } @@ -183,7 +185,7 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { storageKey, }: { value: SymmetricCryptoKey; - clientKeyPartB64: string; + clientKeyPartB64: string | undefined; service: string; storageKey: string; }): Promise { @@ -214,7 +216,7 @@ export default class OsBiometricsServiceWindows implements OsBiometricService { /** Derives a witness key from a symmetric key being stored for biometric protection */ private witnessKeyMaterial( symmetricKey: SymmetricCryptoKey, - clientKeyPartB64: string, + clientKeyPartB64: string | undefined, ): biometrics.KeyMaterial { const key = symmetricKey?.macKeyB64 ?? symmetricKey?.keyB64; diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index 6ad5cd63127..b5b60350088 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "'n Kennisgewing was na jou toestel gestuur." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Tokkel karakter telling", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Probeer jy om aan te teken?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Aantekenings poging deur $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tyd" }, - "confirmLogIn": { - "message": "Bevestig aantekening" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Weier aantekening" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Aantekening gebevestig vir $EMAIL$ op $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Hierdie versoek is nie meer geldig nie." }, - "confirmLoginAtemptForMail": { - "message": "Bevestig aantekenings poging vir $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Aan teken versoek" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index a10b438ad34..53f8f8211ba 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "بَدْء تسجيل الدخول" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "تم إرسال إشعار إلى جهازك." }, "aNotificationWasSentToYourDevice": { "message": "أُرسل إشعار إلى جهازك" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "تيقن من أن حسابك مفتوح وأن عبارة البصمة متطابقة على الجهاز الآخر" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "هل تحتاج إلى خيار آخر؟" @@ -2782,11 +2791,11 @@ "message": "تبديل عدد الأحرف", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "هل تحاول تسجيل الدخول؟" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "محاولة تسجيل الدخول بواسطة $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "الوقت" }, - "confirmLogIn": { - "message": "تأكيد تسجيل الدخول" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "رفض تسجيل الدخول" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "تم تأكيد تسجيل الدخول لـ $EMAIL$ في $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "هذا الطلب لم يعد صالحًا." }, - "confirmLoginAtemptForMail": { - "message": "تأكيد محاولة تسجيل الدخول لـ $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "طلب تسجيل الدخول" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "إنشاء الحساب في" }, diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 9e4a9915047..24752ea925b 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Giriş başladıldı" }, + "logInRequestSent": { + "message": "Tələb göndərildi" + }, "notificationSentDevice": { "message": "Cihazınıza bir bildiriş göndərildi." }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildiriş göndərildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lütfən hesabınızın kilidinin açıq olduğuna və barmaq izi ifadəsinin digər cihazla uyuşduğuna əmin olun" + "notificationSentDevicePart1": { + "message": "Cihazınızda Bitwarden kilidini açın, ya da " + }, + "notificationSentDeviceAnchor": { + "message": "veb tətbiqinizdə" + }, + "notificationSentDevicePart2": { + "message": "Təsdiqləməzdən əvvəl Barmaq izi ifadəsinin aşağıdakı ifadə ilə uyuşduğuna əmin olun." }, "needAnotherOptionV1": { "message": "Başqa bir seçimə ehtiyacınız var?" @@ -2782,11 +2791,11 @@ "message": "Simvol sayını dəyişdir", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Giriş etməyə çalışırsınız?" + "areYouTryingToAccessYourAccount": { + "message": "Hesabınıza müraciət etməyə çalışırsınız?" }, - "logInAttemptBy": { - "message": "$EMAIL$ tərəfindən giriş cəhdi", + "accessAttemptBy": { + "message": "$EMAIL$ ilə müraciət cəhdi", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Vaxt" }, - "confirmLogIn": { - "message": "Girişi təsdiqlə" + "confirmAccess": { + "message": "Müraciəti təsdiqlə" }, - "denyLogIn": { - "message": "Girişi rədd et" + "denyAccess": { + "message": "Müraciətə rədd cavabı ver" }, "logInConfirmedForEmailOnDevice": { "message": "$DEVICE$ cihazında $EMAIL$ üçün giriş təsdiqləndi", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Bu tələb artıq yararsızdır." }, - "confirmLoginAtemptForMail": { - "message": "$EMAIL$ üçün giriş cəhdini təsdiqlə", + "confirmAccessAttempt": { + "message": "$EMAIL$ üçün müraciət cəhdini təsdiqlə", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Giriş tələb olundu" }, + "accountAccessRequested": { + "message": "Tələb olunan hesaba müraciət" + }, "creatingAccountOn": { "message": "Hesab yaradılır" }, diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index 607281399be..feb94661e7e 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Ініцыяваны ўваход" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Апавяшчэнне было адпраўлена на вашу прыладу." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Пераключыць лічыльнік сімвалаў", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Вы спрабуеце ўвайсці?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Спроба ўваходу $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Час" }, - "confirmLogIn": { - "message": "Пацвердзіць уваход" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Адхіліць уваход" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Уваход пацверджаны для $EMAIL$ на $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Гэты запыт больш не дзейнічае." }, - "confirmLoginAtemptForMail": { - "message": "Пацвердзіць спробу ўваходу для $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Запытаны ўваход" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index be627b37274..a225af9565f 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Вписването е стартирано" }, + "logInRequestSent": { + "message": "Заявката е изпратена" + }, "notificationSentDevice": { "message": "Към устройството Ви е изпратено известие." }, "aNotificationWasSentToYourDevice": { "message": "Към устройството Ви е изпратено известие" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверете се, че регистрацията Ви е отключена и че уникалната фраза съвпада с другото устройство" + "notificationSentDevicePart1": { + "message": "Отключете Битоурден на устройството си или в " + }, + "notificationSentDeviceAnchor": { + "message": "приложението по уеб" + }, + "notificationSentDevicePart2": { + "message": "Уверете се, че уникалната фраза съвпада с тази по-долу, преди да одобрите." }, "needAnotherOptionV1": { "message": "Предпочитате друг вариант?" @@ -2782,11 +2791,11 @@ "message": "Превключване на броя знаци", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Опитвате се да се впишете ли?" + "areYouTryingToAccessYourAccount": { + "message": "Опитвате ли се да получите достъп до акаунта си?" }, - "logInAttemptBy": { - "message": "Опит за вписване от $EMAIL$", + "accessAttemptBy": { + "message": "Опит за достъп от $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Време" }, - "confirmLogIn": { - "message": "Потвърждаване на вписването" + "confirmAccess": { + "message": "Разрешаване на достъпа" }, - "denyLogIn": { - "message": "Отказване на вписването" + "denyAccess": { + "message": "Отказване на достъпа" }, "logInConfirmedForEmailOnDevice": { "message": "Вписването за $EMAIL$ на $DEVICE$ е одобрено", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Тази заявка вече не е активна." }, - "confirmLoginAtemptForMail": { - "message": "Потвърждаване на заявката за вписване за $EMAIL$", + "confirmAccessAttempt": { + "message": "Потвърждаване на заявката за достъп за $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Направена е заявка за вписване" }, + "accountAccessRequested": { + "message": "Има заявка за достъп до акаунта" + }, "creatingAccountOn": { "message": "Създаване на регистрация в" }, diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 5c5f00b1bc2..89060380ff1 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 001025e9d2f..bccf697c2fc 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index 8aff4edcd74..4ed96c161f3 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -579,7 +579,7 @@ "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "Els requisits de la política empresarial s'han aplicat a les opcions del generador.", "description": "Indicates that a policy limits the credential generator screen." }, "searchCollection": { @@ -889,7 +889,7 @@ "message": "Verifiqueu la vostra identitat" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "No reconeixem aquest dispositiu. Introduïu el codi que us hem enviat al correu electrònic per verificar la identitat." }, "continueLoggingIn": { "message": "Continua l'inici de sessió" @@ -946,7 +946,7 @@ "message": "Temps d'espera d'autenticació" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "La sessió d'autenticació s'ha esgotat. Reinicieu el procés d'inici de sessió." }, "selfHostBaseUrl": { "message": "URL del servidor autoallotjat", @@ -1004,7 +1004,7 @@ "message": "Enllaç caducat" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "Reinicieu el registre o proveu d'iniciar sessió." }, "youMayAlreadyHaveAnAccount": { "message": "És possible que ja tingueu un compte" @@ -2551,7 +2551,7 @@ "message": "Utilitzeu la safata d'entrada global configurada del vostre domini." }, "useThisEmail": { - "message": "Use this email" + "message": "Utilitza aquest correu" }, "random": { "message": "Aleatori" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "S'ha iniciat la sessió" }, + "logInRequestSent": { + "message": "Sol·licitud enviada" + }, "notificationSentDevice": { "message": "S'ha enviat una notificació al vostre dispositiu." }, "aNotificationWasSentToYourDevice": { "message": "S'ha enviat una notificació al vostre dispositiu" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assegureu-vos que la vostra caixa forta estiga desbloquejada i que la frase d'empremta digital coincidisca en l'altre dispositiu" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "aplicació web" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Necessiteu una altra opció?" @@ -2782,11 +2791,11 @@ "message": "Commuta el recompte de caràcters", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Esteu intentant iniciar sessió?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Intent d'inici de sessió per $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Hora" }, - "confirmLogIn": { - "message": "Confirma l'inici de sessió" + "confirmAccess": { + "message": "Confirmeu l'accés" }, - "denyLogIn": { - "message": "Denega l'inici de sessió" + "denyAccess": { + "message": "Denega l'accés" }, "logInConfirmedForEmailOnDevice": { "message": "S'ha confirmat l'inici de sessió per a $EMAIL$ a $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Aquesta sol·licitud ja no és vàlida." }, - "confirmLoginAtemptForMail": { - "message": "Confirmeu l'intent d'inici de sessió per a $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "S'ha sol·licitat inici de sessió" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creant compte en" }, diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 1a4f8f284c8..ef0cd1d7eef 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Bylo zahájeno přihlášení" }, + "logInRequestSent": { + "message": "Požadavek odeslán" + }, "notificationSentDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení." }, "aNotificationWasSentToYourDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ujistěte se, že je Váš účet odemčen a fráze otisku prstu se shoduje s tou na druhém zařízení" + "notificationSentDevicePart1": { + "message": "Odemknout Bitwarden na Vašem zařízení nebo na " + }, + "notificationSentDeviceAnchor": { + "message": "webová aplikace" + }, + "notificationSentDevicePart2": { + "message": "Před schválením se ujistěte, že fráze otisku prstu odpovídá frázi níže." }, "needAnotherOptionV1": { "message": "Potřebujete další volby?" @@ -2782,11 +2791,11 @@ "message": "Zobrazit počet znaků", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Pokoušíte se přihlásit?" + "areYouTryingToAccessYourAccount": { + "message": "Pokoušíte se získat přístup k Vašemu účtu?" }, - "logInAttemptBy": { - "message": "Pokus o přihlášení z $EMAIL$", + "accessAttemptBy": { + "message": "Pokus o přístup z $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Čas" }, - "confirmLogIn": { - "message": "Potvrdit přihlášení" + "confirmAccess": { + "message": "Potvrdit přístup" }, - "denyLogIn": { - "message": "Zamítnout přihlášení" + "denyAccess": { + "message": "Zamítnout přístup" }, "logInConfirmedForEmailOnDevice": { "message": "Přihlášení bylo potvrzeno z $EMAIL$ pro $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Tento požadavek již není platný." }, - "confirmLoginAtemptForMail": { - "message": "Potvrďte pokus o přihlášení z $EMAIL$", + "confirmAccessAttempt": { + "message": "Potvrďte pokus o přístup z $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Bylo vyžádáno přihlášení" }, + "accountAccessRequested": { + "message": "Požadován přístup k účtu" + }, "creatingAccountOn": { "message": "Vytváření účtu na" }, diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index 6488336a3cc..fbceb07c485 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index b3b73c1a6cd..d4423933804 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Indlogning påbegyndt" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "En notifikation er sendt til din enhed." }, "aNotificationWasSentToYourDevice": { "message": "En notifikation er sendt til enheden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Sørg for, at boksen er oplåst, samt at fingeraftrykssætningen matcher på den anden enhed" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Behov for en anden mulighed?" @@ -2782,11 +2791,11 @@ "message": "Vis/skjul tegnantal", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Forsøges at logge ind?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Loginforsøg fra $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tid" }, - "confirmLogIn": { - "message": "Bekræft login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Afvis login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login bekræftet for $EMAIL$ på $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Anmodningen er ikke længere gyldig." }, - "confirmLoginAtemptForMail": { - "message": "Bekræft loginforsøg for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Login anmodet" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Opretter konto på" }, diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index e6aa0fba6b3..4a6b5201324 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -211,7 +211,7 @@ "message": "Dein eingegebenes Passwort ist falsch." }, "importSshKey": { - "message": "Import" + "message": "Importieren" }, "confirmSshKeyPassword": { "message": "Passwort bestätigen" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Anmeldung eingeleitet" }, + "logInRequestSent": { + "message": "Anfrage gesendet" + }, "notificationSentDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." }, "aNotificationWasSentToYourDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Stelle sicher, dass dein Konto entsperrt ist und die Fingerabdruck-Phrase mit der vom anderen Gerät übereinstimmt" + "notificationSentDevicePart1": { + "message": "Entsperre Bitwarden auf deinem Gerät oder mit der " + }, + "notificationSentDeviceAnchor": { + "message": "Web-App" + }, + "notificationSentDevicePart2": { + "message": "Stelle vor der Genehmigung sicher, dass die Fingerabdruck-Phrase mit der unten stehenden übereinstimmt." }, "needAnotherOptionV1": { "message": "Brauchst du eine andere Option?" @@ -2782,11 +2791,11 @@ "message": "Zeichenanzahl ein-/ausschalten", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Versuchst du dich anzumelden?" + "areYouTryingToAccessYourAccount": { + "message": "Versuchst du auf dein Konto zuzugreifen?" }, - "logInAttemptBy": { - "message": "Anmeldeversuch von $EMAIL$", + "accessAttemptBy": { + "message": "Zugriffsversuch von $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Zeit" }, - "confirmLogIn": { - "message": "Anmeldung genehmigen" + "confirmAccess": { + "message": "Zugriff bestätigen" }, - "denyLogIn": { - "message": "Anmeldung ablehnen" + "denyAccess": { + "message": "Zugriff ablehnen" }, "logInConfirmedForEmailOnDevice": { "message": "Anmeldung von $EMAIL$ auf $DEVICE$ bestätigt", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Diese Anfrage ist nicht mehr gültig." }, - "confirmLoginAtemptForMail": { - "message": "Anmeldeversuch von $EMAIL$ genehmigen", + "confirmAccessAttempt": { + "message": "Zugriffsversuch für $EMAIL$ bestätigen", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Anmeldung angefordert" }, + "accountAccessRequested": { + "message": "Kontozugriff angefragt" + }, "creatingAccountOn": { "message": "Konto wird erstellt bei" }, diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index 28afcbbd0c5..4f2803208b6 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Η σύνδεση ξεκίνησε" }, + "logInRequestSent": { + "message": "Το αίτημα εστάλη" + }, "notificationSentDevice": { "message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας." }, "aNotificationWasSentToYourDevice": { "message": "Μια ειδοποίηση στάλθηκε στη συσκευή σας" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Βεβαιωθείτε ότι ο λογαριασμός σας είναι ξεκλείδωτος και ότι η φράση δακτυλικού αποτυπώματος ταιριάζει στην άλλη συσκευή" + "notificationSentDevicePart1": { + "message": "Ξεκλειδώστε το Bitwarden στη συσκευή σας ή στην " + }, + "notificationSentDeviceAnchor": { + "message": "εφαρμογή ιστού" + }, + "notificationSentDevicePart2": { + "message": "Βεβαιωθείτε ότι η φράση αποτυπωμάτων ταιριάζει με την παρακάτω φράση πριν την έγκριση." }, "needAnotherOptionV1": { "message": "Χρειάζεστε μια άλλη επιλογή;" @@ -2782,11 +2791,11 @@ "message": "Εναλλαγή αριθμού χαρακτήρων", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Προσπαθείτε να συνδεθείτε;" + "areYouTryingToAccessYourAccount": { + "message": "Προσπαθείτε να αποκτήσετε πρόσβαση στο λογαριασμό σας;" }, - "logInAttemptBy": { - "message": "Προσπάθεια σύνδεσης από $EMAIL$", + "accessAttemptBy": { + "message": "Προσπάθεια πρόσβασης από το $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Ώρα" }, - "confirmLogIn": { - "message": "Επιβεβαίωση σύνδεσης" + "confirmAccess": { + "message": "Επιβεβαίωση πρόσβασης" }, - "denyLogIn": { - "message": "Άρνηση σύνδεσης" + "denyAccess": { + "message": "Άρνηση πρόσβασης" }, "logInConfirmedForEmailOnDevice": { "message": "Επιβεβαιώθηκε η σύνδεση του $EMAIL$ στη συσκευή $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Αυτό το αίτημα δεν είναι πλέον έγκυρο." }, - "confirmLoginAtemptForMail": { - "message": "Επιβεβαίωση προσπάθειας σύνδεσης για $EMAIL$", + "confirmAccessAttempt": { + "message": "Επιβεβαίωση προσπάθειας πρόσβασης για το $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Ζητήθηκε σύνδεση" }, + "accountAccessRequested": { + "message": "Ζητήθηκε πρόσβαση στον λογαριασμό" + }, "creatingAccountOn": { "message": "Δημιουργία λογαριασμού στο" }, diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index b308f914302..048a0e38d7f 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 3d37b6edf05..a301bf780db 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 43cdeb65e88..c16bc6db692 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -36,7 +36,7 @@ "message": "Kolektoj" }, "searchVault": { - "message": "Traserĉi trezorejon" + "message": "Traserĉi la trezorejon" }, "addItem": { "message": "Aldoni eron" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tempo" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 50737ed8d51..b2f5b1aac1d 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Inicio de sesión iniciado" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Se ha enviado una notificación a tu dispositivo." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Activar recuento de caracteres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "¿Estás intentando iniciar sesión?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Intento de inicio de sesión de $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Hora" }, - "confirmLogIn": { - "message": "Confirmar inicio de sesión" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Denegar inicio de sesión" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Inicio de sesión confirmado para $EMAIL$ en $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Esta solicitud ya no es válida." }, - "confirmLoginAtemptForMail": { - "message": "Confirmar intento de inicio de sesión para $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Inicio de sesión solicitado" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creando una cuenta en" }, diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index b90ca62d6f6..79f56a31cb2 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Alustan sisselogimist" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Sinu seadmesse saadeti teavitus." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Loenda kirjatähtede hulka", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Oled sisse logimas?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Sisselogimise päring $EMAIL$-lt", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Aeg" }, - "confirmLogIn": { - "message": "Kinnita sisselogimine" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Tühista sisselogimine" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ sisselogimine seadmes $DEVICE$ on kinnitatud", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "See päring ei ole enam kehtiv." }, - "confirmLoginAtemptForMail": { - "message": "Kinnita sisselogimise katse $EMAIL$-le", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Sisselogimise päring on saadetud" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Loon kontot asukohas" }, diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 0ecef30080b..a04d717b241 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index aa7c772795d..65432f284b7 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "ورود به سیستم آغاز شد" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "یک اعلان به دستگاه شما ارسال شده است." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "تغییر تعداد کاراکترها", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "آیا در تلاش برای ورود به سیستم هستید؟" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "تلاش برای ورود به سیستم توسط $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "زمان" }, - "confirmLogIn": { - "message": "تأیید ورود" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "رد ورود" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "ورود به سیستم برای $EMAIL$ در $DEVICE$ تأیید شد", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "این درخواست دیگر معتبر نیست." }, - "confirmLoginAtemptForMail": { - "message": "تأیید تلاش برای ورود به سیستم برای $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "ورود الزامیست" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index d92c6a6df31..6809a1eeb72 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Kirjautuminen aloitettu" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Laitteellesi on lähetetty ilmoitus." }, "aNotificationWasSentToYourDevice": { "message": "Laitteeseesi lähetettiin ilmoitus" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelausekkeen" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Tarvitsetko toisen vaihtoehdon?" @@ -2782,11 +2791,11 @@ "message": "Näytä/piilota merkkikohtainen numerointi", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Yritätkö kirjautua sisään?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Kirjautumisyritys tunnuksella $EMAIL$.", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Aika" }, - "confirmLogIn": { - "message": "Vahvista kirjautuminen" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Hylkää kirjautuminen" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Kirjautuminen vahvistettu tunnuksella $EMAIL$ alustalla $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Pyyntö ei ole enää voimassa." }, - "confirmLoginAtemptForMail": { - "message": "Vahvista kirjautuminen tunnuksella $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Kirjautumista pyydetty" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Luodaan tili palvelimelle" }, diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index cfb4759ed12..61f50d46e70 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Naipadala na ang notification sa iyong device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "I-toggle ang bilang ng character", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Sinusubukan mo bang mag-log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Pag-login pagtatangka sa pamamagitan ng $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Oras na" }, - "confirmLogIn": { - "message": "Kumpirmahin ang pag-login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Tanggihan ang pag login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Nakumpirma ang pag-login para sa $EMAIL$ sa $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Hindi na valid ang request na ito." }, - "confirmLoginAtemptForMail": { - "message": "Kumpirmahin ang pagtatangka sa pag-login para sa $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Hiniling ang pag log in" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index aa1c1d69f57..099979955da 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Connexion initiée" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Une notification a été envoyée à votre appareil." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assurez-vous que votre compte est déverrouillé et que la phrase d'empreinte digitale correspond à celle de l'autre appareil" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Besoin d'une autre option ?" @@ -2782,11 +2791,11 @@ "message": "Activer / désactiver le compte de caractères", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Essayez-vous de vous connecter ?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Tentative de connexion par $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Heure" }, - "confirmLogIn": { - "message": "Confirmer la connexion" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Refuser la connexion" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Connexion confirmée pour $EMAIL$ sur $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Cette demande n'est plus valide." }, - "confirmLoginAtemptForMail": { - "message": "Confirmer la tentative de connexion pour $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Connexion demandée" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Création du compte sur" }, diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index 354ca094a78..e45dceeaa78 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 33b2a1a287b..d7efc382550 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "התראה נשלחה למכשירך." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "החלפת מצב ספירת תווים", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "האם את/ה מנסה להתחבר? " + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "ניסיון התחברות של $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "זמן" }, - "confirmLogIn": { - "message": "אישור ההתחברות" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "ביטול התחברות" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "התחברות אושרה עבור $EMAIL$ במכשיר $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index b5fc39ef715..20b93e3c4d3 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 98116940199..dc934506d93 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -250,17 +250,17 @@ "message": "Pogreška" }, "decryptionError": { - "message": "Decryption error" + "message": "Pogreška pri dešifriranju" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nije mogao dešifrirati sljedeće stavke trezora." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Kontaktiraj službu za korisnike", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "kako bi izbjegli gubitak podataka.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "january": { @@ -886,13 +886,13 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "verifyIdentity": { - "message": "Verify your Identity" + "message": "Potvrdi svoj identitet" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Nastavi prijavu" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" @@ -2551,7 +2551,7 @@ "message": "Koristi konfigurirani catch-all sandučić svoje domene." }, "useThisEmail": { - "message": "Use this email" + "message": "Koristi ovu e-poštu" }, "random": { "message": "Nasumično" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Prijava pokrenuta" }, + "logInRequestSent": { + "message": "Zahtjev poslan" + }, "notificationSentDevice": { "message": "Obavijest je poslana na tvoj uređaj." }, "aNotificationWasSentToYourDevice": { "message": "Obavijest je poslana na tvoj uređaj" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Provjeri je li trezor otključan i slaže li se jedinstvena fraza s drugim uređajem" + "notificationSentDevicePart1": { + "message": "Otključaj Bitwarden na svojem uređaju ili na " + }, + "notificationSentDeviceAnchor": { + "message": "web trezoru" + }, + "notificationSentDevicePart2": { + "message": "Provjeri slaže li se jedinstvena fraza s ovdje prikazanom prije odobravanja." }, "needAnotherOptionV1": { "message": "Trebaš drugu opciju?" @@ -2782,11 +2791,11 @@ "message": "Prikaži/Sakrij broj znakova", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Pokušavaš li se prijaviti?" + "areYouTryingToAccessYourAccount": { + "message": "Pokušavaš li pristupiti svom računu?" }, - "logInAttemptBy": { - "message": "$EMAIL$ se pokušava prijaviti", + "accessAttemptBy": { + "message": "$EMAIL$ pokušava pristupiti", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Vrijeme" }, - "confirmLogIn": { - "message": "Potvrdi prijavu" + "confirmAccess": { + "message": "Potvrdi pristup" }, - "denyLogIn": { - "message": "Odbij prijavu" + "denyAccess": { + "message": "Odbij pristup" }, "logInConfirmedForEmailOnDevice": { "message": "Prijava za $EMAIL$ potvrđena na uređaju $DEVICE$", @@ -2843,7 +2852,7 @@ "thisRequestIsNoLongerValid": { "message": "Ovaj zahtjev više nije valjan." }, - "confirmLoginAtemptForMail": { + "confirmAccessAttempt": { "message": "Potvrdi pokušaj prijave za $EMAIL$", "placeholders": { "email": { @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Zatražena je prijava" }, + "accountAccessRequested": { + "message": "Zatražen je pristup računu" + }, "creatingAccountOn": { "message": "Stvaranje računa na" }, @@ -2889,10 +2901,10 @@ "message": "Slaba lozinka je nađena među ukradenima tijekom krađa podataka. Za zaštitu svog računa koristi jaku i jedinstvenu lozinku. Želiš li svejedno korisiti slabu, ukradenu lozinku?" }, "useThisPassword": { - "message": "Use this password" + "message": "Koristi ovu lozinku" }, "useThisUsername": { - "message": "Use this username" + "message": "Koristi ovo korisničko ime" }, "checkForBreaches": { "message": "Provjeri je li lozinka ukradena prilikom krađe podataka" @@ -3392,19 +3404,19 @@ "message": "Nisu nađeni slobodni portovi za SSO prijavu." }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Biometrijsko otključavanje nije dostupno jer je prvo potrebno otključati PIN-om ili lozinkom." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrijsko otključavanje trenutno nije dostupno." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrijsko otključavanje nije dostupno zbog pogrešno konfiguriranih sistemskih datoteka." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrijsko otključavanje nije dostupno zbog pogrešno konfiguriranih sistemskih datoteka." }, "biometricsStatusHelptextNotEnabledLocally": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Biometrijsko otključavanje nije dostupno jer nije omogućeno za $EMAIL$ u Bitwarden desktop aplikaciji.", "placeholders": { "email": { "content": "$1", @@ -3413,7 +3425,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Biometrijsko otključavanje trenutno nije dostupno iz nepoznatog razloga." }, "authorize": { "message": "Autoriziraj" @@ -3485,18 +3497,18 @@ "message": "Promjeni e-poštu računa" }, "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "message": "Potrebna nadogradnja organizacije" }, "upgradeOrganization": { - "message": "Upgrade organization" + "message": "Nadogradi organizaciju" }, "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "message": "Ova značajka nije dostupna organizacijama koje koriste besplatnu uslugu. Prebaci se na plaćeni paket za pristup ovoj i drugim značajkama." }, "updateBrowserOrDisableFingerprintDialogTitle": { - "message": "Extension update required" + "message": "Potrebno je ažurirati proširenje" }, "updateBrowserOrDisableFingerprintDialogMessage": { - "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + "message": "Proširenje preglednika koje koristitš zastarjelo. Ažuriraj ga ili onemogući provjeru otiska prsta u pregledniku u postavkama aplikacije za stolno računalo." } } diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index dac7c8128b4..d0d06176498 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "A bejelentkezés elindításra került." }, + "logInRequestSent": { + "message": "A kérés elküldésre került." + }, "notificationSentDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, "aNotificationWasSentToYourDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ellenőrizzük, hogy a széf feloldásra került és az ujjlenyomat kifejezés egyezik a másik eszközön levővel." + "notificationSentDevicePart1": { + "message": "A Bitwarden zárolás feloldása az eszközön vagy: " + }, + "notificationSentDeviceAnchor": { + "message": "webalkalmazás" + }, + "notificationSentDevicePart2": { + "message": "Jóváhagyás előtt győződjünk meg arról, hogy az ujjlenyomat kifejezés megegyezik az alábbi kifejezéssel." }, "needAnotherOptionV1": { "message": "Másik opció szükséges?" @@ -2782,10 +2791,10 @@ "message": "Karakterszámláló váltás", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Megpróbálunk bejelentkezni?" + "areYouTryingToAccessYourAccount": { + "message": "A fiókhoz próbálunk hozzáférni?" }, - "logInAttemptBy": { + "accessAttemptBy": { "message": "Bejelentkezési kísérlet $EMAIL$ segítségével", "placeholders": { "email": { @@ -2803,11 +2812,11 @@ "time": { "message": "Időpont" }, - "confirmLogIn": { - "message": "Bejelentkezés megerősítése" + "confirmAccess": { + "message": "Hozzáférés megerősítése" }, - "denyLogIn": { - "message": "Bejelentkezés megtagadása" + "denyAccess": { + "message": "Hozzáférés megtagadása" }, "logInConfirmedForEmailOnDevice": { "message": "A bejelelentketés $EMAIL$ email címmel megerősítésre került $DEVICE$ eszközön.", @@ -2843,7 +2852,7 @@ "thisRequestIsNoLongerValid": { "message": "A kérés a továbbiakban már nem érvényes." }, - "confirmLoginAtemptForMail": { + "confirmAccessAttempt": { "message": "Bejelentkezési kísérlet megerősítése $EMAIL$ email címmel", "placeholders": { "email": { @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Bejelentkezés megkérve" }, + "accountAccessRequested": { + "message": "Fiók hozzáférés kérés történt." + }, "creatingAccountOn": { "message": "Fiók létrehozása:" }, diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 78c8c7ab73f..d9bc96f6e59 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 2340545e659..6d542bad4eb 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Accesso avviato" }, + "logInRequestSent": { + "message": "Richiesta inviata" + }, "notificationSentDevice": { "message": "Una notifica è stata inviata al tuo dispositivo." }, "aNotificationWasSentToYourDevice": { "message": "Una notifica è stata inviata al tuo dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assicurati che il tuo account sia sbloccato e che la frase dell'impronta digitale corrisponda nell'altro dispositivo" + "notificationSentDevicePart1": { + "message": "Sblocca Bitwarden sul tuo dispositivo o su " + }, + "notificationSentDeviceAnchor": { + "message": "app web" + }, + "notificationSentDevicePart2": { + "message": "Assicurarsi che la frase di impronta digitale corrisponda a quella sottostante prima dell'approvazione." }, "needAnotherOptionV1": { "message": "Bisogno di un'altra opzione?" @@ -2782,10 +2791,10 @@ "message": "Attiva/disattiva conteggio caratteri", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Stai cercando di accedere?" + "areYouTryingToAccessYourAccount": { + "message": "Stai cercando di accedere al tuo account?" }, - "logInAttemptBy": { + "accessAttemptBy": { "message": "Tentativo di accesso di $EMAIL$", "placeholders": { "email": { @@ -2803,10 +2812,10 @@ "time": { "message": "Ora" }, - "confirmLogIn": { - "message": "Consenti accesso" + "confirmAccess": { + "message": "Conferma accesso" }, - "denyLogIn": { + "denyAccess": { "message": "Nega accesso" }, "logInConfirmedForEmailOnDevice": { @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "La richiesta non è più valida." }, - "confirmLoginAtemptForMail": { - "message": "Conferma il tentativo di accesso di $EMAIL$", + "confirmAccessAttempt": { + "message": "Conferma il tentativo di accesso per $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Accesso richiesto" }, + "accountAccessRequested": { + "message": "Accesso all'account richiesto" + }, "creatingAccountOn": { "message": "Creazione account su" }, diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index b28f69819f9..41b4d399f51 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "ログイン開始" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "デバイスに通知を送信しました。" }, "aNotificationWasSentToYourDevice": { "message": "お使いのデバイスに通知が送信されました" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "アカウントがロック解除されていることと、フィンガープリントフレーズが他の端末と一致していることを確認してください" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "別の選択肢が必要ですか?" @@ -2782,11 +2791,11 @@ "message": "文字カウントを切り替える", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "ログインしようとしていますか?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "$EMAIL$ によるログインの試行", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "時間" }, - "confirmLogIn": { - "message": "ログインを承認" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "ログインを拒否" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ に $DEVICE$ でのログインを承認しました", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "このリクエストは無効になりました。" }, - "confirmLoginAtemptForMail": { - "message": "$EMAIL$ のログイン試行を確認", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "ログインリクエスト済み" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "アカウント作成:" }, diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 52204b185cc..a69c301e84b 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "დრო" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index 354ca094a78..e45dceeaa78 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 24fd070ff4b..d588892e901 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index 80170407b6b..f8cacefaff2 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "기기에 알림이 전송되었습니다." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "글자 수 표시하기", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "로그인을 시도하셨나요?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "$EMAIL$(으)로의 로그인 시도", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "시각" }, - "confirmLogIn": { - "message": "로그인 확인" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "로그인 거부" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "$DEVICE$에서 $EMAIL$(으)로의 로그인이 확인되었습니다", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "더 이상 유효하지 않은 요청입니다." }, - "confirmLoginAtemptForMail": { - "message": "$EMAIL$(으)로의 로그인 시도 확인", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "로그인 요청됨" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index 8df650da355..b77e736e4b4 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Pradėtas prisijungimas" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Į jūsų įrenginį išsiųstas pranešimas." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Perjungti simbolių skaičių", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Ar bandote prisijungti?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Prisijungimo bandymas iš $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Laikas" }, - "confirmLogIn": { - "message": "Patvirtinkite prisijungimą" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Neleisti prisijungti" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ prisijungimas patvirtinas $DEVICE$ įrenginyje", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Ši užklausa nebegalioja." }, - "confirmLoginAtemptForMail": { - "message": "Patvirtinti bandymą prisijungti iš $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Prašoma prisijungti" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 588b9f7e8db..0daed0a52d2 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -2551,7 +2551,7 @@ "message": "Izmantot uzstādīto domēna visu tverošo iesūtni." }, "useThisEmail": { - "message": "Use this email" + "message": "Izmantot šo e-pasta adresi" }, "random": { "message": "Nejauši" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Uzsākta pieteikšanās" }, + "logInRequestSent": { + "message": "Pieprasījums nosūtīts" + }, "notificationSentDevice": { "message": "Uz jūsu ierīci ir nosūtīts paziņojums." }, "aNotificationWasSentToYourDevice": { "message": "Uz ierīci tika nosūtīts paziņojums" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lūgums pārliecināties, ka konts ir atslēgts un atpazīšanas vārdkopa ir tāda pati arī otrā ierīcē" + "notificationSentDevicePart1": { + "message": "Bitwarden jāatslēdz savā ierīcē vai " + }, + "notificationSentDeviceAnchor": { + "message": "tīmekļa lietotnē" + }, + "notificationSentDevicePart2": { + "message": "Pirms apstiprināšanas jāpārliecinās, ka pirkstu nospieduma vārdkopa atbilst zemāk esošajai." }, "needAnotherOptionV1": { "message": "Nepieciešama cita iespēja?" @@ -2782,11 +2791,11 @@ "message": "Pārslēgt rakstzīmju skaita attēlošanu", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Vai mēģini pieteikties?" + "areYouTryingToAccessYourAccount": { + "message": "Vai mēģini piekļūt savam kontam?" }, - "logInAttemptBy": { - "message": "$EMAIL$ pieteikšanās mēģinājums", + "accessAttemptBy": { + "message": "$EMAIL$ piekļuves mēģinājums", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Laiks" }, - "confirmLogIn": { - "message": "Apstiprināt pieteikšanos" + "confirmAccess": { + "message": "Apstiprināt piekļuvi" }, - "denyLogIn": { - "message": "Atteikt pieteikšanos" + "denyAccess": { + "message": "Noraidīt piekļuvi" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ pieteikšanās apstiprināta ierīcē $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Šis pieprasījums vairs nav derīgs." }, - "confirmLoginAtemptForMail": { - "message": "Apstiprināt $EMAIL$ pieteikšanās mēģinājumu", + "confirmAccessAttempt": { + "message": "Apstiprināt $EMAIL$ piekļuves mēģinājumu", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Pieprasīta pieteikšanās" }, + "accountAccessRequested": { + "message": "Pieprasīta piekļuve kontam" + }, "creatingAccountOn": { "message": "Tiek veidots konts" }, diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index d594a5d15e1..4de57ed1d83 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index 36e483a7597..ce0eb31faed 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index 354ca094a78..e45dceeaa78 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index 93bbd900190..b04ca10271a 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index aa75e60accf..d2def0b4b2d 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -27,7 +27,7 @@ "message": "Sikker notis" }, "typeSshKey": { - "message": "SSH key" + "message": "SSH-nøkkel" }, "folders": { "message": "Mapper" @@ -64,7 +64,7 @@ } }, "welcomeBack": { - "message": "Welcome back" + "message": "Velkommen tilbake" }, "moveToOrgDesc": { "message": "Velg en organisasjon som du ønsker å flyttet elementet til. Ved å flytte til en organisasjon, overfører du eierskapet til elementet til den organisasjonen. Du vil ikke lenger være den direkte eieren av elementet etter at den har blitt flyttet." @@ -181,16 +181,16 @@ "message": "Adresse" }, "sshPrivateKey": { - "message": "Private key" + "message": "Privat nøkkel" }, "sshPublicKey": { - "message": "Public key" + "message": "Offentlig nøkkel" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Fingeravtrykk" }, "sshKeyAlgorithm": { - "message": "Key type" + "message": "Nøkkeltype" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -208,19 +208,19 @@ "message": "A new SSH key was generated" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Passordet du skrev inn er feil." }, "importSshKey": { - "message": "Import" + "message": "Importer" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Bekreft passordet" }, "enterSshKeyPasswordDesc": { "message": "Enter the password for the SSH key." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Skriv inn passord" }, "sshAgentUnlockRequired": { "message": "Please unlock your vault to approve the SSH key request." @@ -229,7 +229,7 @@ "message": "SSH key request timed out." }, "enableSshAgent": { - "message": "Enable SSH agent" + "message": "Skru på SSH-agent" }, "enableSshAgentDesc": { "message": "Enable the SSH agent to sign SSH requests right from your Bitwarden vault." @@ -250,7 +250,7 @@ "message": "Feil" }, "decryptionError": { - "message": "Decryption error" + "message": "Dekrypteringsfeil" }, "couldNotDecryptVaultItemsBelow": { "message": "Bitwarden could not decrypt the vault item(s) listed below." @@ -260,7 +260,7 @@ "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "for å unngå ytterligere datatap.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "january": { @@ -337,7 +337,7 @@ "message": "Generer et passord" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Generér passordfrase" }, "type": { "message": "Type" @@ -475,7 +475,7 @@ "message": "Kopier passordet" }, "regenerateSshKey": { - "message": "Regenerate SSH key" + "message": "Generér SSH-nøkkel på nytt" }, "copySshPrivateKey": { "message": "Copy SSH private key" @@ -512,19 +512,19 @@ "message": "Spesialtegn (!@#$%^&*)" }, "include": { - "message": "Include", + "message": "Inkluder", "description": "Card header for password generator include block" }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Inkluder store bokstaver", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { - "message": "A-Z", + "message": "A-Å", "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "Inkluder små bokstaver", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -532,7 +532,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "Inkluder tall", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -540,7 +540,7 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "Inkluder spesialtegn", "description": "Full description for the password generator special characters checkbox" }, "specialCharactersLabel": { @@ -575,7 +575,7 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Unngå forvekslingsbare tegn", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { @@ -638,7 +638,7 @@ "message": "Opprett en konto" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Er du ny til Bitwarden?" }, "setAStrongPassword": { "message": "Velg et sterkt passord" @@ -650,13 +650,13 @@ "message": "Logg på" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Logg inn på Bitwarden" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Logg inn med passnøkkel" }, "loginWithDevice": { - "message": "Log in with device" + "message": "Logg på med enhet" }, "useSingleSignOn": { "message": "Use single sign-on" @@ -723,13 +723,13 @@ "message": "Innstillinger" }, "accountEmail": { - "message": "Account email" + "message": "Kontoens E-postadresse" }, "requestHint": { "message": "Be om hint" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "Be om passordhint" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" @@ -766,7 +766,7 @@ } }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "Du har vellykket logget inn" }, "youMayCloseThisWindow": { "message": "Du kan lukke dette vinduet" @@ -778,10 +778,10 @@ "message": "Din nye konto har blitt opprettet! Du kan nå logge på." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "Den nye kontoen din er opprettet!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "Du har blitt logget inn!" }, "masterPassSent": { "message": "Vi har sendt deg en E-post med hintet til superpassordet." @@ -892,7 +892,7 @@ "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Fortsett innloggingen" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" @@ -904,7 +904,7 @@ "message": "E-post" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "Skriv inn koden du har fått tilsendt på E-post." }, "loginUnavailable": { "message": "Innloggingen er utilgjengelig" @@ -992,7 +992,7 @@ "message": "Logget av" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Du har blitt logget ut av kontoen din." }, "loginExpired": { "message": "Din innloggingsøkt har utløpt." @@ -1007,7 +1007,7 @@ "message": "Please restart registration or try logging in." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "Du har kanskje allerede en konto" }, "logOutConfirmation": { "message": "Er du sikker på at du vil logge av?" @@ -1064,10 +1064,10 @@ "message": "Endre hovedpassordet" }, "continueToWebApp": { - "message": "Continue to web app?" + "message": "Vil du fortsette til nettappen?" }, "changeMasterPasswordOnWebConfirmation": { - "message": "You can change your master password on the Bitwarden web app." + "message": "Du kan endre hovedpassordet ditt i Bitwardens nettapp." }, "fingerprintPhrase": { "message": "Fingeravtrykksfrase", @@ -1096,16 +1096,16 @@ "message": "Hvelvet ditt er låst. Bekreft hovedpassordet ditt for å fortsette." }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Kontoen din er låst" }, "or": { - "message": "or" + "message": "eller" }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Lås opp med biometri" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "Lås opp med hovedpassord" }, "unlock": { "message": "Lås opp" @@ -1413,10 +1413,10 @@ "message": "Passordhistorikk" }, "generatorHistory": { - "message": "Generator history" + "message": "Generatorhistorikk" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Tøm generatorhistorikk" }, "cleargGeneratorHistoryDescription": { "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" @@ -1429,13 +1429,13 @@ "message": "Det er ingen passord å liste opp." }, "clearHistory": { - "message": "Clear history" + "message": "Tøm historikk" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Ingenting å vise" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Du har ikke generert noe i det siste" }, "undo": { "message": "Angre" @@ -1512,7 +1512,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiering lyktes" }, "errorRefreshingAccessToken": { "message": "Access Token Refresh Error" @@ -1635,7 +1635,7 @@ "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." }, "exportTypeHeading": { - "message": "Export type" + "message": "Eksporttype" }, "accountRestricted": { "message": "Konto begrenset" @@ -1749,7 +1749,7 @@ "message": "Ytterligere Windows Hello-innstillinger" }, "unlockWithPolkit": { - "message": "Unlock with system authentication" + "message": "Lås opp med systemautentisering" }, "windowsHelloConsentMessage": { "message": "Bekreft for Bitwarden." @@ -1907,7 +1907,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "out of $TOTAL$", + "message": "av $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -1974,16 +1974,16 @@ "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." }, "unsubscribe": { - "message": "Unsubscribe" + "message": "Avabonner" }, "atAnyTime": { - "message": "at any time." + "message": "når som helst." }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "Ved å fortsette, samtykker du til" }, "and": { - "message": "and" + "message": "og" }, "acceptPolicies": { "message": "Ved å huke av i denne boksen sier du deg enig i følgende:" @@ -2028,7 +2028,7 @@ "message": "Aktiver et ekstra lag sikkerhet ved å kreve fingeravtrykksvalidering når du oppretter en kobling mellom skrivebordet og nettleseren. Når dette er aktivert kreves det brukerintervensjon og verifisering hver gang en tilkobling etableres." }, "enableHardwareAcceleration": { - "message": "Use hardware acceleration" + "message": "Bruk maskinvareakselerering" }, "enableHardwareAccelerationDesc": { "message": "By default this setting is ON. Turn OFF only if you experience graphical issues. Restart is required." @@ -2440,7 +2440,7 @@ "message": "Bytt konto" }, "alreadyHaveAccount": { - "message": "Already have an account?" + "message": "Har du allerede en konto?" }, "options": { "message": "Alternativer" @@ -2476,7 +2476,7 @@ "message": "Låst" }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Hvelvet ditt er låst" }, "unlocked": { "message": "Opplåst" @@ -2498,10 +2498,10 @@ "message": "Generer brukernavn" }, "generateEmail": { - "message": "Generate email" + "message": "Generér E-post" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Verdien må være mellom $MIN$ og $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -2515,7 +2515,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Bruk minst $RECOMMENDED$ tegn for å generere et sterkt passord.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -2551,7 +2551,7 @@ "message": "Bruk domenets konfigurerte catch-all innboks." }, "useThisEmail": { - "message": "Use this email" + "message": "Bruk denne E-postadressen" }, "random": { "message": "Tilfeldig" @@ -2581,11 +2581,11 @@ "message": "Generer et e-postalias med en ekstern videresendingstjeneste." }, "forwarderDomainName": { - "message": "Email domain", + "message": "E-postdomene", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Velg et domene som støttes av den valgte tjenesten", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -2603,11 +2603,11 @@ } }, "forwarderGeneratedBy": { - "message": "Generated by Bitwarden.", + "message": "Generert av Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "message": "Nettsted: $WEBSITE$. Generert av Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -2617,7 +2617,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Ugyldig $SERVICENAME$-API-sjetong", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -2627,7 +2627,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Ugyldig $SERVICENAME$-API-sjetong: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2651,7 +2651,7 @@ } }, "forwarderNoDomain": { - "message": "Invalid $SERVICENAME$ domain.", + "message": "Ugyldig $SERVICENAME$-domene.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -2671,7 +2671,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Ukjent $SERVICENAME$-feil oppstod.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -2743,19 +2743,28 @@ "message": "Logg inn med en annen enhet" }, "loginInitiated": { - "message": "Login initiated" + "message": "Innlogging igangsatt" + }, + "logInRequestSent": { + "message": "Forespørsel sendt" }, "notificationSentDevice": { "message": "Et varsel har blitt sendt til enheten din." }, "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "message": "Et varsel ble sendt til enheten din" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "nett-app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Trenger du et annet alternativ?" }, "fingerprintMatchInfo": { "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." @@ -2770,7 +2779,7 @@ "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Vis alle påloggingsalternativer" }, "viewAllLoginOptions": { "message": "Vis alle påloggingsalternativer" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Prøver du å logge på?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Påloggingsforsøk av $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tid" }, - "confirmLogIn": { - "message": "Bekreft innlogging" + "confirmAccess": { + "message": "Bekreft tilgang" }, - "denyLogIn": { - "message": "Avslå innlogging" + "denyAccess": { + "message": "Nekt tilgang" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Denne forespørselen er ikke lenger gyldig." }, - "confirmLoginAtemptForMail": { - "message": "Bekreft påloggingsforsøket til $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,14 +2864,17 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { - "message": "Creating account on" + "message": "Oppretter en konto på" }, "checkYourEmail": { - "message": "Check your email" + "message": "Sjekk E-postinnboksen din" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "Følg lenken i E-postadressen som ble sendt til" }, "andContinueCreatingYourAccount": { "message": "and continue creating your account." @@ -2874,7 +2886,7 @@ "message": "Gå tilbake" }, "toEditYourEmailAddress": { - "message": "to edit your email address." + "message": "for å redigere E-postadressen din." }, "exposedMasterPassword": { "message": "Eksponert hovedpassord" @@ -2889,22 +2901,22 @@ "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" }, "useThisPassword": { - "message": "Use this password" + "message": "Bruk dette passordet" }, "useThisUsername": { - "message": "Use this username" + "message": "Bruk dette brukernavnet" }, "checkForBreaches": { "message": "Check known data breaches for this password" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "Innlogget!" }, "important": { "message": "Viktig:" }, "accessing": { - "message": "Accessing" + "message": "Logger inn på" }, "accessTokenUnableToBeDecrypted": { "message": "You have been logged out because your access token could not be decrypted. Please log in again to resolve this issue." @@ -2937,7 +2949,7 @@ "message": "Device approval required. Select an approval option below:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Enhetsgodkjennelse kreves" }, "selectAnApprovalOptionBelow": { "message": "Select an approval option below" @@ -2998,7 +3010,7 @@ "message": "Active user email not found. Logging you out." }, "deviceTrusted": { - "message": "Device trusted" + "message": "Enheten er betrodd" }, "inputRequired": { "message": "Inndata er påkrevd." @@ -3107,10 +3119,10 @@ "message": "Hopp frem til innholdet" }, "typePasskey": { - "message": "Passkey" + "message": "Passnøkkel" }, "passkeyNotCopied": { - "message": "Passkey will not be copied" + "message": "Passkoden vil ikke bli kopiert" }, "passkeyNotCopiedAlert": { "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" @@ -3123,7 +3135,7 @@ "description": "Used for the desktop menu item and the header of the import dialog" }, "importError": { - "message": "Import error" + "message": "Importeringsfeil" }, "importErrorDesc": { "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." @@ -3183,7 +3195,7 @@ "message": "Invalid file password, please use the password you entered when you created the export file." }, "destination": { - "message": "Destination" + "message": "Destinasjon" }, "learnAboutImportOptions": { "message": "Lær mer om importalternativene dine" @@ -3242,7 +3254,7 @@ "message": "Bekreft filpassord" }, "exportSuccess": { - "message": "Vault data exported" + "message": "Hvelvdataen ble eksportert" }, "multifactorAuthenticationCancelled": { "message": "Multifaktorautentisering ble avbrutt" @@ -3284,7 +3296,7 @@ "message": "Approve the login request in your authentication app or enter a one-time passcode." }, "passcode": { - "message": "Passcode" + "message": "Passkode" }, "lastPassMasterPassword": { "message": "LastPass-hovedpassord" @@ -3322,10 +3334,10 @@ "description": "Label indicating the most common import formats" }, "success": { - "message": "Success" + "message": "Suksess" }, "troubleshooting": { - "message": "Troubleshooting" + "message": "Feilsøking" }, "disableHardwareAccelerationRestart": { "message": "Disable hardware acceleration and restart" @@ -3334,7 +3346,7 @@ "message": "Enable hardware acceleration and restart" }, "removePasskey": { - "message": "Remove passkey" + "message": "Fjern passordnøkkel" }, "passkeyRemoved": { "message": "Passkey removed" @@ -3346,7 +3358,7 @@ "message": "Error assigning target folder." }, "viewItemsIn": { - "message": "View items in $NAME$", + "message": "Vis gjenstander i $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -3356,7 +3368,7 @@ } }, "backTo": { - "message": "Back to $NAME$", + "message": "Tilbake til $NAME$", "description": "Navigate back to a previous folder or collection", "placeholders": { "name": { @@ -3366,11 +3378,11 @@ } }, "back": { - "message": "Back", + "message": "Tilbake", "description": "Button text to navigate back" }, "removeItem": { - "message": "Remove $NAME$", + "message": "Fjern $NAME$", "description": "Remove a selected option, such as a folder or collection", "placeholders": { "name": { @@ -3395,7 +3407,7 @@ "message": "Biometric unlock is unavailable because PIN or password unlock is required first." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrisk opplåsing er utilgjengelig for øyeblikket." }, "biometricsStatusHelptextAutoSetupNeeded": { "message": "Biometric unlock is unavailable due to misconfigured system files." @@ -3416,10 +3428,10 @@ "message": "Biometric unlock is currently unavailable for an unknown reason." }, "authorize": { - "message": "Authorize" + "message": "Autoriser" }, "deny": { - "message": "Deny" + "message": "Avvis" }, "sshkeyApprovalTitle": { "message": "Confirm SSH key usage" @@ -3428,13 +3440,13 @@ "message": "is requesting access to" }, "unknownApplication": { - "message": "An application" + "message": "Et program" }, "sshKeyPasswordUnsupported": { "message": "Importing password protected SSH keys is not yet supported" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "SSH-nøkkelen er ugyldig" }, "sshKeyTypeUnsupported": { "message": "The SSH key type is not supported" @@ -3449,10 +3461,10 @@ "message": "File saved to device. Manage from your device downloads." }, "importantNotice": { - "message": "Important notice" + "message": "Viktig melding" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Sett opp 2-trinnspålogging" }, "newDeviceVerificationNoticeContentPage1": { "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." @@ -3461,7 +3473,7 @@ "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." }, "remindMeLater": { - "message": "Remind me later" + "message": "Minn meg på det senere" }, "newDeviceVerificationNoticePageOneFormContent": { "message": "Do you have reliable access to your email, $EMAIL$?", @@ -3473,16 +3485,16 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "Nei, det gjør jeg ikke" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { "message": "Yes, I can reliably access my email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Slå på 2-trinnsinnlogging" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Endre kontoens E-postadresse" }, "organizationUpgradeRequired": { "message": "Organization upgrade required" diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 8b3da3ddb94..60fc7d6d917 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index 18fa7900b99..1818f83d729 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Inloggen gestart" }, + "logInRequestSent": { + "message": "Verzoek verzonden" + }, "notificationSentDevice": { "message": "Er is een melding naar je apparaat verzonden." }, "aNotificationWasSentToYourDevice": { "message": "Er is een melding naar je apparaat verzonden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Zorg ervoor dat je account is ontgrendeld en dat de vingerafdrukzin overeenkomt met het andere apparaat" + "notificationSentDevicePart1": { + "message": "Ontgrendel Bitwarden op je apparaat of op de " + }, + "notificationSentDeviceAnchor": { + "message": "webapp" + }, + "notificationSentDevicePart2": { + "message": "Zorg ervoor dat de Vingerafdrukzin overeenkomt met de onderstaande voor je deze goedkeurt." }, "needAnotherOptionV1": { "message": "Nog een optie nodig?" @@ -2782,10 +2791,10 @@ "message": "Tekentelling in-/uitschakelen", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Probeer je in te loggen?" + "areYouTryingToAccessYourAccount": { + "message": "Probeer je toegang te krijgen tot je account?" }, - "logInAttemptBy": { + "accessAttemptBy": { "message": "Inlogpoging door $EMAIL$", "placeholders": { "email": { @@ -2803,11 +2812,11 @@ "time": { "message": "Tijd" }, - "confirmLogIn": { - "message": "Inloggen bevestigen" + "confirmAccess": { + "message": "Toegang bevestigen" }, - "denyLogIn": { - "message": "Inloggen afwijzen" + "denyAccess": { + "message": "Toegang weigeren" }, "logInConfirmedForEmailOnDevice": { "message": "Inloggen voor $EMAIL$ bevestigd op $DEVICE$", @@ -2843,7 +2852,7 @@ "thisRequestIsNoLongerValid": { "message": "Dit verzoek is niet langer geldig." }, - "confirmLoginAtemptForMail": { + "confirmAccessAttempt": { "message": "Inlogpoging voor $EMAIL$ bevestigen", "placeholders": { "email": { @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Inloggen verzocht" }, + "accountAccessRequested": { + "message": "Accounttoegang aangevraagd" + }, "creatingAccountOn": { "message": "Account maken bij" }, diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index 82f7c478b21..fa5dd5ea7a6 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index 3fba3115f0e..0f5eb9dd566 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 43659a925e2..1dc57076fef 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Logowanie rozpoczęte" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Powiadomienie zostało wysłane na urządzenie." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Pokaż / Ukryj licznik znaków", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Próbujesz się zalogować?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Próba logowania przez $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Godzina" }, - "confirmLogIn": { - "message": "Potwierdź logowanie" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Odrzuć logowanie" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Logowanie potwierdzone dla $EMAIL$ dnia $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Ta prośba nie jest już ważna." }, - "confirmLoginAtemptForMail": { - "message": "Potwierdź próbę logowania dla $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Wysłano prośbę logowania" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Tworzenie konta na" }, diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 39c62737f8d..a508870478b 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login iniciado" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se que sua conta esteja desbloqueada e que a frase de identificação corresponda à do outro dispositivo" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Precisa de outra opção?" @@ -2782,11 +2791,11 @@ "message": "Ativar/Desativar contagem de caracteres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Você está tentando fazer login?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Tentativa de login por $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Horário" }, - "confirmLogIn": { - "message": "Confirmar acesso" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Negar acesso" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Acesso confirmado para $EMAIL$ em $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Este pedido não é mais válido." }, - "confirmLoginAtemptForMail": { - "message": "Confirmar tentativa de acesso de $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Acesso solicitado" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Criando conta em" }, diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index 6e8bdd24474..af67d26a3d6 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "A preparar o início de sessão" }, + "logInRequestSent": { + "message": "Pedido enviado" + }, "notificationSentDevice": { "message": "Foi enviada uma notificação para o seu dispositivo." }, "aNotificationWasSentToYourDevice": { "message": "Foi enviada uma notificação para o seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se de que a sua conta está desbloqueada e que a frase de impressão digital corresponde à do outro dispositivo" + "notificationSentDevicePart1": { + "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " + }, + "notificationSentDeviceAnchor": { + "message": "aplicação web" + }, + "notificationSentDevicePart2": { + "message": "Certifique-se de que a frase da impressão digital corresponde à frase abaixo indicada antes de a aprovar." }, "needAnotherOptionV1": { "message": "Precisa de outra opção?" @@ -2782,11 +2791,11 @@ "message": "Mostrar/ocultar contagem de carateres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Está a tentar iniciar sessão?" + "areYouTryingToAccessYourAccount": { + "message": "Está a tentar aceder à sua conta?" }, - "logInAttemptBy": { - "message": "Tentativa de início de sessão por $EMAIL$", + "accessAttemptBy": { + "message": "Tentativa de acesso por $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Hora" }, - "confirmLogIn": { - "message": "Confirmar início de sessão" + "confirmAccess": { + "message": "Confirmar acesso" }, - "denyLogIn": { - "message": "Recusar início de sessão" + "denyAccess": { + "message": "Recusar acesso" }, "logInConfirmedForEmailOnDevice": { "message": "Início de sessão confirmado para $EMAIL$ no $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Este pedido já não é válido." }, - "confirmLoginAtemptForMail": { - "message": "Confirmar tentativa de início de sessão de $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirmar tentativa de acesso para $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Pedido de início de sessão" }, + "accountAccessRequested": { + "message": "Acesso à conta solicitado" + }, "creatingAccountOn": { "message": "A criar uma conta em" }, @@ -3446,7 +3458,7 @@ "message": "Chave SSH importada com sucesso" }, "fileSavedToDevice": { - "message": "Ficheiro guardado no dispositivo. Gira-o a partir das transferências do seu dispositivo." + "message": "Ficheiro guardado no dispositivo. Faça a gestão a partir das transferências do seu dispositivo." }, "importantNotice": { "message": "Aviso importante" diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index e434f782e40..29a147daae2 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 55ddbb82d38..02dcbe5e041 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Вход инициирован" }, + "logInRequestSent": { + "message": "Запрос отправлен" + }, "notificationSentDevice": { "message": "На ваше устройство отправлено уведомление." }, "aNotificationWasSentToYourDevice": { "message": "На ваше устройство было отправлено уведомление" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Убедитесь, что ваш аккаунт разблокирован и фраза отпечатка совпадает с фразой на другом устройстве" + "notificationSentDevicePart1": { + "message": "Разблокируйте Bitwarden на своем устройстве или " + }, + "notificationSentDeviceAnchor": { + "message": "веб-приложении" + }, + "notificationSentDevicePart2": { + "message": "Перед одобрением убедитесь, что фраза отпечатка совпадает с приведенной ниже." }, "needAnotherOptionV1": { "message": "Нужен другой вариант?" @@ -2782,11 +2791,11 @@ "message": "Показать количество символов", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Вы пытаетесь войти?" + "areYouTryingToAccessYourAccount": { + "message": "Вы пытаетесь получить доступ к своему аккаунту?" }, - "logInAttemptBy": { - "message": "Попытка авторизации через $EMAIL$", + "accessAttemptBy": { + "message": "Попытка доступа $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Время" }, - "confirmLogIn": { - "message": "Подтвердить вход" + "confirmAccess": { + "message": "Подтвердить доступ" }, - "denyLogIn": { - "message": "Запретить вход" + "denyAccess": { + "message": "Отказать в доступе" }, "logInConfirmedForEmailOnDevice": { "message": "Вход подтвержден для $EMAIL$ на $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Этот запрос больше не действителен." }, - "confirmLoginAtemptForMail": { - "message": "Подтвердите попытку входа для $EMAIL$", + "confirmAccessAttempt": { + "message": "Подтвердить попытку доступа $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Запрошено разрешение на вход" }, + "accountAccessRequested": { + "message": "Запрошен доступ к аккаунту" + }, "creatingAccountOn": { "message": "Создание аккаунта" }, diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index 8914fe3c688..da0b1b44e83 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index 62175e5a4ac..0029bf1dfb4 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -2575,10 +2575,10 @@ "message": "Prehľadávať môj trezor" }, "forwardedEmail": { - "message": "Alias preposlaného e-mailu" + "message": "Alias presmerovaného e-mailu" }, "forwardedEmailDesc": { - "message": "Vytvoriť e-mailový alias pomocou externej služby preposielania." + "message": "Vytvoriť e-mailový alias pomocou externej služby presmerovania." }, "forwarderDomainName": { "message": "E-mailová doména", @@ -2603,11 +2603,11 @@ } }, "forwarderGeneratedBy": { - "message": "Vygenerované s Bitwarden.", + "message": "Vygenerované Bitwardenom.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Webstránka: $WEBSITE$. Vygenerované s Bitwarden.", + "message": "Webstránka: $WEBSITE$. Vygenerované Bitwardenon.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Iniciované prihlásenie" }, + "logInRequestSent": { + "message": "Požiadavka bola odoslaná" + }, "notificationSentDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie." }, "aNotificationWasSentToYourDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Uistite sa, že je váš účet odomknutý a fráza odtlačku prsta sa zhoduje s frázou na druhom zariadení" + "notificationSentDevicePart1": { + "message": "Odomknúť Bitwarden vo svojom zariadení alebo vo " + }, + "notificationSentDeviceAnchor": { + "message": "webovej aplikácii" + }, + "notificationSentDevicePart2": { + "message": "Pred schválením sa uistite, že sa odtlačok prístupovej frázy zhoduje s tou uvedenou nižšie." }, "needAnotherOptionV1": { "message": "Potrebujete inú možnosť?" @@ -2782,11 +2791,11 @@ "message": "Prepnúť počítadlo znakov", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Snažíte sa prihlásiť?" + "areYouTryingToAccessYourAccount": { + "message": "Snažíte sa získať prístup k svojmu účtu?" }, - "logInAttemptBy": { - "message": "Pokus o prihlásenie pomocou $EMAIL$", + "accessAttemptBy": { + "message": "Pokus o prístup z $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Čas" }, - "confirmLogIn": { - "message": "Potvrdiť prihlásenie" + "confirmAccess": { + "message": "Potvrdiť prístup" }, - "denyLogIn": { - "message": "Odmietnuť prihlásenie" + "denyAccess": { + "message": "Zamietnuť prístup" }, "logInConfirmedForEmailOnDevice": { "message": "Potvrdené prihlásenie pomocou $EMAIL$ na $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Táto žiadosť už nie je platná." }, - "confirmLoginAtemptForMail": { - "message": "Potvrdiť pokus o prihlásenie pomocou $EMAIL$", + "confirmAccessAttempt": { + "message": "Potvrďte pokus o prístup pre $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Požadované prihlásenie" }, + "accountAccessRequested": { + "message": "Žiadosť o prístup k účtu" + }, "creatingAccountOn": { "message": "Vytváranie účtu na" }, diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index d31e9883221..8b7d4c09b3d 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 11d5f23ca12..07e6608294c 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Пријава је покренута" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Обавештење је послато на ваш уређај." }, "aNotificationWasSentToYourDevice": { "message": "Обавештење је послато на ваш уређај" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверите се да је ваш налог откључан и да се фраза отиска подудара на другом уређају" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Треба Вам друга опција?" @@ -2782,11 +2791,11 @@ "message": "Пребаци бројање слова", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Да ли покушавате да се пријавите?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Покушај пријаве од $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Време" }, - "confirmLogIn": { - "message": "Потврди пријављивање" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Одбиј пријављивање" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Пријава потврђена за $EMAIL$ на $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Овај захтев више не важи." }, - "confirmLoginAtemptForMail": { - "message": "Потврдити пријаву за $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Захтев пријаве" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Креирај налог на" }, diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index 4a146c05c1a..23663c6daf2 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Inloggning påbörjad" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "En avisering har skickats till din enhet." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Växla teckenantal", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Försöker du logga in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Inloggningsförsök av $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Tid" }, - "confirmLogIn": { - "message": "Bekräfta inloggning" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Neka inloggning" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Inloggning bekräftad för $EMAIL$ på $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Denna begäran är inte längre giltig." }, - "confirmLoginAtemptForMail": { - "message": "Bekräfta inloggningsförsök för $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Inloggning begärd" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Skapa konto på" }, diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index 354ca094a78..e45dceeaa78 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index deae9dca9cd..6f245a421f1 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Login initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Toggle character count", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Time" }, - "confirmLogIn": { - "message": "Confirm login" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Deny login" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "confirmLoginAtemptForMail": { - "message": "Confirm login attempt for $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Log in requested" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index dd103096be6..513e615a5be 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Giriş başlatıldı" }, + "logInRequestSent": { + "message": "İstek gönderildi" + }, "notificationSentDevice": { "message": "Cihazınıza bir bildirim gönderildi." }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildirim gönderildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lütfen hesabınızın kilidinin açık olduğundan ve parmak izi ifadesinin diğer cihazla eşleştiğinden emin olun" + "notificationSentDevicePart1": { + "message": "Bitwarden kilidini cihazınızdan veya " + }, + "notificationSentDeviceAnchor": { + "message": "web uygulamasından açın" + }, + "notificationSentDevicePart2": { + "message": "Onay vermeden önce parmak izi ifadesinin aşağıdakiyle eşleştiğini kontrol edin." }, "needAnotherOptionV1": { "message": "Başka bir seçeneğe mi ihtiyacınız var?" @@ -2782,11 +2791,11 @@ "message": "Karakter sayacını aç/kapat", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Giriş yapmaya mı çalışıyorsunuz?" + "areYouTryingToAccessYourAccount": { + "message": "Hesabınıza erişmeye mi çalışıyorsunuz?" }, - "logInAttemptBy": { - "message": "$EMAIL$ giriş denemesi", + "accessAttemptBy": { + "message": "$EMAIL$ erişim denemesi", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Saat" }, - "confirmLogIn": { - "message": "Girişi onayla" + "confirmAccess": { + "message": "Erişimi onayla" }, - "denyLogIn": { - "message": "Girişi reddet" + "denyAccess": { + "message": "Erişimi reddet" }, "logInConfirmedForEmailOnDevice": { "message": "$DEVICE$ cihazında $EMAIL$ girişi onaylandı", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Bu istek artık geçerli değil." }, - "confirmLoginAtemptForMail": { - "message": "$EMAIL$ giriş isteğini onayla", + "confirmAccessAttempt": { + "message": "$EMAIL$ erişimini onayla", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Giriş istendi" }, + "accountAccessRequested": { + "message": "Hesap erişimi istendi" + }, "creatingAccountOn": { "message": "Hesap oluşturuluyor:" }, diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index c21b86e2fd4..433c65a4dd1 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Ініційовано вхід" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Сповіщення було надіслано на ваш пристрій." }, "aNotificationWasSentToYourDevice": { "message": "Сповіщення надіслано на ваш пристрій" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Переконайтеся, що ваш обліковий запис розблоковано і фраза відбитка на іншому пристрої збігається" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Потрібен інший варіант?" @@ -2782,11 +2791,11 @@ "message": "Перемкнути лічильник символів", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Ви намагаєтесь увійти?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Спроба входу з $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Час" }, - "confirmLogIn": { - "message": "Підтвердити вхід" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Заборонити вхід" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Підтверджено вхід для $EMAIL$ на $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Цей запит більше недійсний." }, - "confirmLoginAtemptForMail": { - "message": "Підтвердити спробу входу для $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Виконано запит входу" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Створення облікового запису" }, diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 54aa44f0c73..fa4991dc881 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "Bắt đầu đăng nhập" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "Một thông báo đã được gửi đến thiết bị của bạn." }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "Need another option?" @@ -2782,11 +2791,11 @@ "message": "Bật tắt đếm kí tự", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "Bạn đang cố đăng nhập?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "Nỗ lực đăng nhập bằng $EMAIL$", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "Thời Gian" }, - "confirmLogIn": { - "message": "Xác nhận đăng nhập" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "Từ chối đăng nhập" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "Đã xác nhận đăng nhập cho $EMAIL$ trên $DEVICE$", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "Yêu cầu này không còn hiệu lực." }, - "confirmLoginAtemptForMail": { - "message": "Phê duyệt đăng nhập cho $EMAIL$", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "Yêu cầu đăng nhập" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Đang tạo tài khoản trên" }, diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 36e08c99ccf..8c1906bcfba 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -1907,7 +1907,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", @@ -2016,7 +2016,7 @@ "message": "很遗憾,目前仅 Mac App Store 版本支持浏览器集成。" }, "browserIntegrationWindowsStoreDesc": { - "message": "很遗憾,Microsoft Store 版本目前不支持浏览器整合。" + "message": "很遗憾,Microsoft Store 版本目前不支持浏览器集成。" }, "browserIntegrationLinuxDesc": { "message": "很遗憾,Linux 版本目前不支持浏览器集成。" @@ -2551,7 +2551,7 @@ "message": "使用您的域名配置的 Catch-all 收件箱。" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此电子邮箱" }, "random": { "message": "随机" @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "登录已发起" }, + "logInRequestSent": { + "message": "请求已发送" + }, "notificationSentDevice": { "message": "通知已发送到您的设备。" }, "aNotificationWasSentToYourDevice": { "message": "通知已发送到您的设备" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "确保您的账户已解锁,并且指纹短语与其他设备上的相匹配。" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "网页 App" + }, + "notificationSentDevicePart2": { + "message": "在批准前,请确保指纹短语与下面的一致。" }, "needAnotherOptionV1": { "message": "需要其他选项吗?" @@ -2782,11 +2791,11 @@ "message": "字符计数开关", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "您正在尝试登录吗?" + "areYouTryingToAccessYourAccount": { + "message": "您正在尝试访问您的账户吗?" }, - "logInAttemptBy": { - "message": "$EMAIL$ 的登录尝试", + "accessAttemptBy": { + "message": "$EMAIL$ 的访问尝试", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "时间" }, - "confirmLogIn": { - "message": "确认登录" + "confirmAccess": { + "message": "确认访问" }, - "denyLogIn": { - "message": "拒绝登录" + "denyAccess": { + "message": "拒绝访问" }, "logInConfirmedForEmailOnDevice": { "message": "已确认 $EMAIL$ 在 $DEVICE$ 上的登录", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "此请求已失效。" }, - "confirmLoginAtemptForMail": { - "message": "确认 $EMAIL$ 的登录尝试", + "confirmAccessAttempt": { + "message": "确认 $EMAIL$ 的访问尝试", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "已请求登录" }, + "accountAccessRequested": { + "message": "已请求账户访问" + }, "creatingAccountOn": { "message": "创建账户至" }, diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 874f0a27a67..f0e6b3bd65d 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -2745,14 +2745,23 @@ "loginInitiated": { "message": "登入已啟動" }, + "logInRequestSent": { + "message": "Request sent" + }, "notificationSentDevice": { "message": "已傳送通知至您的裝置。" }, "aNotificationWasSentToYourDevice": { "message": "已傳送通知至您的裝置" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." }, "needAnotherOptionV1": { "message": "需要另一個選項嗎?" @@ -2782,11 +2791,11 @@ "message": "切換字元計數", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, - "areYouTryingtoLogin": { - "message": "您正在嘗試登入嗎?" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" }, - "logInAttemptBy": { - "message": "來自 $EMAIL$ 的登入嘗試", + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2803,11 +2812,11 @@ "time": { "message": "時間" }, - "confirmLogIn": { - "message": "確認登入" + "confirmAccess": { + "message": "Confirm access" }, - "denyLogIn": { - "message": "拒絕登入" + "denyAccess": { + "message": "Deny access" }, "logInConfirmedForEmailOnDevice": { "message": "已確認 $EMAIL$ 在 $DEVICE$ 上的登入", @@ -2843,8 +2852,8 @@ "thisRequestIsNoLongerValid": { "message": "此請求已失效。" }, - "confirmLoginAtemptForMail": { - "message": "確認 $EMAIL$ 的登入嘗試", + "confirmAccessAttempt": { + "message": "Confirm access attempt for $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2855,6 +2864,9 @@ "logInRequested": { "message": "已要求登入" }, + "accountAccessRequested": { + "message": "Account access requested" + }, "creatingAccountOn": { "message": "Creating account on" }, diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index f3dc98b8d9b..4d4b1572b5c 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2025.1.4", + "version": "2025.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2025.1.4", + "version": "2025.2.0", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-napi": "file:../desktop_native/napi" diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index 7497d31d621..91dd860e9f9 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2025.1.4", + "version": "2025.2.0", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/apps/desktop/src/platform/services/electron-key.service.ts b/apps/desktop/src/platform/services/electron-key.service.ts index 0db634375ef..6259c1f353f 100644 --- a/apps/desktop/src/platform/services/electron-key.service.ts +++ b/apps/desktop/src/platform/services/electron-key.service.ts @@ -3,8 +3,8 @@ import { PinServiceAbstraction } from "@bitwarden/auth/common"; 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 { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; diff --git a/apps/desktop/src/services/biometric-message-handler.service.spec.ts b/apps/desktop/src/services/biometric-message-handler.service.spec.ts index a7f0f555ca2..cc82c165219 100644 --- a/apps/desktop/src/services/biometric-message-handler.service.spec.ts +++ b/apps/desktop/src/services/biometric-message-handler.service.spec.ts @@ -2,11 +2,11 @@ import { NgZone } from "@angular/core"; import { mock, MockProxy } from "jest-mock-extended"; import { of } from "rxjs"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountInfo, 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 { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -27,7 +27,7 @@ import { BiometricMessageHandlerService } from "./biometric-message-handler.serv const SomeUser = "SomeUser" as UserId; const AnotherUser = "SomeOtherUser" as UserId; -const accounts = { +const accounts: Record = { [SomeUser]: { name: "some user", email: "some.user@example.com", @@ -108,6 +108,30 @@ describe("BiometricMessageHandlerService", () => { }); describe("setup encryption", () => { + it("should ignore when public key missing in message", async () => { + await service.handleMessage({ + appId: "appId", + message: { + command: "setupEncryption", + messageId: 0, + userId: "unknownUser" as UserId, + }, + }); + expect((global as any).ipc.platform.nativeMessaging.sendMessage).not.toHaveBeenCalled(); + }); + + it("should ignore when user id missing in message", async () => { + await service.handleMessage({ + appId: "appId", + message: { + command: "setupEncryption", + messageId: 0, + publicKey: Utils.fromUtf8ToB64("publicKey"), + }, + }); + expect((global as any).ipc.platform.nativeMessaging.sendMessage).not.toHaveBeenCalled(); + }); + it("should reject when user is not in app", async () => { await service.handleMessage({ appId: "appId", @@ -115,6 +139,7 @@ describe("BiometricMessageHandlerService", () => { command: "setupEncryption", messageId: 0, userId: "unknownUser" as UserId, + publicKey: Utils.fromUtf8ToB64("publicKey"), }, }); expect((global as any).ipc.platform.nativeMessaging.sendMessage).toHaveBeenCalledWith({ @@ -362,12 +387,15 @@ describe("BiometricMessageHandlerService", () => { // always reload when another user is active than the requested one [SomeUser, AuthenticationStatus.Unlocked, AnotherUser, false, true], [SomeUser, AuthenticationStatus.Locked, AnotherUser, false, true], + // don't reload when no active user + [null, AuthenticationStatus.Unlocked, AnotherUser, false, false], // don't reload in dev mode [SomeUser, AuthenticationStatus.Unlocked, SomeUser, true, false], [SomeUser, AuthenticationStatus.Locked, SomeUser, true, false], [SomeUser, AuthenticationStatus.Unlocked, AnotherUser, true, false], [SomeUser, AuthenticationStatus.Locked, AnotherUser, true, false], + [null, AuthenticationStatus.Unlocked, AnotherUser, true, false], ]; it.each(testCases)( diff --git a/apps/desktop/src/services/biometric-message-handler.service.ts b/apps/desktop/src/services/biometric-message-handler.service.ts index 0482434708e..7f4adce29d9 100644 --- a/apps/desktop/src/services/biometric-message-handler.service.ts +++ b/apps/desktop/src/services/biometric-message-handler.service.ts @@ -1,13 +1,11 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { Injectable, NgZone } from "@angular/core"; import { combineLatest, concatMap, firstValueFrom, map } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; @@ -25,8 +23,7 @@ import { } from "@bitwarden/key-management"; import { BrowserSyncVerificationDialogComponent } from "../app/components/browser-sync-verification-dialog.component"; -import { LegacyMessage } from "../models/native-messaging/legacy-message"; -import { LegacyMessageWrapper } from "../models/native-messaging/legacy-message-wrapper"; +import { LegacyMessage, LegacyMessageWrapper } from "../models/native-messaging"; import { DesktopSettingsService } from "../platform/services/desktop-settings.service"; const MessageValidTimeout = 10 * 1000; @@ -34,14 +31,14 @@ const HashAlgorithmForAsymmetricEncryption = "sha1"; type ConnectedApp = { publicKey: string; - sessionSecret: string; + sessionSecret: string | null; trusted: boolean; }; const ConnectedAppPrefix = "connectedApp_"; class ConnectedApps { - async get(appId: string): Promise { + async get(appId: string): Promise { if (!(await this.has(appId))) { return null; } @@ -112,6 +109,12 @@ export class BiometricMessageHandlerService { // Request to setup secure encryption if ("command" in rawMessage && rawMessage.command === "setupEncryption") { + if (rawMessage.publicKey == null || rawMessage.userId == null) { + this.logService.warning( + "[Native Messaging IPC] Received invalid setupEncryption message. Ignoring.", + ); + return; + } const remotePublicKey = Utils.fromB64ToArray(rawMessage.publicKey); // Validate the UserId to ensure we are logged into the same account. @@ -134,16 +137,18 @@ export class BiometricMessageHandlerService { ); } - await this.connectedApps.set(appId, { + const connectedApp = { publicKey: Utils.fromBufferToB64(remotePublicKey), sessionSecret: null, trusted: false, - }); - await this.secureCommunication(remotePublicKey, appId); + } as ConnectedApp; + await this.connectedApps.set(appId, connectedApp); + await this.secureCommunication(connectedApp, remotePublicKey, appId); return; } - if ((await this.connectedApps.get(appId))?.sessionSecret == null) { + const sessionSecret = (await this.connectedApps.get(appId))?.sessionSecret; + if (sessionSecret == null) { this.logService.info( "[Native Messaging IPC] Session secret for secure channel is missing. Invalidating encryption...", ); @@ -157,7 +162,7 @@ export class BiometricMessageHandlerService { const message: LegacyMessage = JSON.parse( await this.encryptService.decryptToUtf8( rawMessage as EncString, - SymmetricCryptoKey.fromString((await this.connectedApps.get(appId)).sessionSecret), + SymmetricCryptoKey.fromString(sessionSecret), ), ); @@ -173,7 +178,10 @@ export class BiometricMessageHandlerService { return; } - if (Math.abs(message.timestamp - Date.now()) > MessageValidTimeout) { + if ( + message.timestamp == null || + Math.abs(message.timestamp - Date.now()) > MessageValidTimeout + ) { this.logService.info("[Native Messaging IPC] Received a too old message. Ignoring."); return; } @@ -277,11 +285,11 @@ export class BiometricMessageHandlerService { return this.send({ command: "biometricUnlock", response: "not unlocked" }, appId); } - const biometricUnlockPromise = + const biometricUnlock = message.userId == null - ? firstValueFrom(this.biometricStateService.biometricUnlockEnabled$) - : this.biometricStateService.getBiometricUnlockEnabled(message.userId as UserId); - if (!(await biometricUnlockPromise)) { + ? await firstValueFrom(this.biometricStateService.biometricUnlockEnabled$) + : await this.biometricStateService.getBiometricUnlockEnabled(message.userId as UserId); + if (!biometricUnlock) { await this.send({ command: "biometricUnlock", response: "not enabled" }, appId); return this.ngZone.run(() => @@ -310,13 +318,13 @@ export class BiometricMessageHandlerService { const currentlyActiveAccountId = ( await firstValueFrom(this.accountService.activeAccount$) - ).id; + )?.id; const isCurrentlyActiveAccountUnlocked = (await this.authService.getAuthStatus(userId)) == AuthenticationStatus.Unlocked; // prevent proc reloading an active account, when it is the same as the browser if (currentlyActiveAccountId != message.userId || !isCurrentlyActiveAccountUnlocked) { - await ipc.platform.reloadProcess(); + ipc.platform.reloadProcess(); } } else { await this.send({ command: "biometricUnlock", response: "canceled" }, appId); @@ -337,9 +345,14 @@ export class BiometricMessageHandlerService { private async send(message: any, appId: string) { message.timestamp = Date.now(); + const sessionSecret = (await this.connectedApps.get(appId))?.sessionSecret; + if (sessionSecret == null) { + throw new Error("Session secret is missing"); + } + const encrypted = await this.encryptService.encrypt( JSON.stringify(message), - SymmetricCryptoKey.fromString((await this.connectedApps.get(appId)).sessionSecret), + SymmetricCryptoKey.fromString(sessionSecret), ); ipc.platform.nativeMessaging.sendMessage({ @@ -349,9 +362,13 @@ export class BiometricMessageHandlerService { }); } - private async secureCommunication(remotePublicKey: Uint8Array, appId: string) { + private async secureCommunication( + connectedApp: ConnectedApp, + remotePublicKey: Uint8Array, + appId: string, + ) { const secret = await this.cryptoFunctionService.randomBytes(64); - const connectedApp = await this.connectedApps.get(appId); + connectedApp.sessionSecret = new SymmetricCryptoKey(secret).keyB64; await this.connectedApps.set(appId, connectedApp); @@ -421,11 +438,15 @@ export class BiometricMessageHandlerService { } } - /** A process reload after a biometric unlock should happen if the userkey that was used for biometric unlock is for a different user than the + /** + * A process reload after a biometric unlock should happen if the userkey that was used for biometric unlock is for a different user than the * currently active account. The userkey for the active account was in memory anyways. Further, if the desktop app is locked, a reload should occur (since the userkey was not already in memory). */ async processReloadWhenRequired(messageUserId: UserId) { - const currentlyActiveAccountId = (await firstValueFrom(this.accountService.activeAccount$)).id; + const currentlyActiveAccountId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + if (currentlyActiveAccountId == null) { + return; + } const isCurrentlyActiveAccountUnlocked = (await firstValueFrom(this.authService.authStatusFor$(currentlyActiveAccountId))) == AuthenticationStatus.Unlocked; diff --git a/apps/desktop/src/services/duckduckgo-message-handler.service.ts b/apps/desktop/src/services/duckduckgo-message-handler.service.ts index fa5c2f4d9f7..e4474b60741 100644 --- a/apps/desktop/src/services/duckduckgo-message-handler.service.ts +++ b/apps/desktop/src/services/duckduckgo-message-handler.service.ts @@ -4,8 +4,8 @@ import { Injectable } from "@angular/core"; import { firstValueFrom } from "rxjs"; import { NativeMessagingVersion } from "@bitwarden/common/enums"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; diff --git a/apps/desktop/src/vault/app/vault/add-edit.component.ts b/apps/desktop/src/vault/app/vault/add-edit.component.ts index f2ca05c9336..ae332c9723b 100644 --- a/apps/desktop/src/vault/app/vault/add-edit.component.ts +++ b/apps/desktop/src/vault/app/vault/add-edit.component.ts @@ -25,7 +25,7 @@ import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folde import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service"; import { DialogService, ToastService } from "@bitwarden/components"; -import { SshKeyPasswordPromptComponent } from "@bitwarden/importer/ui"; +import { SshKeyPasswordPromptComponent } from "@bitwarden/importer-ui"; import { PasswordRepromptService } from "@bitwarden/vault"; const BroadcasterSubscriptionId = "AddEditComponent"; diff --git a/apps/desktop/src/vault/app/vault/attachments.component.ts b/apps/desktop/src/vault/app/vault/attachments.component.ts index 2b554ba2291..ea4f49b8431 100644 --- a/apps/desktop/src/vault/app/vault/attachments.component.ts +++ b/apps/desktop/src/vault/app/vault/attachments.component.ts @@ -4,7 +4,7 @@ import { AttachmentsComponent as BaseAttachmentsComponent } from "@bitwarden/ang import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/apps/desktop/src/vault/app/vault/view.component.ts b/apps/desktop/src/vault/app/vault/view.component.ts index ce9d3af8276..136a537dd37 100644 --- a/apps/desktop/src/vault/app/vault/view.component.ts +++ b/apps/desktop/src/vault/app/vault/view.component.ts @@ -17,8 +17,8 @@ import { EventCollectionService } from "@bitwarden/common/abstractions/event/eve import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; 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 { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json index 3545f4afae4..0bef5a5564d 100644 --- a/apps/desktop/tsconfig.json +++ b/apps/desktop/tsconfig.json @@ -23,7 +23,7 @@ "@bitwarden/generator-legacy": ["../../libs/tools/generator/extensions/legacy/src"], "@bitwarden/generator-navigation": ["../../libs/tools/generator/extensions/navigation/src"], "@bitwarden/importer-core": ["../../libs/importer/src"], - "@bitwarden/importer/ui": ["../../libs/importer/src/components"], + "@bitwarden/importer-ui": ["../../libs/importer/src/components"], "@bitwarden/key-management": ["../../libs/key-management/src"], "@bitwarden/key-management-ui": ["../../libs/key-management-ui/src"], "@bitwarden/node/*": ["../../libs/node/src/*"], @@ -48,5 +48,5 @@ "strictTemplates": true, "preserveWhitespaces": true }, - "include": ["src", "../../libs/common/src/platform/services/**/*.worker.ts"] + "include": ["src", "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts"] } diff --git a/apps/web/package.json b/apps/web/package.json index 7047b0fb137..6f402f737a9 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2025.1.2", + "version": "2025.2.0", "scripts": { "build:oss": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:bit": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" webpack -c ../../bitwarden_license/bit-web/webpack.config.js", diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html index 8387c53e5e3..ae0972a6828 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html @@ -121,6 +121,22 @@ + + {{ "accountDeprovisioningNotification" | i18n }} + + {{ "learnMore" | i18n }} + + ; enterpriseOrganization$: Observable; + showAccountDeprovisioningBanner$: Observable; + constructor( private route: ActivatedRoute, private organizationService: OrganizationService, @@ -68,19 +73,36 @@ export class OrganizationLayoutComponent implements OnInit { private configService: ConfigService, private policyService: PolicyService, private providerService: ProviderService, + protected bannerService: AccountDeprovisioningBannerService, private accountService: AccountService, ) {} async ngOnInit() { document.body.classList.remove("layout_frontend"); - const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); this.organization$ = this.route.params.pipe( map((p) => p.organizationId), - switchMap((id) => this.organizationService.organizations$(userId).pipe(getById(id))), + withLatestFrom(this.accountService.activeAccount$.pipe(getUserId)), + switchMap(([orgId, userId]) => + this.organizationService.organizations$(userId).pipe(getById(orgId)), + ), filter((org) => org != null), ); + this.showAccountDeprovisioningBanner$ = combineLatest([ + this.bannerService.showBanner$, + this.configService.getFeatureFlag$(FeatureFlag.AccountDeprovisioningBanner), + this.organization$, + ]).pipe( + map( + ([dismissedOrgs, featureFlagEnabled, organization]) => + organization.productTierType === ProductTierType.Enterprise && + organization.isAdmin && + !dismissedOrgs?.includes(organization.id) && + featureFlagEnabled, + ), + ); + this.canAccessExport$ = this.organization$.pipe(map((org) => org.canAccessExport)); this.showPaymentAndHistory$ = this.organization$.pipe( diff --git a/apps/web/src/app/admin-console/organizations/layouts/services/account-deprovisioning-banner.service.spec.ts b/apps/web/src/app/admin-console/organizations/layouts/services/account-deprovisioning-banner.service.spec.ts new file mode 100644 index 00000000000..414828969df --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/layouts/services/account-deprovisioning-banner.service.spec.ts @@ -0,0 +1,75 @@ +import { firstValueFrom } from "rxjs"; + +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { + FakeAccountService, + FakeStateProvider, + mockAccountServiceWith, +} from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { AccountDeprovisioningBannerService } from "./account-deprovisioning-banner.service"; + +describe("Account Deprovisioning Banner Service", () => { + const userId = Utils.newGuid() as UserId; + let accountService: FakeAccountService; + let stateProvider: FakeStateProvider; + let bannerService: AccountDeprovisioningBannerService; + + beforeEach(async () => { + accountService = mockAccountServiceWith(userId); + stateProvider = new FakeStateProvider(accountService); + bannerService = new AccountDeprovisioningBannerService(stateProvider); + }); + + it("updates state with single org", async () => { + const fakeOrg = new Organization(); + fakeOrg.id = "123"; + + await bannerService.hideBanner(fakeOrg); + const state = await firstValueFrom(bannerService.showBanner$); + + expect(state).toEqual([fakeOrg.id]); + }); + + it("updates state with multiple orgs", async () => { + const fakeOrg1 = new Organization(); + fakeOrg1.id = "123"; + const fakeOrg2 = new Organization(); + fakeOrg2.id = "234"; + const fakeOrg3 = new Organization(); + fakeOrg3.id = "987"; + + await bannerService.hideBanner(fakeOrg1); + await bannerService.hideBanner(fakeOrg2); + await bannerService.hideBanner(fakeOrg3); + + const state = await firstValueFrom(bannerService.showBanner$); + + expect(state).toContain(fakeOrg1.id); + expect(state).toContain(fakeOrg2.id); + expect(state).toContain(fakeOrg3.id); + }); + + it("does not add the same org id multiple times", async () => { + const fakeOrg = new Organization(); + fakeOrg.id = "123"; + + await bannerService.hideBanner(fakeOrg); + await bannerService.hideBanner(fakeOrg); + + const state = await firstValueFrom(bannerService.showBanner$); + + expect(state).toEqual([fakeOrg.id]); + }); + + it("does not add null to the state", async () => { + await bannerService.hideBanner(null as unknown as Organization); + await bannerService.hideBanner(undefined as unknown as Organization); + + const state = await firstValueFrom(bannerService.showBanner$); + + expect(state).toBeNull(); + }); +}); diff --git a/apps/web/src/app/admin-console/organizations/layouts/services/account-deprovisioning-banner.service.ts b/apps/web/src/app/admin-console/organizations/layouts/services/account-deprovisioning-banner.service.ts new file mode 100644 index 00000000000..86a6b7df3e2 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/layouts/services/account-deprovisioning-banner.service.ts @@ -0,0 +1,40 @@ +import { Injectable } from "@angular/core"; + +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { + ACCOUNT_DEPROVISIONING_BANNER_DISK, + StateProvider, + UserKeyDefinition, +} from "@bitwarden/common/platform/state"; + +export const SHOW_BANNER_KEY = new UserKeyDefinition( + ACCOUNT_DEPROVISIONING_BANNER_DISK, + "accountDeprovisioningBanner", + { + deserializer: (b) => b, + clearOn: [], + }, +); + +@Injectable({ providedIn: "root" }) +export class AccountDeprovisioningBannerService { + private _showBanner = this.stateProvider.getActive(SHOW_BANNER_KEY); + + showBanner$ = this._showBanner.state$; + + constructor(private stateProvider: StateProvider) {} + + async hideBanner(organization: Organization) { + await this._showBanner.update((state) => { + if (!organization) { + return state; + } + if (!state) { + return [organization.id]; + } else if (!state.includes(organization.id)) { + return [...state, organization.id]; + } + return state; + }); + } +} diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/base-bulk-confirm.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/base-bulk-confirm.component.ts index 2396292e9af..05e302f011d 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/base-bulk-confirm.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/base-bulk-confirm.component.ts @@ -8,8 +8,8 @@ import { } from "@bitwarden/admin-console/common"; import { ProviderUserBulkPublicKeyResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user-bulk-public-key.response"; import { ProviderUserBulkResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user-bulk.response"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm-dialog.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm-dialog.component.ts index af827fa65fd..d3a8b8a2e71 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm-dialog.component.ts @@ -14,8 +14,8 @@ import { import { OrganizationUserStatusType } from "@bitwarden/common/admin-console/enums"; import { ProviderUserBulkPublicKeyResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user-bulk-public-key.response"; import { ProviderUserBulkResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user-bulk.response"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { StateProvider } from "@bitwarden/common/platform/state"; diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.ts index 704a94b0dd3..9d7752cde84 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.ts @@ -2,12 +2,17 @@ // @ts-strict-ignore import { DIALOG_DATA, DialogConfig } from "@angular/cdk/dialog"; import { Component, Inject } from "@angular/core"; +import { firstValueFrom } from "rxjs"; import { OrganizationUserApiService } from "@bitwarden/admin-console/common"; import { OrganizationUserStatusType } from "@bitwarden/common/admin-console/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { DialogService } from "@bitwarden/components"; +import { DeleteManagedMemberWarningService } from "../../services/delete-managed-member/delete-managed-member-warning.service"; + import { BulkUserDetails } from "./bulk-status.component"; type BulkDeleteDialogParams = { @@ -31,12 +36,20 @@ export class BulkDeleteDialogComponent { @Inject(DIALOG_DATA) protected dialogParams: BulkDeleteDialogParams, protected i18nService: I18nService, private organizationUserApiService: OrganizationUserApiService, + private configService: ConfigService, + private deleteManagedMemberWarningService: DeleteManagedMemberWarningService, ) { this.organizationId = dialogParams.organizationId; this.users = dialogParams.users; } async submit() { + if ( + await firstValueFrom(this.configService.getFeatureFlag$(FeatureFlag.AccountDeprovisioning)) + ) { + await this.deleteManagedMemberWarningService.acknowledgeWarning(this.organizationId); + } + try { this.loading = true; this.error = null; diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html index d66c43ac50f..ebe27afabf5 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html @@ -26,61 +26,47 @@ {{ "nonCompliantMembersError" | i18n }} + +
+
+ +
+ +
+ {{ user.name }} + + {{ user.email }} + +
+
+ +
{{ user.email }}
+
+
+
+

{{ "revokeUsersWarning" | i18n }}

- + - {{ "member" | i18n }} - {{ "details" | i18n }} + {{ (accountDeprovisioning.enabled ? "member" : "user") | i18n }} + + {{ "details" | i18n }} + - -
-
- -
-
- {{ user.email }} - {{ user.name }} -
-
+ + - - - - - - - {{ "noMasterPassword" | i18n }} - - - - -
-
- - - - - {{ "user" | i18n }} - {{ "details" | i18n }} - - - - - - - - - {{ user.email }} - {{ user.name }} - - + - @@ -95,55 +81,21 @@ - + - {{ "member" | i18n }} - {{ "status" | i18n }} + + {{ (accountDeprovisioning.enabled ? "member" : "user") | i18n }} + + {{ "status" | i18n }} - -
-
- -
-
- {{ user.email }} - {{ user.name }} -
-
- - - {{ statuses.get(user.id) }} - - - {{ "bulkFilteredMessage" | i18n }} - - -
-
- - - - - {{ "member" | i18n }} - {{ "status" | i18n }} - - - - - -
-
- -
-
- {{ user.email }} - {{ user.name }} -
-
+ + {{ statuses.get(user.id) }} diff --git a/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.ts b/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.ts index 7a30eba9e12..ef7c76b3727 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.ts @@ -53,6 +53,7 @@ import { convertToSelectionView, PermissionMode, } from "../../../shared/components/access-selector"; +import { DeleteManagedMemberWarningService } from "../../services/delete-managed-member/delete-managed-member-warning.service"; import { commaSeparatedEmails } from "./validators/comma-separated-emails.validator"; import { inputEmailLimitValidator } from "./validators/input-email-limit.validator"; @@ -176,6 +177,7 @@ export class MemberDialogComponent implements OnDestroy { organizationService: OrganizationService, private toastService: ToastService, private configService: ConfigService, + private deleteManagedMemberWarningService: DeleteManagedMemberWarningService, ) { this.organization$ = accountService.activeAccount$.pipe( switchMap((account) => @@ -639,6 +641,27 @@ export class MemberDialogComponent implements OnDestroy { return; } + const showWarningDialog = combineLatest([ + this.organization$, + this.deleteManagedMemberWarningService.warningAcknowledged(this.params.organizationId), + this.accountDeprovisioningEnabled$, + ]).pipe( + map( + ([organization, acknowledged, featureFlagEnabled]) => + featureFlagEnabled && + organization.canManageUsers && + organization.productTierType === ProductTierType.Enterprise && + !acknowledged, + ), + ); + + if (await firstValueFrom(showWarningDialog)) { + const acknowledged = await this.deleteManagedMemberWarningService.showWarning(); + if (!acknowledged) { + return; + } + } + const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "deleteOrganizationUser", @@ -667,6 +690,10 @@ export class MemberDialogComponent implements OnDestroy { title: null, message: this.i18nService.t("organizationUserDeleted", this.params.name), }); + + if (await firstValueFrom(this.accountDeprovisioningEnabled$)) { + await this.deleteManagedMemberWarningService.acknowledgeWarning(this.params.organizationId); + } this.close(MemberDialogResult.Deleted); }; diff --git a/apps/web/src/app/admin-console/organizations/members/members.component.ts b/apps/web/src/app/admin-console/organizations/members/members.component.ts index 1ea77642229..df4517942f7 100644 --- a/apps/web/src/app/admin-console/organizations/members/members.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/members.component.ts @@ -46,8 +46,8 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction"; import { isNotSelfUpgradable, ProductTierType } from "@bitwarden/common/billing/enums"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; @@ -81,6 +81,7 @@ import { ResetPasswordComponent, ResetPasswordDialogResult, } from "./components/reset-password.component"; +import { DeleteManagedMemberWarningService } from "./services/delete-managed-member/delete-managed-member-warning.service"; class MembersTableDataSource extends PeopleTableDataSource { protected statusType = OrganizationUserStatusType; @@ -138,6 +139,7 @@ export class MembersComponent extends BaseMembersComponent private collectionService: CollectionService, private billingApiService: BillingApiServiceAbstraction, private configService: ConfigService, + protected deleteManagedMemberWarningService: DeleteManagedMemberWarningService, ) { super( apiService, @@ -585,6 +587,23 @@ export class MembersComponent extends BaseMembersComponent } async bulkDelete() { + if (this.accountDeprovisioningEnabled) { + const warningAcknowledged = await firstValueFrom( + this.deleteManagedMemberWarningService.warningAcknowledged(this.organization.id), + ); + + if ( + !warningAcknowledged && + this.organization.canManageUsers && + this.organization.productTierType === ProductTierType.Enterprise + ) { + const acknowledged = await this.deleteManagedMemberWarningService.showWarning(); + if (!acknowledged) { + return; + } + } + } + if (this.actionPromise != null) { return; } @@ -774,6 +793,23 @@ export class MembersComponent extends BaseMembersComponent } async deleteUser(user: OrganizationUserView) { + if (this.accountDeprovisioningEnabled) { + const warningAcknowledged = await firstValueFrom( + this.deleteManagedMemberWarningService.warningAcknowledged(this.organization.id), + ); + + if ( + !warningAcknowledged && + this.organization.canManageUsers && + this.organization.productTierType === ProductTierType.Enterprise + ) { + const acknowledged = await this.deleteManagedMemberWarningService.showWarning(); + if (!acknowledged) { + return false; + } + } + } + const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "deleteOrganizationUser", @@ -792,6 +828,10 @@ export class MembersComponent extends BaseMembersComponent return false; } + if (this.accountDeprovisioningEnabled) { + await this.deleteManagedMemberWarningService.acknowledgeWarning(this.organization.id); + } + this.actionPromise = this.organizationUserApiService.deleteOrganizationUser( this.organization.id, user.id, diff --git a/apps/web/src/app/admin-console/organizations/members/services/delete-managed-member/delete-managed-member-warning.service.spec.ts b/apps/web/src/app/admin-console/organizations/members/services/delete-managed-member/delete-managed-member-warning.service.spec.ts new file mode 100644 index 00000000000..45271f6f78b --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/members/services/delete-managed-member/delete-managed-member-warning.service.spec.ts @@ -0,0 +1,51 @@ +import { MockProxy, mock } from "jest-mock-extended"; +import { firstValueFrom } from "rxjs"; + +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { + FakeAccountService, + FakeStateProvider, + mockAccountServiceWith, +} from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; +import { DialogService } from "@bitwarden/components"; + +import { DeleteManagedMemberWarningService } from "./delete-managed-member-warning.service"; + +describe("Delete managed member warning service", () => { + const userId = Utils.newGuid() as UserId; + let accountService: FakeAccountService; + let stateProvider: FakeStateProvider; + let dialogService: MockProxy; + let warningService: DeleteManagedMemberWarningService; + + beforeEach(() => { + accountService = mockAccountServiceWith(userId); + stateProvider = new FakeStateProvider(accountService); + dialogService = mock(); + warningService = new DeleteManagedMemberWarningService(stateProvider, dialogService); + }); + + it("warningAcknowledged returns false for ids that have not acknowledged the warning", async () => { + const id = Utils.newGuid(); + const acknowledged = await firstValueFrom(warningService.warningAcknowledged(id)); + + expect(acknowledged).toEqual(false); + }); + + it("warningAcknowledged returns true for ids that have acknowledged the warning", async () => { + const id1 = Utils.newGuid(); + const id2 = Utils.newGuid(); + const id3 = Utils.newGuid(); + await warningService.acknowledgeWarning(id1); + await warningService.acknowledgeWarning(id3); + + const acknowledged1 = await firstValueFrom(warningService.warningAcknowledged(id1)); + const acknowledged2 = await firstValueFrom(warningService.warningAcknowledged(id2)); + const acknowledged3 = await firstValueFrom(warningService.warningAcknowledged(id3)); + + expect(acknowledged1).toEqual(true); + expect(acknowledged2).toEqual(false); + expect(acknowledged3).toEqual(true); + }); +}); diff --git a/apps/web/src/app/admin-console/organizations/members/services/delete-managed-member/delete-managed-member-warning.service.ts b/apps/web/src/app/admin-console/organizations/members/services/delete-managed-member/delete-managed-member-warning.service.ts new file mode 100644 index 00000000000..53ca0bbcaf8 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/members/services/delete-managed-member/delete-managed-member-warning.service.ts @@ -0,0 +1,70 @@ +import { Injectable } from "@angular/core"; +import { map } from "rxjs"; + +import { + DELETE_MANAGED_USER_WARNING, + StateProvider, + UserKeyDefinition, +} from "@bitwarden/common/platform/state"; +import { DialogService } from "@bitwarden/components"; + +export const SHOW_WARNING_KEY = new UserKeyDefinition( + DELETE_MANAGED_USER_WARNING, + "showDeleteManagedUserWarning", + { + deserializer: (b) => b, + clearOn: [], + }, +); + +@Injectable({ providedIn: "root" }) +export class DeleteManagedMemberWarningService { + private _acknowledged = this.stateProvider.getActive(SHOW_WARNING_KEY); + private acknowledgedState$ = this._acknowledged.state$; + + constructor( + private stateProvider: StateProvider, + private dialogService: DialogService, + ) {} + + async acknowledgeWarning(organizationId: string) { + await this._acknowledged.update((state) => { + if (!organizationId) { + return state; + } + if (!state) { + return [organizationId]; + } else if (!state.includes(organizationId)) { + return [...state, organizationId]; + } + return state; + }); + } + + async showWarning() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { + key: "deleteManagedUserWarning", + }, + content: { + key: "deleteManagedUserWarningDesc", + }, + type: "danger", + icon: "bwi-exclamation-circle", + acceptButtonText: { key: "continue" }, + cancelButtonText: { key: "cancel" }, + }); + + if (!confirmed) { + return false; + } + + return confirmed; + } + + warningAcknowledged(organizationId: string) { + return this.acknowledgedState$.pipe( + map((acknowledgedIds) => acknowledgedIds?.includes(organizationId) ?? false), + ); + } +} diff --git a/apps/web/src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.spec.ts b/apps/web/src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.spec.ts index 9b595859b21..eff417ead32 100644 --- a/apps/web/src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.spec.ts +++ b/apps/web/src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.spec.ts @@ -11,7 +11,7 @@ import { OrganizationService } from "@bitwarden/common/admin-console/abstraction import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { OrganizationKeysResponse } from "@bitwarden/common/admin-console/models/response/organization-keys.response"; import { OrganizationApiService } from "@bitwarden/common/admin-console/services/organization/organization-api.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { EncryptionType } from "@bitwarden/common/platform/enums"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/apps/web/src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.ts b/apps/web/src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.ts index 0fe9b75aa98..8e583d3106c 100644 --- a/apps/web/src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.ts +++ b/apps/web/src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.ts @@ -10,7 +10,7 @@ import { } from "@bitwarden/admin-console/common"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/apps/web/src/app/admin-console/organizations/settings/org-import.component.ts b/apps/web/src/app/admin-console/organizations/settings/org-import.component.ts index 78784bdd3d2..e7a0051253f 100644 --- a/apps/web/src/app/admin-console/organizations/settings/org-import.component.ts +++ b/apps/web/src/app/admin-console/organizations/settings/org-import.component.ts @@ -11,8 +11,8 @@ import { } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; -import { ImportComponent } from "@bitwarden/importer/ui"; import { ImportCollectionServiceAbstraction } from "@bitwarden/importer-core"; +import { ImportComponent } from "@bitwarden/importer-ui"; import { LooseComponentsModule, SharedModule } from "../../../shared"; import { ImportCollectionAdminService } from "../../../tools/import/import-collection-admin.service"; diff --git a/apps/web/src/app/auth/core/services/rotateable-key-set.service.spec.ts b/apps/web/src/app/auth/core/services/rotateable-key-set.service.spec.ts index e032f198291..1241ea88fe9 100644 --- a/apps/web/src/app/auth/core/services/rotateable-key-set.service.spec.ts +++ b/apps/web/src/app/auth/core/services/rotateable-key-set.service.spec.ts @@ -1,7 +1,7 @@ import { TestBed } from "@angular/core/testing"; import { mock, MockProxy } from "jest-mock-extended"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { KeyService } from "@bitwarden/key-management"; diff --git a/apps/web/src/app/auth/core/services/rotateable-key-set.service.ts b/apps/web/src/app/auth/core/services/rotateable-key-set.service.ts index 044f140c53c..dca37f93c36 100644 --- a/apps/web/src/app/auth/core/services/rotateable-key-set.service.ts +++ b/apps/web/src/app/auth/core/services/rotateable-key-set.service.ts @@ -1,7 +1,7 @@ import { inject, Injectable } from "@angular/core"; import { RotateableKeySet } from "@bitwarden/auth/common"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { KeyService } from "@bitwarden/key-management"; diff --git a/apps/web/src/app/auth/emergency-access/services/emergency-access.service.spec.ts b/apps/web/src/app/auth/emergency-access/services/emergency-access.service.spec.ts index 1c7d870175d..dfeb53f0c19 100644 --- a/apps/web/src/app/auth/emergency-access/services/emergency-access.service.spec.ts +++ b/apps/web/src/app/auth/emergency-access/services/emergency-access.service.spec.ts @@ -4,11 +4,11 @@ import { MockProxy } from "jest-mock-extended"; import mock from "jest-mock-extended/lib/Mock"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { BulkEncryptService } from "@bitwarden/common/key-management/crypto/abstractions/bulk-encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { UserKeyResponse } from "@bitwarden/common/models/response/user-key.response"; -import { BulkEncryptService } from "@bitwarden/common/platform/abstractions/bulk-encrypt.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { EncryptionType } from "@bitwarden/common/platform/enums"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/apps/web/src/app/auth/emergency-access/services/emergency-access.service.ts b/apps/web/src/app/auth/emergency-access/services/emergency-access.service.ts index 62a59da2995..7ac2f21a223 100644 --- a/apps/web/src/app/auth/emergency-access/services/emergency-access.service.ts +++ b/apps/web/src/app/auth/emergency-access/services/emergency-access.service.ts @@ -6,9 +6,9 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyData } from "@bitwarden/common/admin-console/models/data/policy.data"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { BulkEncryptService } from "@bitwarden/common/platform/abstractions/bulk-encrypt.service"; +import { BulkEncryptService } from "@bitwarden/common/key-management/crypto/abstractions/bulk-encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/apps/web/src/app/auth/organization-invite/accept-organization.service.spec.ts b/apps/web/src/app/auth/organization-invite/accept-organization.service.spec.ts index b3709a15882..f613bdc7ddc 100644 --- a/apps/web/src/app/auth/organization-invite/accept-organization.service.spec.ts +++ b/apps/web/src/app/auth/organization-invite/accept-organization.service.spec.ts @@ -12,7 +12,7 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { ResetPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/reset-password-policy-options"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { FakeGlobalState } from "@bitwarden/common/spec/fake-state"; diff --git a/apps/web/src/app/auth/organization-invite/accept-organization.service.ts b/apps/web/src/app/auth/organization-invite/accept-organization.service.ts index a964d676159..22a79ef3696 100644 --- a/apps/web/src/app/auth/organization-invite/accept-organization.service.ts +++ b/apps/web/src/app/auth/organization-invite/accept-organization.service.ts @@ -16,7 +16,7 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { OrganizationKeysRequest } from "@bitwarden/common/admin-console/models/request/organization-keys.request"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; diff --git a/apps/web/src/app/auth/settings/account/account.component.html b/apps/web/src/app/auth/settings/account/account.component.html index 9f405c65083..c5edc021614 100644 --- a/apps/web/src/app/auth/settings/account/account.component.html +++ b/apps/web/src/app/auth/settings/account/account.component.html @@ -9,7 +9,7 @@
- + - - -
- -
- -
- -
-
- - - - -
-
- - -
-
- -
- - -
-
-
- - -
-
- - -
-
-
-
- - -
-
-
-
- - -
-
- - -
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
- - -
-
-
-
-
- - -
-
-
-
- - -
-
- - -
-
-
- - -
-
- - -
-
-
-
-
- - -
-
- - diff --git a/apps/web/src/app/tools/generator.component.ts b/apps/web/src/app/tools/generator.component.ts deleted file mode 100644 index a11c0c4a97b..00000000000 --- a/apps/web/src/app/tools/generator.component.ts +++ /dev/null @@ -1,73 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, NgZone } from "@angular/core"; -import { ActivatedRoute } from "@angular/router"; - -import { GeneratorComponent as BaseGeneratorComponent } from "@bitwarden/angular/tools/generator/components/generator.component"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { DialogService, ToastService } from "@bitwarden/components"; -import { - PasswordGenerationServiceAbstraction, - UsernameGenerationServiceAbstraction, -} from "@bitwarden/generator-legacy"; - -import { PasswordGeneratorHistoryComponent } from "./password-generator-history.component"; - -@Component({ - selector: "app-generator", - templateUrl: "generator.component.html", -}) -export class GeneratorComponent extends BaseGeneratorComponent { - constructor( - passwordGenerationService: PasswordGenerationServiceAbstraction, - usernameGenerationService: UsernameGenerationServiceAbstraction, - accountService: AccountService, - platformUtilsService: PlatformUtilsService, - i18nService: I18nService, - logService: LogService, - route: ActivatedRoute, - ngZone: NgZone, - private dialogService: DialogService, - toastService: ToastService, - ) { - super( - passwordGenerationService, - usernameGenerationService, - platformUtilsService, - accountService, - i18nService, - logService, - route, - ngZone, - window, - toastService, - ); - if (platformUtilsService.isSelfHost()) { - // Allow only valid email forwarders for self host - this.forwardOptions = this.forwardOptions.filter((forwarder) => forwarder.validForSelfHosted); - } - } - - get isSelfHosted(): boolean { - return this.platformUtilsService.isSelfHost(); - } - - async history() { - this.dialogService.open(PasswordGeneratorHistoryComponent); - } - - lengthChanged() { - document.getElementById("length").focus(); - } - - minNumberChanged() { - document.getElementById("min-number").focus(); - } - - minSpecialChanged() { - document.getElementById("min-special").focus(); - } -} diff --git a/apps/web/src/app/tools/import/import-web.component.ts b/apps/web/src/app/tools/import/import-web.component.ts index 3f1d5155039..a527b9e71f4 100644 --- a/apps/web/src/app/tools/import/import-web.component.ts +++ b/apps/web/src/app/tools/import/import-web.component.ts @@ -1,7 +1,7 @@ import { Component } from "@angular/core"; import { Router } from "@angular/router"; -import { ImportComponent } from "@bitwarden/importer/ui"; +import { ImportComponent } from "@bitwarden/importer-ui"; import { HeaderModule } from "../../layouts/header/header.module"; import { SharedModule } from "../../shared"; diff --git a/apps/web/src/app/tools/password-generator-history.component.html b/apps/web/src/app/tools/password-generator-history.component.html deleted file mode 100644 index eabb45ece2d..00000000000 --- a/apps/web/src/app/tools/password-generator-history.component.html +++ /dev/null @@ -1,47 +0,0 @@ - - - {{ "passwordHistory" | i18n }} - - - - - - - - - {{ h.date | date: "medium" }} - - - - - - - - -
- {{ "noPasswordsInList" | i18n }} -
-
- - - - -
diff --git a/apps/web/src/app/tools/password-generator-history.component.ts b/apps/web/src/app/tools/password-generator-history.component.ts deleted file mode 100644 index 0c7c9c4e221..00000000000 --- a/apps/web/src/app/tools/password-generator-history.component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component } from "@angular/core"; - -import { PasswordGeneratorHistoryComponent as BasePasswordGeneratorHistoryComponent } from "@bitwarden/angular/tools/generator/components/password-generator-history.component"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -@Component({ - selector: "app-password-generator-history", - templateUrl: "password-generator-history.component.html", -}) -export class PasswordGeneratorHistoryComponent extends BasePasswordGeneratorHistoryComponent { - constructor( - passwordGenerationService: PasswordGenerationServiceAbstraction, - platformUtilsService: PlatformUtilsService, - i18nService: I18nService, - toastService: ToastService, - ) { - super(passwordGenerationService, platformUtilsService, i18nService, window, toastService); - } -} diff --git a/apps/web/src/app/tools/send/send-access-file.component.ts b/apps/web/src/app/tools/send/send-access-file.component.ts index b55e955f355..05408bc34f7 100644 --- a/apps/web/src/app/tools/send/send-access-file.component.ts +++ b/apps/web/src/app/tools/send/send-access-file.component.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { Component, Input } from "@angular/core"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; diff --git a/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.html b/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.html index fbe0649c7aa..61fc290f6fe 100644 --- a/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.html +++ b/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.html @@ -70,11 +70,11 @@
- {{ "grantAddAccessCollectionWarning" | i18n }} + {{ "grantManageCollectionWarning" | i18n }} {{ "grantCollectionAccess" | i18n }} {{ diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts index 0af0d720b0e..eb2289d7229 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts @@ -366,6 +366,9 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { const cipherData = new CipherData(cipherResponse); cipher = new Cipher(cipherData); + + // Update organizationUseTotp from server response + this.cipher.organizationUseTotp = cipher.organizationUseTotp; } // Store the updated cipher so any following edits use the most up to date cipher diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html index 7e59853851c..befeee43f69 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html @@ -22,7 +22,7 @@ [routerLink]="[]" [queryParams]="{ itemId: cipher.id, action: clickAction }" queryParamsHandling="merge" - [replaceUrl]="extensionRefreshEnabled" + [replaceUrl]="true" title="{{ 'editItemWithName' | i18n: cipher.name }}" type="button" appStopProp diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts index 4af08e19d74..5f686fcec9c 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts @@ -1,12 +1,9 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; -import { firstValueFrom } from "rxjs"; import { CollectionView } from "@bitwarden/admin-console/common"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -25,11 +22,6 @@ import { RowHeightClass } from "./vault-items.component"; export class VaultCipherRowComponent implements OnInit { protected RowHeightClass = RowHeightClass; - /** - * Flag to determine if the extension refresh feature flag is enabled. - */ - protected extensionRefreshEnabled = false; - @Input() disabled: boolean; @Input() cipher: CipherView; @Input() showOwner: boolean; @@ -61,19 +53,12 @@ export class VaultCipherRowComponent implements OnInit { ]; protected organization?: Organization; - constructor( - private configService: ConfigService, - private i18nService: I18nService, - ) {} + constructor(private i18nService: I18nService) {} /** * Lifecycle hook for component initialization. - * Checks if the extension refresh feature flag is enabled to provide to template. */ async ngOnInit(): Promise { - this.extensionRefreshEnabled = await firstValueFrom( - this.configService.getFeatureFlag$(FeatureFlag.ExtensionRefresh), - ); if (this.cipher.organizationId != null) { this.organization = this.organizations.find((o) => o.id === this.cipher.organizationId); } @@ -83,7 +68,7 @@ export class VaultCipherRowComponent implements OnInit { if (this.cipher.decryptionFailure) { return "showFailedToDecrypt"; } - return this.extensionRefreshEnabled ? "view" : null; + return "view"; } protected get showTotpCopyButton() { diff --git a/apps/web/src/app/vault/individual-vault/add-edit.component.ts b/apps/web/src/app/vault/individual-vault/add-edit.component.ts index 62ce55848f5..02dcbc30161 100644 --- a/apps/web/src/app/vault/individual-vault/add-edit.component.ts +++ b/apps/web/src/app/vault/individual-vault/add-edit.component.ts @@ -143,11 +143,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On }, 1000); } - const extensionRefreshEnabled = await firstValueFrom( - this.configService.getFeatureFlag$(FeatureFlag.ExtensionRefresh), - ); - - this.cardIsExpired = extensionRefreshEnabled && isCardExpired(this.cipher.card); + this.cardIsExpired = isCardExpired(this.cipher.card); } ngOnDestroy() { diff --git a/apps/web/src/app/vault/individual-vault/attachments.component.ts b/apps/web/src/app/vault/individual-vault/attachments.component.ts index a6c25b71fd4..c6079dbe78f 100644 --- a/apps/web/src/app/vault/individual-vault/attachments.component.ts +++ b/apps/web/src/app/vault/individual-vault/attachments.component.ts @@ -4,7 +4,7 @@ import { AttachmentsComponent as BaseAttachmentsComponent } from "@bitwarden/ang import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.html b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.html index 8ac6138db7c..8d576098a74 100644 --- a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.html +++ b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.html @@ -69,88 +69,48 @@
- - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + +
diff --git a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts index 75b39a2ca40..63af397e726 100644 --- a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts @@ -9,13 +9,10 @@ import { OnInit, Output, } from "@angular/core"; -import { firstValueFrom } from "rxjs"; import { Unassigned, CollectionView } from "@bitwarden/admin-console/common"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node"; @@ -50,7 +47,6 @@ export class VaultHeaderComponent implements OnInit { protected All = All; protected CollectionDialogTabType = CollectionDialogTabType; protected CipherType = CipherType; - protected extensionRefreshEnabled: boolean; /** * Boolean to determine the loading state of the header. @@ -85,16 +81,9 @@ export class VaultHeaderComponent implements OnInit { /** Emits an event when the delete collection button is clicked in the header */ @Output() onDeleteCollection = new EventEmitter(); - constructor( - private i18nService: I18nService, - private configService: ConfigService, - ) {} + constructor(private i18nService: I18nService) {} - async ngOnInit() { - this.extensionRefreshEnabled = await firstValueFrom( - this.configService.getFeatureFlag$(FeatureFlag.ExtensionRefresh), - ); - } + async ngOnInit() {} /** * The id of the organization that is currently being filtered on. diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.html b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.html index b9647e3237d..aa56daac071 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.html +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.html @@ -22,12 +22,7 @@

{{ "onboardingImportDataDetailsPartOne" | i18n }} {{ "onboardingImportDataDetailsPartTwoNoOrgs" | i18n }} diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts index e017bc9b35d..327a077dc6a 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts @@ -7,7 +7,6 @@ import { Subject, of } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateProvider } from "@bitwarden/common/platform/state"; @@ -28,7 +27,6 @@ describe("VaultOnboardingComponent", () => { let mockStateProvider: Partial; let setInstallExtLinkSpy: any; let individualVaultPolicyCheckSpy: any; - let mockConfigService: MockProxy; beforeEach(() => { mockPolicyService = mock(); @@ -47,7 +45,6 @@ describe("VaultOnboardingComponent", () => { }), ), }; - mockConfigService = mock(); // eslint-disable-next-line @typescript-eslint/no-floating-promises TestBed.configureTestingModule({ @@ -60,7 +57,6 @@ describe("VaultOnboardingComponent", () => { { provide: I18nService, useValue: mockI18nService }, { provide: ApiService, useValue: mockApiService }, { provide: StateProvider, useValue: mockStateProvider }, - { provide: ConfigService, useValue: mockConfigService }, ], }).compileComponents(); fixture = TestBed.createComponent(VaultOnboardingComponent); diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts index 3535d31852e..e3bd8fc10bd 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts @@ -18,8 +18,6 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; @@ -58,14 +56,12 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy { protected onboardingTasks$: Observable; protected showOnboarding = false; - protected extensionRefreshEnabled = false; constructor( protected platformUtilsService: PlatformUtilsService, protected policyService: PolicyService, private apiService: ApiService, private vaultOnboardingService: VaultOnboardingServiceAbstraction, - private configService: ConfigService, ) {} async ngOnInit() { @@ -74,9 +70,6 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy { this.setInstallExtLink(); this.individualVaultPolicyCheck(); this.checkForBrowserExtension(); - this.extensionRefreshEnabled = await this.configService.getFeatureFlag( - FeatureFlag.ExtensionRefresh, - ); } async ngOnChanges(changes: SimpleChanges) { diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts index 950c1d77731..ff8a008bcc5 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault.component.ts @@ -1,15 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { DialogRef } from "@angular/cdk/dialog"; -import { - ChangeDetectorRef, - Component, - NgZone, - OnDestroy, - OnInit, - ViewChild, - ViewContainerRef, -} from "@angular/core"; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { ActivatedRoute, Params, Router } from "@angular/router"; import { BehaviorSubject, @@ -42,7 +34,6 @@ import { Unassigned, } from "@bitwarden/admin-console/common"; import { SearchPipe } from "@bitwarden/angular/pipes/search.pipe"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; @@ -57,9 +48,7 @@ import { OrganizationBillingServiceAbstraction } from "@bitwarden/common/billing import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction"; import { EventType } from "@bitwarden/common/enums"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -71,7 +60,6 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; -import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { ServiceUtils } from "@bitwarden/common/vault/service-utils"; @@ -105,13 +93,11 @@ import { VaultItemEvent } from "../components/vault-items/vault-item-event"; import { VaultItemsModule } from "../components/vault-items/vault-items.module"; import { getNestedCollectionTree } from "../utils/collection-utils"; -import { AddEditComponent } from "./add-edit.component"; import { AttachmentDialogCloseResult, AttachmentDialogResult, AttachmentsV2Component, } from "./attachments-v2.component"; -import { AttachmentsComponent } from "./attachments.component"; import { BulkDeleteDialogResult, openBulkDeleteDialog, @@ -160,15 +146,6 @@ const SearchTextDebounceInterval = 200; }) export class VaultComponent implements OnInit, OnDestroy { @ViewChild("vaultFilter", { static: true }) filterComponent: VaultFilterComponent; - @ViewChild("attachments", { read: ViewContainerRef, static: true }) - attachmentsModalRef: ViewContainerRef; - @ViewChild("folderAddEdit", { read: ViewContainerRef, static: true }) - folderAddEditModalRef: ViewContainerRef; - @ViewChild("cipherAddEdit", { read: ViewContainerRef, static: true }) - cipherAddEditModalRef: ViewContainerRef; - @ViewChild("share", { read: ViewContainerRef, static: true }) shareModalRef: ViewContainerRef; - @ViewChild("collectionsModal", { read: ViewContainerRef, static: true }) - collectionsModalRef: ViewContainerRef; trashCleanupWarning: string = null; kdfIterations: number; @@ -193,7 +170,6 @@ export class VaultComponent implements OnInit, OnDestroy { private searchText$ = new Subject(); private refresh$ = new BehaviorSubject(null); private destroy$ = new Subject(); - private extensionRefreshEnabled: boolean; private hasSubscription$ = new BehaviorSubject(false); private vaultItemDialogRef?: DialogRef | undefined; @@ -260,7 +236,6 @@ export class VaultComponent implements OnInit, OnDestroy { private router: Router, private changeDetectorRef: ChangeDetectorRef, private i18nService: I18nService, - private modalService: ModalService, private dialogService: DialogService, private messagingService: MessagingService, private platformUtilsService: PlatformUtilsService, @@ -278,7 +253,6 @@ export class VaultComponent implements OnInit, OnDestroy { private eventCollectionService: EventCollectionService, private searchService: SearchService, private searchPipe: SearchPipe, - private configService: ConfigService, private apiService: ApiService, private billingAccountProfileStateService: BillingAccountProfileStateService, private toastService: ToastService, @@ -437,15 +411,15 @@ export class VaultComponent implements OnInit, OnDestroy { firstSetup$ .pipe( switchMap(() => this.route.queryParams), - // Only process the queryParams if the dialog is not open (only when extension refresh is enabled) - filter(() => this.vaultItemDialogRef == undefined || !this.extensionRefreshEnabled), + // Only process the queryParams if the dialog is not open + filter(() => this.vaultItemDialogRef == undefined), switchMap(async (params) => { const cipherId = getCipherIdFromParams(params); if (cipherId) { if (await this.cipherService.get(cipherId)) { let action = params.action; - // Default to "view" if extension refresh is enabled - if (action == null && this.extensionRefreshEnabled) { + // Default to "view" + if (action == null) { action = "view"; } @@ -544,11 +518,6 @@ export class VaultComponent implements OnInit, OnDestroy { this.refreshing = false; }, ); - - // Check if the extension refresh feature flag is enabled - this.extensionRefreshEnabled = await this.configService.getFeatureFlag( - FeatureFlag.ExtensionRefresh, - ); } ngOnDestroy() { @@ -642,8 +611,7 @@ export class VaultComponent implements OnInit, OnDestroy { * Handles opening the attachments dialog for a cipher. * Runs several checks to ensure that the user has the correct permissions * and then opens the attachments dialog. - * Uses the new AttachmentsV2Component if the extensionRefresh feature flag is enabled. - * + * Uses the new AttachmentsV2Component * @param cipher * @returns */ @@ -668,51 +636,20 @@ export class VaultComponent implements OnInit, OnDestroy { } } - const canEditAttachments = await this.canEditAttachments(cipher); + const dialogRef = AttachmentsV2Component.open(this.dialogService, { + cipherId: cipher.id as CipherId, + }); - let madeAttachmentChanges = false; + const result: AttachmentDialogCloseResult = await lastValueFrom(dialogRef.closed); - if (this.extensionRefreshEnabled) { - const dialogRef = AttachmentsV2Component.open(this.dialogService, { - cipherId: cipher.id as CipherId, - }); - - const result: AttachmentDialogCloseResult = await lastValueFrom(dialogRef.closed); - - if ( - result.action === AttachmentDialogResult.Uploaded || - result.action === AttachmentDialogResult.Removed - ) { - this.refresh(); - } - - return; + if ( + result.action === AttachmentDialogResult.Uploaded || + result.action === AttachmentDialogResult.Removed + ) { + this.refresh(); } - const [modal] = await this.modalService.openViewRef( - AttachmentsComponent, - this.attachmentsModalRef, - (comp) => { - comp.cipherId = cipher.id; - comp.viewOnly = !canEditAttachments; - comp.onUploadedAttachment - .pipe(takeUntil(this.destroy$)) - .subscribe(() => (madeAttachmentChanges = true)); - comp.onDeletedAttachment - .pipe(takeUntil(this.destroy$)) - .subscribe(() => (madeAttachmentChanges = true)); - comp.onReuploadedAttachment - .pipe(takeUntil(this.destroy$)) - .subscribe(() => (madeAttachmentChanges = true)); - }, - ); - - modal.onClosed.pipe(takeUntil(this.destroy$)).subscribe(() => { - if (madeAttachmentChanges) { - this.refresh(); - } - madeAttachmentChanges = false; - }); + return; } /** @@ -751,48 +688,13 @@ export class VaultComponent implements OnInit, OnDestroy { await this.go({ cipherId: null, itemId: null, action: null }); } - async addCipher(cipherType?: CipherType) { - const type = cipherType ?? this.activeFilter.cipherType; - - if (this.extensionRefreshEnabled) { - return this.addCipherV2(type); - } - - const component = (await this.editCipher(null)) as AddEditComponent; - component.type = type; - if ( - this.activeFilter.organizationId !== "MyVault" && - this.activeFilter.organizationId != null - ) { - component.organizationId = this.activeFilter.organizationId; - component.collections = ( - await firstValueFrom(this.vaultFilterService.filteredCollections$) - ).filter((c) => !c.readOnly && c.id != null); - } - const selectedColId = this.activeFilter.collectionId; - if (selectedColId !== "AllCollections" && selectedColId != null) { - const selectedCollection = ( - await firstValueFrom(this.vaultFilterService.filteredCollections$) - ).find((c) => c.id === selectedColId); - component.organizationId = selectedCollection?.organizationId; - if (!selectedCollection.readOnly) { - component.collectionIds = [selectedColId]; - } - } - component.folderId = this.activeFilter.folderId; - } - /** * Opens the add cipher dialog. * @param cipherType The type of cipher to add. - * @returns The dialog reference. */ - async addCipherV2(cipherType?: CipherType) { - const cipherFormConfig = await this.cipherFormConfigService.buildConfig( - "add", - null, - cipherType, - ); + async addCipher(cipherType?: CipherType) { + const type = cipherType ?? this.activeFilter.cipherType; + const cipherFormConfig = await this.cipherFormConfigService.buildConfig("add", null, type); const collectionId = this.activeFilter.collectionId !== "AllCollections" && this.activeFilter.collectionId != null ? this.activeFilter.collectionId @@ -823,6 +725,12 @@ export class VaultComponent implements OnInit, OnDestroy { return this.editCipherId(cipher?.id, cloneMode); } + /** + * Edit a cipher using the new VaultItemDialog. + * @param id + * @param cloneMode + * @returns + */ async editCipherId(id: string, cloneMode?: boolean) { const cipher = await this.cipherService.get(id); @@ -836,49 +744,6 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - if (this.extensionRefreshEnabled) { - await this.editCipherIdV2(cipher, cloneMode); - return; - } - - const [modal, childComponent] = await this.modalService.openViewRef( - AddEditComponent, - this.cipherAddEditModalRef, - (comp) => { - comp.cipherId = id; - comp.collectionId = this.selectedCollection?.node.id; - - comp.onSavedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - comp.onDeletedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - comp.onRestoredCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - }, - ); - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - modal.onClosedPromise().then(() => { - void this.go({ cipherId: null, itemId: null, action: null }); - }); - - return childComponent; - } - - /** - * Edit a cipher using the new VaultItemDialog. - * - * @param cipher - * @param cloneMode - */ - private async editCipherIdV2(cipher: Cipher, cloneMode?: boolean) { const cipherFormConfig = await this.cipherFormConfigService.buildConfig( cloneMode ? "clone" : "edit", cipher.id as CipherId, @@ -1076,11 +941,7 @@ export class VaultComponent implements OnInit, OnDestroy { } } - const component = await this.editCipher(cipher, true); - - if (component != null) { - component.cloneMode = true; - } + await this.editCipher(cipher, true); } restore = async (c: CipherView): Promise => { @@ -1331,15 +1192,6 @@ export class VaultComponent implements OnInit, OnDestroy { this.refresh$.next(); } - private async canEditAttachments(cipher: CipherView) { - if (cipher.organizationId == null || cipher.edit) { - return true; - } - - const organization = this.allOrganizations.find((o) => o.id === cipher.organizationId); - return organization.canEditAllCiphers; - } - private async go(queryParams: any = null) { if (queryParams == null) { queryParams = { diff --git a/apps/web/src/app/vault/org-vault/attachments.component.ts b/apps/web/src/app/vault/org-vault/attachments.component.ts index c8badffb36f..37136a86cdb 100644 --- a/apps/web/src/app/vault/org-vault/attachments.component.ts +++ b/apps/web/src/app/vault/org-vault/attachments.component.ts @@ -6,7 +6,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.html b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.html index 8178e3b2935..edba6e4753c 100644 --- a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.html +++ b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.html @@ -104,8 +104,8 @@ *ngIf="filter.type !== 'trash' && filter.collectionId !== Unassigned && organization" class="tw-shrink-0" > - - + +

- - - -
- - - - - -
- - - - - - -
diff --git a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts index 7f118a48db3..e3c99231a86 100644 --- a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts +++ b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts @@ -13,7 +13,6 @@ import { import { JslibModule } from "@bitwarden/angular/jslib.module"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { ProductTierType } from "@bitwarden/common/billing/enums"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -90,11 +89,6 @@ export class VaultHeaderComponent implements OnInit { protected CollectionDialogTabType = CollectionDialogTabType; - /** - * Whether the extension refresh feature flag is enabled. - */ - protected extensionRefreshEnabled = false; - /** The cipher type enum. */ protected CipherType = CipherType; @@ -106,11 +100,7 @@ export class VaultHeaderComponent implements OnInit { private configService: ConfigService, ) {} - async ngOnInit() { - this.extensionRefreshEnabled = await this.configService.getFeatureFlag( - FeatureFlag.ExtensionRefresh, - ); - } + async ngOnInit() {} get title() { const headerType = this.i18nService.t("collections").toLowerCase(); diff --git a/apps/web/src/app/vault/org-vault/vault.component.ts b/apps/web/src/app/vault/org-vault/vault.component.ts index fe76f9842e9..b4ba9ff5512 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -1,15 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { DialogRef } from "@angular/cdk/dialog"; -import { - ChangeDetectorRef, - Component, - NgZone, - OnDestroy, - OnInit, - ViewChild, - ViewContainerRef, -} from "@angular/core"; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute, Params, Router } from "@angular/router"; import { BehaviorSubject, @@ -37,12 +29,10 @@ import { import { CollectionAdminService, CollectionAdminView, - CollectionService, CollectionView, Unassigned, } from "@bitwarden/admin-console/common"; import { SearchPipe } from "@bitwarden/angular/pipes/search.pipe"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; @@ -127,7 +117,6 @@ import { import { VaultHeaderComponent } from "../org-vault/vault-header/vault-header.component"; import { getNestedCollectionTree } from "../utils/collection-utils"; -import { AddEditComponent } from "./add-edit.component"; import { BulkCollectionsDialogComponent, BulkCollectionsDialogResult, @@ -166,13 +155,6 @@ enum AddAccessStatusType { export class VaultComponent implements OnInit, OnDestroy { protected Unassigned = Unassigned; - @ViewChild("attachments", { read: ViewContainerRef, static: true }) - attachmentsModalRef: ViewContainerRef; - @ViewChild("cipherAddEdit", { read: ViewContainerRef, static: true }) - cipherAddEditModalRef: ViewContainerRef; - @ViewChild("collectionsModal", { read: ViewContainerRef, static: true }) - collectionsModalRef: ViewContainerRef; - trashCleanupWarning: string = null; activeFilter: VaultFilter = new VaultFilter(); @@ -210,7 +192,6 @@ export class VaultComponent implements OnInit, OnDestroy { private refresh$ = new BehaviorSubject(null); private destroy$ = new Subject(); protected addAccessStatus$ = new BehaviorSubject(0); - private extensionRefreshEnabled: boolean; private resellerManagedOrgAlert: boolean; private vaultItemDialogRef?: DialogRef | undefined; @@ -249,7 +230,6 @@ export class VaultComponent implements OnInit, OnDestroy { private changeDetectorRef: ChangeDetectorRef, private syncService: SyncService, private i18nService: I18nService, - private modalService: ModalService, private dialogService: DialogService, private messagingService: MessagingService, private broadcasterService: BroadcasterService, @@ -265,7 +245,6 @@ export class VaultComponent implements OnInit, OnDestroy { private eventCollectionService: EventCollectionService, private totpService: TotpService, private apiService: ApiService, - private collectionService: CollectionService, private toastService: ToastService, private configService: ConfigService, private cipherFormConfigService: CipherFormConfigService, @@ -278,10 +257,6 @@ export class VaultComponent implements OnInit, OnDestroy { ) {} async ngOnInit() { - this.extensionRefreshEnabled = await this.configService.getFeatureFlag( - FeatureFlag.ExtensionRefresh, - ); - this.resellerManagedOrgAlert = await this.configService.getFeatureFlag( FeatureFlag.ResellerManagedOrgAlert, ); @@ -555,7 +530,7 @@ export class VaultComponent implements OnInit, OnDestroy { firstSetup$ .pipe( switchMap(() => combineLatest([this.route.queryParams, allCipherMap$])), - filter(() => this.vaultItemDialogRef == undefined || !this.extensionRefreshEnabled), + filter(() => this.vaultItemDialogRef == undefined), switchMap(async ([qParams, allCiphersMap]) => { const cipherId = getCipherIdFromParams(qParams); @@ -586,15 +561,15 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - // Default to "view" if extension refresh is enabled - if (action == null && this.extensionRefreshEnabled) { + // Default to "view" + if (action == null) { action = "view"; } if (action === "view") { await this.viewCipherById(cipher); } else { - await this.editCipherId(cipher, false); + await this.editCipher(cipher, false); } } else { this.toastService.showToast({ @@ -836,27 +811,8 @@ export class VaultComponent implements OnInit, OnDestroy { } } + /** Opens the Add/Edit Dialog */ async addCipher(cipherType?: CipherType) { - if (this.extensionRefreshEnabled) { - return this.addCipherV2(cipherType); - } - - let collections: CollectionView[] = []; - - // Admins limited to only adding items to collections they have access to. - collections = await firstValueFrom(this.editableCollections$); - - await this.editCipher(null, false, (comp) => { - comp.type = cipherType || this.activeFilter.cipherType; - comp.collections = collections; - if (this.activeFilter.collectionId) { - comp.collectionIds = [this.activeFilter.collectionId]; - } - }); - } - - /** Opens the Add/Edit Dialog. Only to be used when the BrowserExtension feature flag is active */ - async addCipherV2(cipherType?: CipherType) { const cipherFormConfig = await this.cipherFormConfigService.buildConfig( "add", null, @@ -877,24 +833,8 @@ export class VaultComponent implements OnInit, OnDestroy { * Edit the given cipher or add a new cipher * @param cipherView - When set, the cipher to be edited * @param cloneCipher - `true` when the cipher should be cloned. - * Used in place of the `additionalComponentParameters`, as - * the `editCipherIdV2` method has a differing implementation. - * @param defaultComponentParameters - A method that takes in an instance of - * the `AddEditComponent` to edit methods directly. */ - async editCipher( - cipher: CipherView | null, - cloneCipher: boolean, - additionalComponentParameters?: (comp: AddEditComponent) => void, - ) { - return this.editCipherId(cipher, cloneCipher, additionalComponentParameters); - } - - async editCipherId( - cipher: CipherView | null, - cloneCipher: boolean, - additionalComponentParameters?: (comp: AddEditComponent) => void, - ) { + async editCipher(cipher: CipherView | null, cloneCipher: boolean) { if ( cipher && cipher.reprompt !== 0 && @@ -905,55 +845,6 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - if (this.extensionRefreshEnabled) { - await this.editCipherIdV2(cipher, cloneCipher); - return; - } - - const defaultComponentParameters = (comp: AddEditComponent) => { - comp.organization = this.organization; - comp.organizationId = this.organization.id; - comp.cipherId = cipher?.id; - comp.collectionId = this.activeFilter.collectionId; - comp.onSavedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - comp.onDeletedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - comp.onRestoredCipher.pipe(takeUntil(this.destroy$)).subscribe(() => { - modal.close(); - this.refresh(); - }); - }; - - const [modal, childComponent] = await this.modalService.openViewRef( - AddEditComponent, - this.cipherAddEditModalRef, - additionalComponentParameters == null - ? defaultComponentParameters - : (comp) => { - defaultComponentParameters(comp); - additionalComponentParameters(comp); - }, - ); - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - modal.onClosedPromise().then(() => { - this.go({ cipherId: null, itemId: null, action: null }); - }); - - return childComponent; - } - - /** - * Edit a cipher using the new AddEditCipherDialogV2 component. - * Only to be used behind the ExtensionRefresh feature flag. - */ - private async editCipherIdV2(cipher: CipherView | null, cloneCipher: boolean) { const cipherFormConfig = await this.cipherFormConfigService.buildConfig( cloneCipher ? "clone" : "edit", cipher?.id as CipherId | null, @@ -1038,16 +929,7 @@ export class VaultComponent implements OnInit, OnDestroy { } } - let collections: CollectionView[] = []; - - // Admins limited to only adding items to collections they have access to. - collections = await firstValueFrom(this.editableCollections$); - - await this.editCipher(cipher, true, (comp) => { - comp.cloneMode = true; - comp.collections = collections; - comp.collectionIds = cipher.collectionIds; - }); + await this.editCipher(cipher, true); } restore = async (c: CipherView): Promise => { diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index a6f4e282b74..6addd540801 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Wysig vouer" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Basisdomein", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "bv.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Dien in" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "’n Kennisgewing is na u toestel gestuur." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Weergawe $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Hergenereer wagwoord" - }, "length": { "message": "Lengte" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Bestuur" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Deaktiveer" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "U herstelkode vir Bitwarden-tweestapaantekening" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Stel minimum vereistes vir opstelling van wagwoordgenereerder." }, - "passwordGeneratorPolicyInEffect": { - "message": "Een of meer organisasiebeleide beïnvloed u genereerderinstellings." - }, "masterPasswordPolicyInEffect": { "message": "Een of meer organisasiebeleide stel die volgende eise aan u hoofwagwoord:" }, @@ -6681,15 +6717,6 @@ "message": "Genereerder", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Wat wil u genereer?" - }, - "passwordType": { - "message": "Wagwoordtipe" - }, - "regenerateUsername": { - "message": "Hergenereer gebruikersnaam" - }, "generateUsername": { "message": "Genereer gebruikersnaam" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Gebruikersnaamtipe" - }, "plusAddressedEmail": { "message": "E-posadres met plus", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Gasheernaam", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-toegangsteken" - }, "deviceVerification": { "message": "Toestelbevestiging" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Geen versameling" }, - "canView": { - "message": "Kan bekyk" - }, - "canViewExceptPass": { - "message": "Kan bekyk, behalwe wagwoorde" - }, - "canEdit": { - "message": "Kan wysig" - }, - "canEditExceptPass": { - "message": "Kan wysig behalwe wagwoorde" - }, "noCollectionsAdded": { "message": "Geen versamelings toegevoeg" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 78536d62d2c..dc8fc7a900f 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "تعديل المجلد" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "النطاق الأساسي", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "مثال.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "بَدْء تسجيل الدخول" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "قدِّم" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "تم إرسال إشعار إلى جهازك." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "الإصدار $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "إعادة توليد كلمة المرور" - }, "length": { "message": "الطول" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "إدارة" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "المولّد", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "ما الذي ترغب في توليده؟" - }, - "passwordType": { - "message": "نوع كلمة المرور" - }, - "regenerateUsername": { - "message": "إعادة توليد اسم المستخدم" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "اسم المضيف", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index e53908cf452..4c49936c88e 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Qovluğa düzəliş et" }, + "newFolder": { + "message": "Yeni qovluq" + }, + "folderName": { + "message": "Qovluq adı" + }, + "folderHintText": { + "message": "Ana qovluğun adından sonra \"/\" əlavə edərək qovluğu ardıcıl yerləşdirin. Nümunə: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Bu qovluğu həmişəlik silmək istədiyinizə əminsiniz?" + }, "baseDomain": { "message": "Baza domeni", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Element adı" }, - "cannotRemoveViewOnlyCollections": { - "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "məs.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Giriş etmə başladıldı" }, + "logInRequestSent": { + "message": "Tələb göndərildi" + }, "submit": { "message": "Göndər" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Cihazınıza bir bildiriş göndərildi." }, + "notificationSentDevicePart1": { + "message": "Cihazınızda Bitwarden kilidini açın, ya da " + }, + "areYouTryingToAccessYourAccount": { + "message": "Hesabınıza müraciət etməyə çalışırsınız?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ ilə müraciət cəhdi", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Müraciəti təsdiqlə" + }, + "denyAccess": { + "message": "Müraciətə rədd cavabı ver" + }, + "notificationSentDeviceAnchor": { + "message": "veb tətbiqinizdə" + }, + "notificationSentDevicePart2": { + "message": "Təsdiqləməzdən əvvəl Barmaq izi ifadəsinin aşağıdakı ifadə ilə uyuşduğuna əmin olun." + }, + "notificationSentDeviceComplete": { + "message": "Cihazınızda Bitwarden-in kilidini açın. Təsdiqləməzdən əvvəl Barmaq izi ifadəsinin aşağıdakı ifadə ilə uyuşduğuna əmin olun." + }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildiriş göndərildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Hesabınızın kilidinin açıq olduğuna və barmaq izi ifadəsinin digər cihazda uyuşduğuna əmin olun" - }, "versionNumber": { "message": "Versiya $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Anlaşılmaz xarakterlərdən çəkin", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Parolu yenidən yarat" - }, "length": { "message": "Uzunluq" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "İdarə et" }, - "canManage": { - "message": "İdarə edə bilər" + "manageCollection": { + "message": "Kolleksiyanı idarə et" + }, + "viewItems": { + "message": "Elementlərə bax" + }, + "viewItemsHidePass": { + "message": "Elementlərə, gizli parollara bax" + }, + "editItems": { + "message": "Elementlərə düzəliş et" + }, + "editItemsHidePass": { + "message": "Elementlərə, gizli parollara düzəliş et" }, "disable": { "message": "Sıradan çıxart" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Güvənlik açarı oxunarkən problem yarandı. Yenidən sınayın." }, - "twoFactorWebAuthnWarning": { - "message": "Platforma məhdudiyyətlərinə görə, WebAuthn bütün Bitwarden tətbiqlərində istifadə edilə bilmir. WebAuthn istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki addımlı giriş provayderini fəallaşdırmalısınız. Dəstəklənən platformalar:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn dəstəkli brauzerə sahib masaüstü/dizüstü kompüterdə veb seyf və brauzer uzantıları (FIDO U2F açıq olan Chrome, Opera, Vivaldi və ya Firefox)." + "twoFactorWebAuthnWarning1": { + "message": "Platforma məhdudiyyətlərinə görə, WebAuthn bütün Bitwarden tətbiqlərində istifadə edilə bilmir. WebAuthn istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki addımlı giriş provayderini fəallaşdırmalısınız." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden iki addımlı giriş üçün geri qaytarma kodunuz" @@ -3013,7 +3052,7 @@ "message": "Əlavə istifadəçi yerləri" }, "userSeatsDesc": { - "message": "İstifadəçi sayı" + "message": "# / istifadəçi yeri" }, "userSeatsAdditionalDesc": { "message": "Planınızda $BASE_SEATS$ istifadəçi yeri var. İstifadəçiləri, istifadəçi/ay başına $SEAT_PRICE$ qarşılığında əlavə edə bilərsiniz.", @@ -4284,7 +4323,7 @@ "message": "Sirr Menecerinə abunəliyiniz üçün bir limit müəyyən edin. Bu limitə çatanda, yeni istifadəçiləri dəvət edə bilməyəcəksiniz." }, "maxSeatLimit": { - "message": "Maksimum yer limiti (ixtiyari)", + "message": "Yer limiti (ixtiyari)", "description": "Upper limit of seats to allow through autoscaling" }, "maxSeatCost": { @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Parol yaradıcı üçün tələbləri ayarla." }, - "passwordGeneratorPolicyInEffect": { - "message": "Bir və ya daha çox təşkilat siyasətləri yaradıcı seçimlərinizə təsir edir." - }, "masterPasswordPolicyInEffect": { "message": "Bir və ya daha çox təşkilat siyasəti, aşağıdakı tələbləri qarşılamaq üçün ana parolunuzu tələb edir:" }, @@ -6681,15 +6717,6 @@ "message": "Yaradıcı", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Nə yaratmaq istəyirsiniz?" - }, - "passwordType": { - "message": "Parol növü" - }, - "regenerateUsername": { - "message": "İstifadəçi adını yenidən yarat" - }, "generateUsername": { "message": "İstifadəçi adı yarat" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "İstifadəçi adı növü" - }, "plusAddressedEmail": { "message": "Plyus ünvanlı e-poçt", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Host adı", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API müraciət tokeni" - }, "deviceVerification": { "message": "Cihaz doğrulaması" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Kolleksiya yoxdur" }, - "canView": { - "message": "Baxa bilər" - }, - "canViewExceptPass": { - "message": "Parollar istisna olmaqla baxa bilər" - }, - "canEdit": { - "message": "Düzəliş edə bilər" - }, - "canEditExceptPass": { - "message": "Parollar istisna olmaqla düzəliş edə bilər" - }, "noCollectionsAdded": { "message": "Heç bir kolleksiya əlavə edilmədi" }, @@ -8626,7 +8635,7 @@ "message": "Kolleksiya silinməsini sahibləri və adminləri ilə məhdudlaşdır" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Elementin silinməsini \"İdarə edə bilər\" icazəsinə sahib üzvlərlə məhdudlaşdır" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Sahiblər və adminlər bütün kolleksiyaları və elementləri idarə edə bilər" @@ -8677,9 +8686,6 @@ "message": "Self-host server URL-si", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Domen ləqəbi" - }, "alreadyHaveAccount": { "message": "Artıq bir hesabınız var?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Bu kolleksiyanı idarə etmək üçün müraciətiniz yoxdur." }, - "grantAddAccessCollectionWarningTitle": { - "message": "İdarə edə bilər icazələri əskikdir" + "grantManageCollectionWarningTitle": { + "message": "\"Kolleksiyanı idarə etmə\" icazələri əskikdir" }, - "grantAddAccessCollectionWarning": { - "message": "Kolleksiyanın silinməsi daxil olmaqla tam kolleksiya idarəetməsinə icazə vermək üçün \"İdarə edə bilər\" icazələrini verin." + "grantManageCollectionWarning": { + "message": "Kolleksiyanın silinməsi daxil olmaqla tam kolleksiya idarəetməsinə icazə vermək üçün \"Kolleksiyanı idarə etmə\" icazələrini verin." }, "grantCollectionAccess": { "message": "Qrup və ya üzvlərin bu kolleksiyaya müraciətinə icazə verin." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Açıqlayıcı kod" }, + "cannotRemoveViewOnlyCollections": { + "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Vacib bildiriş" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "İnzibatçılar, artıq götürülmüş domenlərə aid üzv hesablarını silmə imkanına sahibdir." + }, + "deleteManagedUserWarningDesc": { + "message": "Bu əməliyyat, seyfdəki bütün elementlər daxil olmaqla üzv hesabını siləcək. Bu, əvvəlki Sil əməliyyatını əvəz edir." + }, + "deleteManagedUserWarning": { + "message": "Silmək, yeni bir əməliyyatdır!" + }, + "seatsRemaining": { + "message": "Bu təşkilata təyin edilmiş $TOTAL$ yerdən $REMAINING$ yeriniz qalıb. Abunəliyinizi idarə etmək üçün provayderinizlə əlaqə saxlayın.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Mövcud təşkilat" + }, + "selectOrganizationProviderPortal": { + "message": "Provayder Portalınıza əlavə ediləcək təşkilatı seçin." + }, + "noOrganizations": { + "message": "Sadalanacaq heç bir təşkilat yoxdur." + }, + "yourProviderSubscriptionCredit": { + "message": "Provayder abunəliyiniz, təşkilatınızın abunəliyində qalan vaxt üçün bir kredit alacaq." + }, + "doYouWantToAddThisOrg": { + "message": "Bu təşkilatı bura əlavə etmək istəyirsiniz: $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Mövcud təşkilat əlavə edildi" + }, + "assignedExceedsAvailable": { + "message": "Təyin edilmiş yer sayı, boş yer sayından çoxdur." } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 6d275bac7b2..8dcb31a1d0f 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -1,24 +1,24 @@ { "allApplications": { - "message": "All applications" + "message": "Усе праграмы" }, "criticalApplications": { - "message": "Critical applications" + "message": "Крытычныя праграмы" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "Кіраванне доступам" }, "riskInsights": { - "message": "Risk Insights" + "message": "Разуменне рызык" }, "passwordRisk": { - "message": "Password Risk" + "message": "Рызыка пароля" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Праглядайце паролі, якія знаходзяцца ў зоне рызыкі (ненадзейныя, скампраметаваныя або паўторна выкарыстаныя) ва ўсіх вашых праграмах. Выберыце найбольш крытычныя праграмы для вызначэння прыярытэту бяспекі дзеянняў для вашых карыстальнікаў, якія выкарыстоўваюць рызыкоўныя паролі." }, "dataLastUpdated": { - "message": "Data last updated: $DATE$", + "message": "Апошняе абнаўленне даных: $DATE$", "placeholders": { "date": { "content": "$1", @@ -27,19 +27,19 @@ } }, "notifiedMembers": { - "message": "Notified members" + "message": "Апавешчаныя ўдзельнікі" }, "revokeMembers": { - "message": "Revoke members" + "message": "Адклікаць удзельнікаў" }, "restoreMembers": { - "message": "Restore members" + "message": "Аднавіць удзельнікаў" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "Немагчыма аднавіць доступ да арганізацыі" }, "allApplicationsWithCount": { - "message": "All applications ($COUNT$)", + "message": "Усе праграмы ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -48,10 +48,10 @@ } }, "createNewLoginItem": { - "message": "Create new login item" + "message": "Стварыць новы элемент запісу ўваходу" }, "criticalApplicationsWithCount": { - "message": "Critical applications ($COUNT$)", + "message": "Крытычныя праграмы ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -60,7 +60,7 @@ } }, "notifiedMembersWithCount": { - "message": "Notified members ($COUNT$)", + "message": "Апавешчаныя ўдзельнікі ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -69,7 +69,7 @@ } }, "noAppsInOrgTitle": { - "message": "No applications found in $ORG NAME$", + "message": "Праграмы ў $ORG NAME$ не знойдзены", "placeholders": { "org name": { "content": "$1", @@ -78,43 +78,43 @@ } }, "noAppsInOrgDescription": { - "message": "As users save logins, applications appear here, showing any at-risk passwords. Mark critical apps and notify users to update passwords." + "message": "Тут будуць адлюстроўвацца праграмы па меры таго, як карыстальнікі будуць захоўваць запісы ўваходу, якія знаходзяцца ў зоне рызыкі. Пазначце крытычныя праграмы і апавяшчайце карыстальнікаў аб неабходнасці абнавіць паролі." }, "noCriticalAppsTitle": { - "message": "You haven't marked any applications as a Critical" + "message": "Вы не пазначылі ніводную праграму ў якасці кратычнай" }, "noCriticalAppsDescription": { - "message": "Select your most critical applications to discover at-risk passwords, and notify users to change those passwords." + "message": "Выберыце найбольш крытычныя праграмы для выяўлення пароляў, якія знаходзяцца ў зоне рызыкі. Апавяшчайце карыстальнікаў аб неабходнасці змяніць іх." }, "markCriticalApps": { - "message": "Mark critical apps" + "message": "Пазначыць крытычныя праграмы" }, "markAppAsCritical": { - "message": "Mark app as critical" + "message": "Пазначыць праграму як крытычную" }, "appsMarkedAsCritical": { - "message": "Apps marked as critical" + "message": "Праграмы пазначаныя як крытычныя" }, "application": { - "message": "Application" + "message": "Праграма" }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Паролі ў зоне рызыкі" }, "requestPasswordChange": { - "message": "Request password change" + "message": "Запытаць змену пароля" }, "totalPasswords": { - "message": "Total passwords" + "message": "Усяго пароляў" }, "searchApps": { - "message": "Search applications" + "message": "Пошук праграм" }, "atRiskMembers": { - "message": "At-risk members" + "message": "Удзельнікі ў зоне рызыкі" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Удзельнікі ў зоне рызыкі ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -123,7 +123,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "Праграмы ў зоне рызыкі ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -132,13 +132,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Гэтыя ўдзельнікі ўваходзяць у праграму з ненадзейнымі, скампраметаванымі або паўторна выкарыстанымі паролямі." }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "Гэтыя праграмы маюць ненадзейныя, скампраметаваныя або паўторна выкарыстаныя паролі." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Гэтыя ўдзельнікі ўваходзяць у праграму $APPNAME$ з ненадзейнымі, скампраметаванымі або паўторна выкарыстанымі паролямі.", "placeholders": { "appname": { "content": "$1", @@ -147,19 +147,19 @@ } }, "totalMembers": { - "message": "Total members" + "message": "Усяго ўдзельнікаў" }, "atRiskApplications": { - "message": "At-risk applications" + "message": "Праграмы ў зоне рызыкі" }, "totalApplications": { - "message": "Total applications" + "message": "Усяго праграм" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Зняць пазнаку крытычнай праграмы" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Пазнака з крытычнай праграмы паспяхова знята" }, "whatTypeOfItem": { "message": "Які гэта элемент запісу?" @@ -260,10 +260,10 @@ "message": "Дадаць вэб-сайт" }, "deleteWebsite": { - "message": "Delete website" + "message": "Выдаліць вэб-сайт" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Прадвызначана ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -273,7 +273,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Паказаць выяўленне супадзенняў $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -282,7 +282,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Схаваць выяўленне супадзенняў $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -291,7 +291,7 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Аўтазапаўняць пры загрузцы старонкі?" }, "number": { "message": "Нумар" @@ -306,7 +306,7 @@ "message": "Код бяспекі (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Код бяспекі (CVV)" }, "identityName": { "message": "Імя пасведчання" @@ -384,10 +384,10 @@ "message": "Доктар" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Картка пратэрмінавана" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Калі вы падаўжалі картку, то абнавіце яе звесткі" }, "expirationMonth": { "message": "Месяц завяршэння" @@ -399,7 +399,7 @@ "message": "Ключ аўтэнтыфікацыі (TOTP)" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "Спрасціце двухэтапную праверку" }, "totpHelper": { "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." @@ -464,6 +464,18 @@ "editFolder": { "message": "Рэдагаваць папку" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Асноўны дамен", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "напр.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Ініцыяваны ўваход" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Адправіць" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Апавяшчэнне было адпраўлена на вашу прыладу." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Версія $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Паўторна генерыраваць пароль" - }, "length": { "message": "Даўжыня" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Кіраванне" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Адключыць" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Праблема чытання ключа бяспекі. Паспрабуйце яшчэ раз." }, - "twoFactorWebAuthnWarning": { - "message": "У сувязі з абмежаваннямі платформы, WebAuthn немагчыма выкарыстоўваць ва ўсіх праграмах Bitwarden. Вам неабходна актываваць іншага пастаўшчыка двухэтапнага ўваходу, каб вы маглі атрымаць доступ да свайго ўліковага запісу, калі немагчыма скарыстацца WebAuthn. Платформы, які падтрымліваюцца:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Вэб-сховішча і пашырэнні браўзера на камп'ютары/ноўтбуку з браўзерам, які падтрымлівае WebAuthn (Chrome, Opera, Vivaldi або Firefox з уключаным FIDO U2F)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Ваш код аднаўлення двухэтапнага ўваходу Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Прызначыць патрабаванні для генератара пароляў." }, - "passwordGeneratorPolicyInEffect": { - "message": "Адна або больш палітык арганізацыі ўплывае на налады генератара." - }, "masterPasswordPolicyInEffect": { "message": "Адна або больш палітык арганізацыі патрабуе, каб ваш асноўны пароль адпавядаў наступным патрабаванням:" }, @@ -6681,15 +6717,6 @@ "message": "Генератар", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Што вы хочаце генерыраваць?" - }, - "passwordType": { - "message": "Тып пароля" - }, - "regenerateUsername": { - "message": "Паўторна генерыраваць імя карыстальніка" - }, "generateUsername": { "message": "Генерыраваць імя карыстальніка" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тып імя карыстальніка" - }, "plusAddressedEmail": { "message": "Адрасы электроннай пошты з плюсам", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Назва вузла", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Токен доступу да API" - }, "deviceVerification": { "message": "Праверка прылады" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Няма калекцый" }, - "canView": { - "message": "Можа праглядаць" - }, - "canViewExceptPass": { - "message": "Можа праглядаць (без пароляў)" - }, - "canEdit": { - "message": "Можа рэдагаваць" - }, - "canEditExceptPass": { - "message": "Можа рэдагаваць (без пароляў)" - }, "noCollectionsAdded": { "message": "Няма дадзеных калекцый" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Мянушка дамена" - }, "alreadyHaveAccount": { "message": "Ужо маеце ўліковы запіс?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 972b34bcf15..c985e4eb74e 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Редактиране на папка" }, + "newFolder": { + "message": "Нова папка" + }, + "folderName": { + "message": "Име на папката" + }, + "folderHintText": { + "message": "Можете да вложите една папка в друга като въведете името на горната папка, а след това „/“. Пример: Социални/Форуми" + }, + "deleteFolderPermanently": { + "message": "Наистина ли искате да изтриете тази папка окончателно?" + }, "baseDomain": { "message": "Основен домейн", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Име на елемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "напр.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Вписването е стартирано" }, + "logInRequestSent": { + "message": "Заявката е изпратена" + }, "submit": { "message": "Подаване" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Към устройството Ви е изпратено известие." }, + "notificationSentDevicePart1": { + "message": "Отключете Битоурден на устройството си или в " + }, + "areYouTryingToAccessYourAccount": { + "message": "Опитвате ли се да получите достъп до акаунта си?" + }, + "accessAttemptBy": { + "message": "Опит за достъп от $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Разрешаване на достъпа" + }, + "denyAccess": { + "message": "Отказване на достъпа" + }, + "notificationSentDeviceAnchor": { + "message": "приложението по уеб" + }, + "notificationSentDevicePart2": { + "message": "Уверете се, че уникалната фраза съвпада с тази по-долу, преди да одобрите." + }, + "notificationSentDeviceComplete": { + "message": "Отключете Битоурден на устройството си. Уверете се, че уникалната фраза съвпада с тази по-долу, преди да одобрите." + }, "aNotificationWasSentToYourDevice": { "message": "Към устройството Ви е изпратено известие" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверете се, че регистрацията Ви е отключена и че уникалната фраза съвпада с другото устройство" - }, "versionNumber": { "message": "Версия $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Без нееднозначни знаци", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Друга парола" - }, "length": { "message": "Дължина" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Управление" }, - "canManage": { - "message": "Може да управлява" + "manageCollection": { + "message": "Управление на колекцията" + }, + "viewItems": { + "message": "Преглед на елементите" + }, + "viewItemsHidePass": { + "message": "Преглед на елементите, със скрити пароли" + }, + "editItems": { + "message": "Редактиране на елементите" + }, + "editItemsHidePass": { + "message": "Редактиране на елементите, със скрити пароли" }, "disable": { "message": "Изключване" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Проблем при изчитането на ключа за сигурност. Пробвайте отново." }, - "twoFactorWebAuthnWarning": { - "message": "Поради платформени ограничения устройствата на WebAuthn не могат да се използват с всички приложения на Битуорден. В такъв случай ще трябва да добавите друг доставчик на двустепенно удостоверяване, за да имате достъп до абонамента си, дори когато WebAuthn не работи. Поддържани платформи:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Трезорът по уеб както и разширенията за браузърите с поддръжка на WebAuthn (Chrome, Opera, Vivaldi и Firefox с поддръжка на FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Поради платформени ограничения устройствата на WebAuthn не могат да се използват с всички приложения на Битуорден. Ще трябва да настроите друг доставчик на двустепенно удостоверяване, за да имате достъп до акаунта си, когато WebAuthn не може да се ползва." }, "twoFactorRecoveryYourCode": { "message": "Код за възстановяване на достъпа до Битуорден при двустепенна идентификация" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Задаване на минимална сила на генератора на пароли." }, - "passwordGeneratorPolicyInEffect": { - "message": "Поне една политика на организация влияе на настройките на генерирането на паролите." - }, "masterPasswordPolicyInEffect": { "message": "Поне една политика на организация има следните изисквания към главната ви парола:" }, @@ -6681,15 +6717,6 @@ "message": "Генератор", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Какво бихте искали да генерирате?" - }, - "passwordType": { - "message": "Тип парола" - }, - "regenerateUsername": { - "message": "Повторно генериране на потр. име" - }, "generateUsername": { "message": "Генериране на потр. име" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тип потребителско име" - }, "plusAddressedEmail": { "message": "Адрес на е-поща с плюс", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Име на сървъра", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Идентификатор за достъп до API" - }, "deviceVerification": { "message": "Потвърждаване на устройствата" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Няма колекция" }, - "canView": { - "message": "Може да преглежда" - }, - "canViewExceptPass": { - "message": "Може да преглежда, без пароли" - }, - "canEdit": { - "message": "Може да редактира" - }, - "canEditExceptPass": { - "message": "Може да редактира, без пароли" - }, "noCollectionsAdded": { "message": "Няма добавени колекции" }, @@ -8626,7 +8635,7 @@ "message": "Ограничаване на изтриването на колекции, така че да може да се извършва само от собствениците и администраторите" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ограничаване на изтриването на елементи, така че да може да се извършва само от членове с правомощие за управление" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Собствениците и администраторите могат да управляват всички колекции и елементи" @@ -8677,9 +8686,6 @@ "message": "Адрес на собствения сървър", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Псевдонимен домейн" - }, "alreadyHaveAccount": { "message": "Вече имате регистрация?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Нямате достъп за управление на тази колекция." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Липсват правомощия за управление" + "grantManageCollectionWarningTitle": { + "message": "Липсват правомощия за управление на колекции" }, - "grantAddAccessCollectionWarning": { - "message": "Дайте правомощия за управление, за да позволите пълното управление на колекции, включително изтриването им." + "grantManageCollectionWarning": { + "message": "Дайте правомощия за управление на колекциите, за да позволите пълното управление на колекции, включително изтриването им." }, "grantCollectionAccess": { "message": "Дайте права на групи и членове до тази колекция." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Код от описанието" }, + "cannotRemoveViewOnlyCollections": { + "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Важно съобщение" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Администраторите вече имат възможността да изтриват акаунтите на членовете, които принадлежат към присвоен домейн." + }, + "deleteManagedUserWarningDesc": { + "message": "Това действие ще изтрие акаунта на члена, включително всички елементи в неговия трезор. Това заменя предишното действие за Премахване." + }, + "deleteManagedUserWarning": { + "message": "Изтриването е ново действие!" + }, + "seatsRemaining": { + "message": "Остават Ви $REMAINING$ от общо $TOTAL$ места в тази организация. Свържете се с доставчика си, ако искате да управлявате абонамента си.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Съществуваща организация" + }, + "selectOrganizationProviderPortal": { + "message": "Изберете организацията, която искате да добавите към своя Портал за доставчици." + }, + "noOrganizations": { + "message": "Няма организации за показване" + }, + "yourProviderSubscriptionCredit": { + "message": "Вашият абонамент за доставчик ще получи кредит за оставащото време в абонамента на организацията, ако има такова." + }, + "doYouWantToAddThisOrg": { + "message": "Искате ли да добавите тази организация към $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Добавена е съществуваща организация" + }, + "assignedExceedsAvailable": { + "message": "Назначените места превишават наличния брой." } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index e4b8884de3d..c2b6fdf4671 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ফোল্ডার সম্পাদনা" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "ভিত্তি ডোমেইন", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "উদাহরণ", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "সংস্করণ $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "পাসওয়ার্ড উৎপাদকের কনফিগারেশনের জন্য ন্যূনতম প্রয়োজনীয়তা সেট করুন।" }, - "passwordGeneratorPolicyInEffect": { - "message": "এক বা একাধিক সংস্থার নীতিগুলি আপনার উৎপাদকের সেটিংসকে প্রভাবিত করছে।" - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index cd3df3e0a1a..a4750d36eac 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Uredite folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Osnovni domen", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "npr.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Verzija $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 09e533b2060..fdb1b48cd9b 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -102,7 +102,7 @@ "message": "At-risk passwords" }, "requestPasswordChange": { - "message": "Request password change" + "message": "Sol·licita canvi de contrasenya" }, "totalPasswords": { "message": "Contrasenyes totals" @@ -464,6 +464,18 @@ "editFolder": { "message": "Edita la carpeta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Domini base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nom d'element" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "S'ha iniciat la sessió" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Envia" }, @@ -1371,11 +1377,38 @@ "notificationSentDevice": { "message": "S'ha enviat una notificació al vostre dispositiu." }, - "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirmeu l'accés" + }, + "denyAccess": { + "message": "Denega l'accés" + }, + "notificationSentDeviceAnchor": { + "message": "aplicació web" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, + "aNotificationWasSentToYourDevice": { + "message": "S'ha enviat una notificació al vostre dispositiu" }, "versionNumber": { "message": "Versió $VERSION_NUMBER$", @@ -1480,7 +1513,7 @@ "message": "Correu electrònic" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "Introduïu el codi que us hem enviat al correu electrònic." }, "continue": { "message": "Continua" @@ -1661,12 +1694,9 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Eviteu caràcters ambigus", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenera contrasenya" - }, "length": { "message": "Longitud" }, @@ -1702,7 +1732,7 @@ "message": "Inclou número" }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "Els requisits de la política empresarial s'han aplicat a les opcions del generador.", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { @@ -1767,10 +1797,10 @@ "message": "Torneu a iniciar sessió." }, "currentSession": { - "message": "Current session" + "message": "Sessió actual" }, "requestPending": { - "message": "Request pending" + "message": "Sol·licitud pendent" }, "logBackInOthersToo": { "message": "Torneu a iniciar la sessió. Si esteu utilitzant altres aplicacions Bitwarden, tanqueu-les i torneu-les a obrir també." @@ -2170,8 +2200,20 @@ "manage": { "message": "Administra" }, - "canManage": { - "message": "Pot gestionar" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Inhabilita" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Hi ha hagut un problema en llegir la clau de seguretat. Torneu-ho a provar." }, - "twoFactorWebAuthnWarning": { - "message": "A causa de les limitacions de la plataforma, WebAuthn no es pot utilitzar en totes les aplicacions Bitwarden. Heu d’habilitar un altre proveïdor d’inici de sessió en dos passos perquè pugueu accedir al vostre compte quan no es puga utilitzar WebAuthn. Plataformes compatibles:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Caixa forta web i extensions de navegador en un escriptori/portàtil amb un navegador compatible amb WebAuthn (Chrome, Opera, Vivaldi, o Firefox amb FIDO U2F activat)." + "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." }, "twoFactorRecoveryYourCode": { "message": "El codi de recuperació d'inici de sessió en dues passes de Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Estableix els requisits mínims per a la configuració del generador de contrasenyes." }, - "passwordGeneratorPolicyInEffect": { - "message": "Una o més polítiques d’organització afecten la configuració del generador." - }, "masterPasswordPolicyInEffect": { "message": "Una o més polítiques d’organització requereixen que la vostra contrasenya principal complisca els requisits següents:" }, @@ -6681,15 +6717,6 @@ "message": "Generador", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Què voleu generar?" - }, - "passwordType": { - "message": "Tipus de contrasenya" - }, - "regenerateUsername": { - "message": "Regenera el nom d'usuari" - }, "generateUsername": { "message": "Genera un nom d'usuari" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipus de nom d'usuari" - }, "plusAddressedEmail": { "message": "Adreça amb sufix", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nom de l'amfitrió", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token d'accés a l'API" - }, "deviceVerification": { "message": "Verificació del dispositiu" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Cap col·lecció" }, - "canView": { - "message": "Pot veure" - }, - "canViewExceptPass": { - "message": "Pot veure, excepte les contrasenyes" - }, - "canEdit": { - "message": "Pot editar" - }, - "canEditExceptPass": { - "message": "Pot editar, excepte les contrasenyes" - }, "noCollectionsAdded": { "message": "No s'han afegit col·leccions" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alies de domini" - }, "alreadyHaveAccount": { "message": "Ja tens un compte?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "No teniu accés per gestionar aquesta col·lecció." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Concedeix als grups o membres l'accés a aquesta col·lecció." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index d8aae6a2f0d..4fa1a50512c 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Upravit složku" }, + "newFolder": { + "message": "Nová složka" + }, + "folderName": { + "message": "Název složky" + }, + "folderHintText": { + "message": "Vnořte složku přidáním názvu nadřazené složky následovaného znakem \"/\". Příklad: Sociální/Fóra" + }, + "deleteFolderPermanently": { + "message": "Opravdu chcete trvale smazat tuto složku?" + }, "baseDomain": { "message": "Základní doména", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Název položky" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "např.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Bylo zahájeno přihlášení" }, + "logInRequestSent": { + "message": "Požadavek odeslán" + }, "submit": { "message": "Odeslat" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení." }, + "notificationSentDevicePart1": { + "message": "Odemknout Bitwarden na Vašem zařízení nebo na " + }, + "areYouTryingToAccessYourAccount": { + "message": "Pokoušíte se získat přístup k Vašemu účtu?" + }, + "accessAttemptBy": { + "message": "Pokus o přístup z $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potvrdit přístup" + }, + "denyAccess": { + "message": "Zamítnout přístup" + }, + "notificationSentDeviceAnchor": { + "message": "webová aplikace" + }, + "notificationSentDevicePart2": { + "message": "Před schválením se ujistěte, že fráze otisku prstu odpovídá frázi níže." + }, + "notificationSentDeviceComplete": { + "message": "Odemkněte Bitwarden na Vašem zařízení. Před schválením se ujistěte, že fráze otisku prstu odpovídá frázi níže." + }, "aNotificationWasSentToYourDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ujistěte se, že je Váš trezor odemčen a fráze otisku prstu se shodují s druhým zařízením" - }, "versionNumber": { "message": "Verze $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Nepoužívat zaměnitelné znaky", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Vygenerovat jiné heslo" - }, "length": { "message": "Délka" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Spravovat" }, - "canManage": { - "message": "Může spravovat" + "manageCollection": { + "message": "Spravovat kolekci" + }, + "viewItems": { + "message": "Zobrazit položky" + }, + "viewItemsHidePass": { + "message": "Zobrazit položky, skrytá hesla" + }, + "editItems": { + "message": "Upravit položky" + }, + "editItemsHidePass": { + "message": "Upravit položky, skrytá hesla" }, "disable": { "message": "Vypnout" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Při čtení bezpečnostního klíče došlo k potížím. Zkuste to znovu." }, - "twoFactorWebAuthnWarning": { - "message": "Z důvodu omezení platformy nelze WebAuthn použít ve všech aplikacích Bitwarden. Měli byste využít i jiného poskytovatele dvoufaktorového přihlášení, abyste měli přístup ke svému účtu, když nelze použít WebAuthn. Podporované platformy:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webový trezor a rozšíření pro prohlížeče na počítači/notebooku s podporou WebAuthn (Chrome, Opera, Vivaldi nebo Firefox se zapnutým FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Z důvodu omezení platformy nelze WebAuthn použít ve všech aplikacích Bitwarden. Měli byste využít i jiného poskytovatele dvoufaktorového přihlášení, abyste měli přístup ke svému účtu, když nelze použít WebAuthn." }, "twoFactorRecoveryYourCode": { "message": "Váš kód pro obnovení dvoufázového přihlášení" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Nastaví požadavky pro generátor hesel." }, - "passwordGeneratorPolicyInEffect": { - "message": "Jedna nebo více zásad organizace ovlivňují nastavení generátoru." - }, "masterPasswordPolicyInEffect": { "message": "Jedna nebo více zásad organizace vyžaduje, aby hlavní heslo splňovalo následující požadavky:" }, @@ -6681,15 +6717,6 @@ "message": "Generátor", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Co chcete vygenerovat?" - }, - "passwordType": { - "message": "Typ hesla" - }, - "regenerateUsername": { - "message": "Znovu vygenerovat uživatelské jméno" - }, "generateUsername": { "message": "Vygenerovat uživatelské jméno" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Typ uživatelského jména" - }, "plusAddressedEmail": { "message": "E-mailová adresa s plusem", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Název hostitele", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Přístupový token API" - }, "deviceVerification": { "message": "Ověřování zařízení" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Žádná kolekce" }, - "canView": { - "message": "Může zobrazit" - }, - "canViewExceptPass": { - "message": "Může zobrazit kromě hesel" - }, - "canEdit": { - "message": "Může upravovat" - }, - "canEditExceptPass": { - "message": "Může upravovat kromě hesel" - }, "noCollectionsAdded": { "message": "Nebyly přidány žádné kolekce" }, @@ -8626,7 +8635,7 @@ "message": "Omezí mazání kolekce na vlastníky a správce" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Omezit smazání položky na členy s oprávněním ke správě" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Vlastníci a správci mohou spravovat všechny kolekce a předměty" @@ -8677,9 +8686,6 @@ "message": "Adresa URL serveru vlastního hostování", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Doména aliasu" - }, "alreadyHaveAccount": { "message": "Už máte účet?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nemáte přístup ke správě této kolekce." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Chybějící oprávnění \"Může spravovat\"" + "grantManageCollectionWarningTitle": { + "message": "Chybějící oprávnění pro správu kolekcí" }, - "grantAddAccessCollectionWarning": { - "message": "Udělte oprávnění \"Může spravovat\" pro úplnou správu kolekce, včetně jejího smazání." + "grantManageCollectionWarning": { + "message": "Udělte oprávnění \"Spravovat kolekci\" pro úplnou správu kolekce, včetně jejího smazání." }, "grantCollectionAccess": { "message": "Udělí skupinám nebo členům přístup k této kolekci." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Kód z popisu" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Důležité upozornění" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Správci mají nyní možnost smazat účty členů, které patří k nárokované doméně." + }, + "deleteManagedUserWarningDesc": { + "message": "Tato akce smaže účet uživatele včetně všech jeho položek v trezoru. Tím se nahradí předchozí akce odebrání." + }, + "deleteManagedUserWarning": { + "message": "Smazat je nová akce!" + }, + "seatsRemaining": { + "message": "Máte zbývajících $REMAINING$ uživatelů z $TOTAL$ uživatelů přidělených této organizaci. Kontaktujte svého poskytovatele pro správu předplatného.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existující organizace" + }, + "selectOrganizationProviderPortal": { + "message": "Vyberte organizaci pro přidání do portálu poskytovatele." + }, + "noOrganizations": { + "message": "Žádné organizace k zobrazení" + }, + "yourProviderSubscriptionCredit": { + "message": "Předplatné poskytovatele obdrží kredit za zbývající čas v předplatném organizace." + }, + "doYouWantToAddThisOrg": { + "message": "Chcete přidat tuto organizaci do $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Přidána existující organizace" + }, + "assignedExceedsAvailable": { + "message": "Přiřazení uživatelé překračují dostupné uživatele." } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 6d0c87ed1a0..01c4f390ddc 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index a0d1674d181..bd357b4cba4 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Redigér mappe" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Basisdomæne", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Emnenavn" }, - "cannotRemoveViewOnlyCollections": { - "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "eks.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Indlogning påbegyndt" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Indsend" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "En notifikation er sendt til din enhed." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "En notifikation er sendt til enheden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Sørg for, at boksen er oplåst, samt at fingeraftrykssætningen matcher på den anden enhed" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Undgå tvetydige tegn", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerér adgangskode" - }, "length": { "message": "Længde" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Håndtér" }, - "canManage": { - "message": "Kan håndtere" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Deaktivér" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Problem med at læse sikkerhedsnøglen. Forsøg igen." }, - "twoFactorWebAuthnWarning": { - "message": "Grundet platformsbegrænsninger kan WebAuthn ikke bruges i alle Bitwarden-applikationer. Man bør opsætte en anden totrins-loginudbyder, så man kan tilgå sin konto, når WebAuthn ikke kan benyttes. Understøttede platforme:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web-boks og browserudvidelser på en stationær/bærbar computer med en WebAuthn-aktiveret browser (Chrome, Opera, Vivaldi eller Firefox med FIDO U2F aktiveret)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Gendannelseskoden til Bitwarden totrins-login" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Angiv krav til adgangskodegenerator." }, - "passwordGeneratorPolicyInEffect": { - "message": "Én eller flere organisationspolitikker påvirker dine generatorindstillinger." - }, "masterPasswordPolicyInEffect": { "message": "Én eller flere organisationspolitikker kræver din hovedadgangskode opfylder følgende krav:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Hvad ønskes genereret?" - }, - "passwordType": { - "message": "Adgangskodetype" - }, - "regenerateUsername": { - "message": "Regenerér brugernavn" - }, "generateUsername": { "message": "Generér brugernavn" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Brugernavnstype" - }, "plusAddressedEmail": { "message": "Plus adresseret e-mail", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Værtsnavn", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-adgangstoken" - }, "deviceVerification": { "message": "Enhedsbekræftelse" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Ingen samling" }, - "canView": { - "message": "Kan se" - }, - "canViewExceptPass": { - "message": "Kan se, undtagen adgangskoder" - }, - "canEdit": { - "message": "Kan redigere" - }, - "canEditExceptPass": { - "message": "Kan redigere, undtagen adgangskoder" - }, "noCollectionsAdded": { "message": "Ingen samlinger tilføjet" }, @@ -8677,9 +8686,6 @@ "message": "URL til selv-hostet server", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aliasdomæne" - }, "alreadyHaveAccount": { "message": "Har allerede en konto?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Du har ikke adgang til at håndtere denne samling." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Manglende Kan håndtere tilladelser" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Tildel Kan håndtere tilladelser for at tillade fuld samlingshåndtering, herunder sletning af samling." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Tildel grupper eller medlemmer adgang til denne samling." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Beskrivelseskode" }, + "cannotRemoveViewOnlyCollections": { + "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Vigtig notits" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 0ae02ed0977..ffc65be543c 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Ordner bearbeiten" }, + "newFolder": { + "message": "Neuer Ordner" + }, + "folderName": { + "message": "Ordnername" + }, + "folderHintText": { + "message": "Verschachtel einen Ordner, indem du den Namen des übergeordneten Ordners hinzufügst, gefolgt von einem „/“. Beispiel: Sozial/Foren" + }, + "deleteFolderPermanently": { + "message": "Bist du sicher, dass du diesen Ordner dauerhaft löschen willst?" + }, "baseDomain": { "message": "Basisdomäne", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Eintrags-Name" }, - "cannotRemoveViewOnlyCollections": { - "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "Bsp.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Anmeldung eingeleitet" }, + "logInRequestSent": { + "message": "Anfrage gesendet" + }, "submit": { "message": "Absenden" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." }, + "notificationSentDevicePart1": { + "message": "Entsperre Bitwarden auf deinem Gerät oder mit der " + }, + "areYouTryingToAccessYourAccount": { + "message": "Versuchst du auf dein Konto zuzugreifen?" + }, + "accessAttemptBy": { + "message": "Zugriffsversuch von $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Zugriff bestätigen" + }, + "denyAccess": { + "message": "Zugriff ablehnen" + }, + "notificationSentDeviceAnchor": { + "message": "Web-App" + }, + "notificationSentDevicePart2": { + "message": "Stelle vor der Genehmigung sicher, dass die Fingerabdruck-Phrase mit der unten stehenden übereinstimmt." + }, + "notificationSentDeviceComplete": { + "message": "Entsperre Bitwarden auf deinem Gerät. Stelle vor der Genehmigung sicher, dass die Fingerabdruck-Phrase mit der unten stehenden übereinstimmt." + }, "aNotificationWasSentToYourDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Stelle sicher, dass dein Konto entsperrt ist und die Fingerabdruck-Phrase mit der vom anderen Gerät übereinstimmt" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Mehrdeutige Zeichen vermeiden", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Passwort neu generieren" - }, "length": { "message": "Länge" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Verwalten" }, - "canManage": { - "message": "Darf verwalten" + "manageCollection": { + "message": "Sammlung verwalten" + }, + "viewItems": { + "message": "Einträge anzeigen" + }, + "viewItemsHidePass": { + "message": "Einträge anzeigen, versteckte Passwörter" + }, + "editItems": { + "message": "Einträge bearbeiten" + }, + "editItemsHidePass": { + "message": "Einträge bearbeiten, versteckte Passwörter" }, "disable": { "message": "Deaktivieren" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Es gab ein Problem beim Lesen des Sicherheitsschlüssels, bitte versuche es erneut." }, - "twoFactorWebAuthnWarning": { - "message": "Aufgrund von Plattformbeschränkungen kann WebAuthn nicht in allen Bitwarden-Anwendungen verwendet werden. Du solltest einen anderen Zwei-Faktor-Authentifizierungsanbieter aktivieren, damit du auf dein Konto zugreifen kannst, wenn WebAuthn nicht verwendet werden kann. Unterstützte Plattformen:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web-Tresor und Browser-Erweiterungen auf einem Desktop/Laptop mit einem WebAuthn-fähigen Browser (Chrome, Opera, Vivaldi oder Firefox mit aktiviertem FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Aufgrund von Plattformbeschränkungen kann WebAuthn nicht in allen Bitwarden-Anwendungen verwendet werden. Du solltest einen anderen Zwei-Faktor-Authentifizierungsanbieter einrichten, damit du auf dein Konto zugreifen kannst, wenn WebAuthn nicht verwendet werden kann." }, "twoFactorRecoveryYourCode": { "message": "Ihr Wiederherstellungsschlüssel für die Zwei-Faktor-Anmeldung in Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Mindestanforderungen für den Passwort-Generator festlegen." }, - "passwordGeneratorPolicyInEffect": { - "message": "Eine oder mehrere Organisationsrichtlinien beeinflussen deine Generator-Einstellungen." - }, "masterPasswordPolicyInEffect": { "message": "Eine oder mehrere Organisationsrichtlinien erfordern, dass dein Master-Passwort die folgenden Anforderungen erfüllt:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Was möchtest du generieren?" - }, - "passwordType": { - "message": "Passworttyp" - }, - "regenerateUsername": { - "message": "Benutzername neu generieren" - }, "generateUsername": { "message": "Benutzername generieren" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Benutzernamenstyp" - }, "plusAddressedEmail": { "message": "Plus-adressierte E-Mail-Adresse", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-Zugriffstoken" - }, "deviceVerification": { "message": "Geräteverifizierung" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Keine Sammlung" }, - "canView": { - "message": "Darf anzeigen" - }, - "canViewExceptPass": { - "message": "Darf anzeigen, Passwörter ausgenommen" - }, - "canEdit": { - "message": "Darf bearbeiten" - }, - "canEditExceptPass": { - "message": "Darf bearbeiten, Passwörter ausgenommen" - }, "noCollectionsAdded": { "message": "Keine Sammlungen hinzugefügt" }, @@ -8677,9 +8686,6 @@ "message": "Selbst gehostete Server-URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias-Domain" - }, "alreadyHaveAccount": { "message": "Hast du bereits ein Konto?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Du hast keinen Zugriff zur Verwaltung dieser Sammlung." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Fehlende \"Darf verwalten\"-Berechtigungen" + "grantManageCollectionWarningTitle": { + "message": "Berechtigungen zur Verwaltung von Sammlungen fehlen" }, - "grantAddAccessCollectionWarning": { - "message": "\"Darf verwalten\"-Berechtigungen gewähren, um die vollständige Sammlungsverwaltung einschließlich der Löschung von Sammlungen zu ermöglichen." + "grantManageCollectionWarning": { + "message": "Berechtigungen zur Verwaltung von Sammlungen gewähren, um die vollständige Verwaltung von Sammlungen, einschließlich der Löschung von Sammlungen, zu erlauben." }, "grantCollectionAccess": { "message": "Gewähre Gruppen oder Mitgliedern Zugriff auf diese Sammlung." @@ -9307,7 +9313,7 @@ "message": "Monat pro Mitglied" }, "monthPerMemberBilledAnnually": { - "message": "month per member billed annually" + "message": "Monat pro Mitglied jährlich in Rechnung gestellt" }, "seats": { "message": "Benutzerplätze" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Beschreibungscode" }, + "cannotRemoveViewOnlyCollections": { + "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Wichtiger Hinweis" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administratoren haben nun die Möglichkeit, Mitgliedskonten, die zu einer beanspruchten Domain gehören, zu löschen." + }, + "deleteManagedUserWarningDesc": { + "message": "Diese Aktion löscht das Mitgliedskonto, einschließlich aller Einträge in seinem Tresor. Dies ersetzt die vorherige Entfernen-Aktion." + }, + "deleteManagedUserWarning": { + "message": "Löschen ist eine neue Aktion!" + }, + "seatsRemaining": { + "message": "Du hast $REMAINING$ Plätze von $TOTAL$ dieser Organisation zugewiesenen Plätzen verfügbar. Kontaktiere deinen Anbieter, um dein Abonnement zu verwalten.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Vorhandene Organisation" + }, + "selectOrganizationProviderPortal": { + "message": "Wähle eine Organisation aus, um sie deinem Anbieterportal hinzuzufügen." + }, + "noOrganizations": { + "message": "Keine Sammlungen vorhanden" + }, + "yourProviderSubscriptionCredit": { + "message": "Dein Anbieterabonnement erhält ein Guthaben für jede verbleibende Zeit im Abonnement der Organisation." + }, + "doYouWantToAddThisOrg": { + "message": "Möchtest du diese Organisation zu $PROVIDER$ hinzufügen?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Vorhandene Organisation hinzugefügt" + }, + "assignedExceedsAvailable": { + "message": "Die zugewiesenen Plätze überschreiten die verfügbaren Plätze." } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index cade0d1f120..ea5f11e9162 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Επεξεργασία Φακέλου" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Βασικός τομέας", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Όνομα αντικειμένου" }, - "cannotRemoveViewOnlyCollections": { - "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "πχ.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Η σύνδεση ξεκίνησε" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Υποβολή" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Έκδοση $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Επαναδημιουργία Κωδικού" - }, "length": { "message": "Μήκος" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Διαχείριση" }, - "canManage": { - "message": "Δυνατότητα διαχείρισης" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Απενεργοποίηση" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Παρουσιάστηκε πρόβλημα κατά την ανάγνωση του κλειδιού ασφαλείας. Προσπάθησε ξανά." }, - "twoFactorWebAuthnWarning": { - "message": "Λόγω περιορισμών της πλατφόρμας, το WebAuthn δεν μπορεί να χρησιμοποιηθεί σε όλες τις εφαρμογές Bitwarden. Θα πρέπει να ενεργοποιήσετε έναν άλλο πάροχο σύνδεσης δύο βημάτων, ώστε να έχετε πρόσβαση στο λογαριασμό σας όταν δεν μπορεί να χρησιμοποιηθεί το WebAuthn. Υποστηριζόμενες πλατφόρμες:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault και επεκτάσεις browser σε έναν σταθερό / φορητό υπολογιστή με ένα πρόγραμμα περιήγησης WebAuthn (Chrome, Opera, Vivaldi, ή Firefox με FIDO U2F ενεργοποιημένο)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Ο Bitwarden κωδικός ανάκτησης, εισόδου δύο βημάτων" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Ελάχιστες απαιτήσεις διαμόρφωσης γεννήτριας κωδικών." }, - "passwordGeneratorPolicyInEffect": { - "message": "Μία ή περισσότερες πολιτικές του οργανισμού επηρεάζουν τις ρυθμίσεις της γεννήτριας." - }, "masterPasswordPolicyInEffect": { "message": "Σε μία ή περισσότερες πολιτικές του οργανισμού απαιτείται ο κύριος κωδικός να πληρεί τις ακόλουθες απαιτήσεις:" }, @@ -6681,15 +6717,6 @@ "message": "Γεννήτρια", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Τι θα θέλατε να δημιουργήσετε;" - }, - "passwordType": { - "message": "Τύπος Κωδικού" - }, - "regenerateUsername": { - "message": "Επαναδημιουργία Ονόματος Χρήστη" - }, "generateUsername": { "message": "Δημιουργία Ονόματος Χρήστη" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Τύπος Ονόματος Χρήστη" - }, "plusAddressedEmail": { "message": "Συν Διεύθυνση Email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Όνομα κεντρικού υπολογιστή", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Διακριτικό πρόσβασης API" - }, "deviceVerification": { "message": "Επαλήθευση συσκευής" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Καμία συλλογή" }, - "canView": { - "message": "Δυνατότητα προβολής" - }, - "canViewExceptPass": { - "message": "Δυνατότητα προβολής, εκτός των κωδικών πρόσβασης" - }, - "canEdit": { - "message": "Δυνατότητα επεξεργασίας" - }, - "canEditExceptPass": { - "message": "Δυνατότητα επεξεργασίας, εκτός των κωδικών πρόσβασης" - }, "noCollectionsAdded": { "message": "Δεν προστέθηκαν συλλογές" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Ψευδώνυμο τομέα" - }, "alreadyHaveAccount": { "message": "Έχετε ήδη λογαριασμό;" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Δεν έχετε πρόσβαση για να διαχειριστείτε αυτήν τη συλλογή." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index ef199163239..0f48595f09b 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -1718,9 +1718,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -4773,9 +4770,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6744,15 +6738,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6793,9 +6778,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -7015,9 +6997,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -8728,9 +8707,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8792,11 +8768,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10346,6 +10322,15 @@ } } }, + "accountDeprovisioningNotification" : { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, "seatsRemaining": { "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", "placeholders": { diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index bebc54d2a8a..24aa0b675ab 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "e.g.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organisation policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organisation policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organisation. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organisation" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organisation to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organisations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organisation's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organisation to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organisation" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 14e17c15382..f4e4756b393 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "e.g.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Disable" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn enabled browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F enabled)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set minimum requirements for password generator configuration." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organisation policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organisation policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organisation. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organisation" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organisation to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organisations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organisation's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organisation to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organisation" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index e2721fe3f3d..a864ee99590 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Redakti dosierujon" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Baza domajno", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ekz.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Sendu" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versio $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regeneri Pasvorton" - }, "length": { "message": "Longo" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Administri" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Neebligi" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Via kodo de senpaneigo de du-ŝtupa saluto de Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Agordi minimumajn postulojn por agordi pasvortan generilon." }, - "passwordGeneratorPolicyInEffect": { - "message": "Unu aŭ pluraj organizaj politikoj influas viajn generatorajn agordojn." - }, "masterPasswordPolicyInEffect": { "message": "Unu aŭ pluraj organizaj politikoj postulas vian ĉefan pasvorton por plenumi la jenajn postulojn:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Domajna nomo", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index c93410b4e49..0eaf8976265 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editar carpeta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Dominio base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nombre del elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ej.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Inicio de sesión en proceso" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Enviar" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Se ha enviado una notificación a tu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versión $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerar contraseña" - }, "length": { "message": "Longitud" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gestionar" }, - "canManage": { - "message": "Puede gestionar" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Desactivar" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Hubo un problema al leer la llave de seguridad. Inténtalo de nuevo." }, - "twoFactorWebAuthnWarning": { - "message": "Debido a las limitaciones de la plataforma, WebAuthn no puede ser utilizado en todas las aplicaciones de Bitwarden. Debería habilitar otro proveedor de inicio de sesión en dos-pasos para que pueda acceder a su cuenta cuando WebAuthn no pueda ser usado. Plataformas soportadas:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Caja fuerte web y extensiones de navegador en un escritorio/portátil con un navegador WebAuthn habilitado (Chrome, Opera, Vivaldi o Firefox con FIDO U2F habilitado)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Tu código de recuperación de inicio de sesión de dos pasos de Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Establecer requisitos mínimos para la configuración del generador de contraseñas." }, - "passwordGeneratorPolicyInEffect": { - "message": "Una o más políticas de la organización están afectando su configuración del generador." - }, "masterPasswordPolicyInEffect": { "message": "Una o más políticas de la organización requieren que su contraseña maestra cumpla con los siguientes requisitos:" }, @@ -6681,15 +6717,6 @@ "message": "Generador", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "¿Qué desea generar?" - }, - "passwordType": { - "message": "Tipo de contraseña" - }, - "regenerateUsername": { - "message": "Regenerar nombre de usuario" - }, "generateUsername": { "message": "Generar nombre de usuario" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipo de nombre de usuario" - }, "plusAddressedEmail": { "message": "Correo electrónico más dirigido", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nombre del host", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token de acceso API" - }, "deviceVerification": { "message": "Verificación del dispositivo" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Sin colecciones" }, - "canView": { - "message": "Puede ver" - }, - "canViewExceptPass": { - "message": "Puede ver, excepto contraseñas" - }, - "canEdit": { - "message": "Puede editar" - }, - "canEditExceptPass": { - "message": "Puede editar, excepto contraseñas" - }, "noCollectionsAdded": { "message": "No hay colecciones añadidas" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Dominio alias" - }, "alreadyHaveAccount": { "message": "¿Ya tienes una cuenta?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 52c61c301b2..ede248d2b93 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Muuda kausta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Domeen", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Kirje nimi" }, - "cannotRemoveViewOnlyCollections": { - "message": "Sa ei saa eemaldada neid kogumikke ainult vaatamisloaga: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "nt.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Sisselogimine käivitatud" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Kinnita" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Sinu seadmesse saadeti teavitus." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versioon $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Genereeri parool uuesti" - }, "length": { "message": "Pikkus" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Haldus" }, - "canManage": { - "message": "Saab muuta" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Keela" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Turvavõtme lugemisel tekkis tõrge. Proovi uuesti." }, - "twoFactorWebAuthnWarning": { - "message": "Mõnede platvormi piirangute tõttu ei saa WebAuthn'i kõikide Bitwardeni rakendustega kasutada. Võiksid kaaluda teise kaheastmelise kinnitamise aktiveerimist olukordadeks, kus WebAuthn'i ei saa kasutada. Toetatud platvormid:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Veebihoidla- ja brauseri laiendused laua- ja sülearvutis, kus on WebAuthn toega brauser (Chrome, Opera, Vivaldi või Firefox, kus on FIDO U2F sisse lülitatud)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Bitwardeni kaheastmelise logimise varukood" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Määra parooli genereerija konfiguratsiooni tingimused." }, - "passwordGeneratorPolicyInEffect": { - "message": "Organisatsiooni seaded mõjutavad parooli genereerija sätteid." - }, "masterPasswordPolicyInEffect": { "message": "Üks või enam organisatsiooni eeskirja nõuavad, et ülemparool vastaks nendele nõudmistele:" }, @@ -6681,15 +6717,6 @@ "message": "Genereerija", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Mida sa soovid genereerida?" - }, - "passwordType": { - "message": "Parooli tüüp" - }, - "regenerateUsername": { - "message": "Genereeri kasutajanimi uuesti" - }, "generateUsername": { "message": "Genereeri kasutajanimi" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Kasutajanime tüüp" - }, "plusAddressedEmail": { "message": "Plussiga e-posti aadress", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hosti nimi", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API võti" - }, "deviceVerification": { "message": "Seadme kinnitamine" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domeen" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Sa ei saa eemaldada neid kogumikke ainult vaatamisloaga: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 8e4d12fb1f4..0b230da1545 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editatu Karpeta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Oinarrizko domeinua", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "adb.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Saioa hastea martxan da" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Bidali" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Jakinarazpen bat bidali da zure gailura." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "$VERSION_NUMBER$ bertsioa", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Berrezarri pasahitza" - }, "length": { "message": "Luzera" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Kudeatu" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Desgaitu" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Arazo bat egon da segurtasun-gakoa irakurtzean. Saiatu berriro mesedez." }, - "twoFactorWebAuthnWarning": { - "message": "Plataformaren mugak direla eta, WebAuthn ezin da erabili Bitwarden-en aplikazio guztietan. Bi urratseko saio hasierako beste hornitzaile bat gaitu beharko duzu, WebAuthn erabili ezin denean zure kontuan sartzeko. Plataforma bateragarriak:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webguneko kutxa gotorra eta nabigatzailearen gehiagarriak mahaigain/ordenagailu eramangarri batean, WebAuthn nabigatzaile gaitu batekin (Chrome, Opera, Vivaldi edo Firefox, FIDO U2F gaitua duena)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Zure Bitwardeneko bi urratseko saio hasierako berreskuratze-kodea" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Ezarri pasahitz sortzailearen gutxieneko baldintzak." }, - "passwordGeneratorPolicyInEffect": { - "message": "Erakundeko politika batek edo gehiagok sortzailearen konfigurazioari eragiten diote." - }, "masterPasswordPolicyInEffect": { "message": "Erakundeko politika batek edo gehiagok pasahitz nagusia behar dute baldintza hauek betetzeko:" }, @@ -6681,15 +6717,6 @@ "message": "Sortzailea", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Zer sortu nahi duzu?" - }, - "passwordType": { - "message": "Pasahitz mota" - }, - "regenerateUsername": { - "message": "Berrezarri erabiltzaile izena" - }, "generateUsername": { "message": "Sortu erabiltzaile izena" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Erabiltzaile izen mota" - }, "plusAddressedEmail": { "message": "Atzizkidun emaila", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Ostalariaren izena", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token sarbide API-a" - }, "deviceVerification": { "message": "Gailu egiaztapena" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Ikus dezake" - }, - "canViewExceptPass": { - "message": "Ikus dezake, pasahitza izan ezik" - }, - "canEdit": { - "message": "Editatu dezake" - }, - "canEditExceptPass": { - "message": "Editatu dezake, pasahitza izan ezik" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 51d862e5314..cfcf12c7907 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ويرايش پوشه" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "دامنه پایه", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "مثال.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "ورود به سیستم آغاز شد" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "ثبت" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "یک اعلان به دستگاه شما ارسال شده است." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "نسخه $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "تولید مجدد کلمه عبور" - }, "length": { "message": "طول" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "مدیریت" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "خاموش کردن" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "مشکلی در خواندن کلید امنیتی وجود داشت. دوباره امتحان کنید." }, - "twoFactorWebAuthnWarning": { - "message": "به دلیل محدودیت‌های پلتفرم، WebAuthn نمی‌تواند در همه برنامه‌های Bitwarden استفاده شود. باید یک ارائه‌دهنده‌ی ورود دو مرحله‌ای دیگر راه‌اندازی کنید تا زمانی که WebAuthn قابل استفاده نیست، بتوانید به حساب خود دسترسی داشته باشید. پلتفرم های پشتیبانی شده:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "گاوصندوق وب و برنامه‌های افزودنی مرورگر روی دسکتاپ/لپ‌تاپ با مرورگر پشتیبانی‌شده از WebAuthn (Chrome، Opera، Vivaldi یا Firefox با FIDO U2F روشن)." + "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." }, "twoFactorRecoveryYourCode": { "message": "کد بازیابی ورود دو مرحله ای Bitwarden شما" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "الزامات را برای تولید کننده کلمه عبور تنظیم کنید." }, - "passwordGeneratorPolicyInEffect": { - "message": "یک یا چند سیاست سازمان بر تنظیمات تولید کننده شما تأثیر می‌گذارد." - }, "masterPasswordPolicyInEffect": { "message": "یک یا چند سیاست سازمانی برای تأمین شرایط زیر به کلمه عبور اصلی شما احتیاج دارد:" }, @@ -6681,15 +6717,6 @@ "message": "تولید کننده", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "چه چیزی دوست دارید تولید کنید؟" - }, - "passwordType": { - "message": "نوع کلمه عبور" - }, - "regenerateUsername": { - "message": "ایجاد مجدد نام کاربری" - }, "generateUsername": { "message": "ایجاد نام کاربری" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "نوع نام کاربری" - }, "plusAddressedEmail": { "message": "به علاوه نشانی ایمیل داده شده", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "نام میزبان", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "توکن دسترسی API" - }, "deviceVerification": { "message": "تأیید دستگاه" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "مجموعه ای وجود ندارد" }, - "canView": { - "message": "می‌تواند مشاهده کند" - }, - "canViewExceptPass": { - "message": "قابل مشاهده، به غیر از کلمه‌های عبور" - }, - "canEdit": { - "message": "می‌تواند ویرایش کند" - }, - "canEditExceptPass": { - "message": "قابل ویرایش، به غیر از کلمه‌های عبور" - }, "noCollectionsAdded": { "message": "مجموعه ای اضافه نشد" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "دامنه مستعار" - }, "alreadyHaveAccount": { "message": "پیشتر حساب کاربری داشته اید؟" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index a1d909455c9..00d56fdb1c1 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Muokkaa kansiota" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Pääverkkotunnus", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Kohteen nimi" }, - "cannotRemoveViewOnlyCollections": { - "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "esim.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Kirjautuminen aloitettu" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Jatka" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Laitteellesi on lähetetty ilmoitus." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Laitteeseesi lähetettiin ilmoitus" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versio $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Vältä epäselviä merkkejä", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Luo uusi salasana" - }, "length": { "message": "Pituus" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Hallitse" }, - "canManage": { - "message": "Voi hallita" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Poista käytöstä" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Suojausavainta luettaessa havaittiin ongelma. Yritä uudelleen." }, - "twoFactorWebAuthnWarning": { - "message": "Alustakohtaisten rajoitusten vuoksi WebAuthn-todennuslaiteet eivät ole käytettävissä kaikissa Bitwarden-sovelluksissa. Sinun tulisi määrittää eri kaksivaiheisen kirjautumisen todentaja, jotta pääset tilillesi myös silloin kun WebAuthn-laitteen käyttö ei ole mahdollista. Tuetut alustat:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Verkkoholvi ja selainlaajennukset pöytäkoneissa/kannettavissa, joissa on WebAuthn-tekniikkaa tukeva selain (Chrome, Opera, Vivaldi tai Firefox FIDO U2F käyttöön otettuna)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Bitwardenin kaksivaiheisen kirjautumisen palautuskoodisi" @@ -3339,10 +3378,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "Sinulla on 1 kutsu jäljellä." }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "Sinulla on 0 kutsua jäljellä." }, "userUsingTwoStep": { "message": "Käyttäjä on suojannut tilinsä kaksivaiheisella kirjautumisella." @@ -3847,22 +3886,22 @@ "message": "Laite" }, "loginStatus": { - "message": "Login status" + "message": "Kirjautumisen tila" }, "firstLogin": { - "message": "First login" + "message": "Ensimmäinen kirjautuminen" }, "trusted": { - "message": "Trusted" + "message": "Luotettu" }, "needsApproval": { - "message": "Needs approval" + "message": "Vaatii hyväksynnän" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Yritätkö kirjautua sisään?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "Kirjautumisyritys osoitteella $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3905,10 +3944,10 @@ "message": "Login request has already expired." }, "justNow": { - "message": "Just now" + "message": "Juuri nyt" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Pyydetty $MINUTES$ minuuttia sitten", "placeholders": { "minutes": { "content": "$1", @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Aseta salasanageneraattorin vaatimukset." }, - "passwordGeneratorPolicyInEffect": { - "message": "Yksi tai useampi organisaatiokäytäntö vaikuttaa generaattorisi asetuksiin." - }, "masterPasswordPolicyInEffect": { "message": "Yksi tai useampi organisaatiokäytäntö edellyttää, että pääsalasanasi täyttää seuraavat vaatimukset:" }, @@ -5813,11 +5849,11 @@ "message": "Bitwarden could not decrypt the vault item(s) listed below." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Ota yhteyttä asiakkaaseen", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "lisätietojen menettämisen välttämiseksi.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -6681,15 +6717,6 @@ "message": "Generaattori", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Mitä haluat luoda?" - }, - "passwordType": { - "message": "Salasanan tyyppi" - }, - "regenerateUsername": { - "message": "Luo uusi käyttäjätunnus" - }, "generateUsername": { "message": "Luo käyttäjätunnus" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Käyttäjätunnuksen tyyppi" - }, "plusAddressedEmail": { "message": "Plus+merkkinen sähköposti", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Isäntä", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-käyttötunniste" - }, "deviceVerification": { "message": "Laitevahvistus" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Ei kokoelmaa" }, - "canView": { - "message": "Voi tarkastella" - }, - "canViewExceptPass": { - "message": "Voi tarkastella (ei salasanoja)" - }, - "canEdit": { - "message": "Voi muokata" - }, - "canEditExceptPass": { - "message": "Voi muokata (ei salasanoja)" - }, "noCollectionsAdded": { "message": "Kokoelmia ei ole lisätty" }, @@ -8677,9 +8686,6 @@ "message": "Itse ylläpidetyn palvelimen URL-osoite", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aliaksen verkkotunnus" - }, "alreadyHaveAccount": { "message": "Onko sinulla jo tili?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Oikeutesi eivät riitä kokoelman hallintaan." }, - "grantAddAccessCollectionWarningTitle": { - "message": "\"Voi hallita\" -käyttöoikeus puuttuu" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Myönnä ”Voi hallita” -oikeus, joka mahdollistaa kokoelman täydellisen hallinnan, mukaan lukien sen poistamisen." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Myönnä ryhmille tai henkilöille kokoelman käyttöoikeus." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Tärkeä ilmoitus" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index cebcaa22aef..42b4882bf20 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Baguhin ang folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "hal.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Sinimulan ang pag-log in" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Ipadala" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Nakapagpadala na ng notipikasyon sa device mo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Bersyon $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Gumawa ng isa pang password" - }, "length": { "message": "Haba" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Pamahalaan" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Isara" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Nagkaproblema sa pagbabasa ng security key. Pakisubukan ulit." }, - "twoFactorWebAuthnWarning": { - "message": "Hindi magagamit sa lahat ng mga aplikasyon ng Bitwarden ang WebAuthn dahil sa mga limitasyon ng platform. Dapat mag-set up ka ng isa pang provider ng dalawang-hakbang na pag-log in para ma-access mo ang account mo sakaling hindi magamit ang WebAuthn. Mga suportadong platform:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault at mga ekstensyon pang-browser sa desktop/laptop na may browser na sinusuportahan ang WebAuthn (Chrome, Opera, Vivaldi, o Firefox na nakabukas ang FIDO U2F)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Code pang-recover mo sa dalawang-hakbang na pag-log in sa Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Magtakda ng mga kinakailangan para sa generator ng password." }, - "passwordGeneratorPolicyInEffect": { - "message": "Isang o higit pang patakaran ng organisasyon ay nakakaapekto sa iyong mga setting ng generator." - }, "masterPasswordPolicyInEffect": { "message": "Isang o higit pang mga patakaran ng organisasyon ay nangangailangan ng iyong master password upang matugunan ang sumusunod na kinakailangan:" }, @@ -6681,15 +6717,6 @@ "message": "Magmamana", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Ano ang nais mong bumuo?" - }, - "passwordType": { - "message": "Uri ng Password" - }, - "regenerateUsername": { - "message": "Muling bumuo ng username" - }, "generateUsername": { "message": "Lumikha ng username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Uri ng username" - }, "plusAddressedEmail": { "message": "Plus na naka-address na email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Pangalan ng Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token ng Access sa API" - }, "deviceVerification": { "message": "Pag verify ng aparato" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Walang koleksyon" }, - "canView": { - "message": "Maaaring tingnan" - }, - "canViewExceptPass": { - "message": "Maaaring tingnan, maliban sa mga password" - }, - "canEdit": { - "message": "Maaaring i-edit" - }, - "canEditExceptPass": { - "message": "Maaaring mag edit, maliban sa mga password" - }, "noCollectionsAdded": { "message": "Walang idinagdag na mga koleksyon" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index c477a5d027d..a5a55255c28 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -114,7 +114,7 @@ "message": "Membres à risque" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Membres à risque ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -132,13 +132,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Ces membres se connectent à des applications avec des mots de passe faibles, exposés ou réutilisés." }, "atRiskApplicationsDescription": { "message": "Ces applications ont des mots de passe faibles, exposés ou réutilisés." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Ces membres se connectent à $APPNAME$ avec des mots de passe faibles, exposés ou réutilisés.", "placeholders": { "appname": { "content": "$1", @@ -464,6 +464,18 @@ "editFolder": { "message": "Modifier le dossier" }, + "newFolder": { + "message": "Nouveau dossier" + }, + "folderName": { + "message": "Nom de dossier" + }, + "folderHintText": { + "message": "Créez un sous-dossier en ajoutant le nom du dossier parent suivi d'un \"/\". Par exemple : Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Êtes-vous sûr de vouloir supprimer définitivement ce dossier ?" + }, "baseDomain": { "message": "Domaine de base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nom de l’élément" }, - "cannotRemoveViewOnlyCollections": { - "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Connexion initiée" }, + "logInRequestSent": { + "message": "Demande envoyée" + }, "submit": { "message": "Soumettre" }, @@ -1342,7 +1348,7 @@ "message": "Aucun élément à afficher." }, "noPermissionToViewAllCollectionItems": { - "message": "Vous n'avez pas la permission de voir tous les éléments de cette collection." + "message": "Vous n'avez pas l'autorisation d'afficher tous les éléments de cette collection." }, "youDoNotHavePermissions": { "message": "Vous n'avez pas les autorisations pour cette collection" @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Une notification a été envoyée à votre appareil." }, + "notificationSentDevicePart1": { + "message": "Déverrouillez Bitwarden sur votre appareil ou sur le " + }, + "areYouTryingToAccessYourAccount": { + "message": "Essayez-vous d'accéder à votre compte ?" + }, + "accessAttemptBy": { + "message": "Tentative d'accès par $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirmer l'accès" + }, + "denyAccess": { + "message": "Refuser l'accès" + }, + "notificationSentDeviceAnchor": { + "message": "application web" + }, + "notificationSentDevicePart2": { + "message": "Assurez-vous que la phrase d'empreinte correspond à celle ci-dessous avant d'approuver." + }, + "notificationSentDeviceComplete": { + "message": "Déverrouillez Bitwarden sur votre appareil. Assurez-vous que la phrase d'empreinte correspond à celle ci-dessous avant d'approuver." + }, "aNotificationWasSentToYourDevice": { "message": "Une notification a été envoyée à votre appareil" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Assurez-vous que votre compte est déverrouillé et que la phrase d'empreinte correspond à l'autre appareil" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Éviter les caractères ambigus", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Régénérer un mot de passe" - }, "length": { "message": "Longueur" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gérer" }, - "canManage": { - "message": "Peut gérer" + "manageCollection": { + "message": "Gérer la collection" + }, + "viewItems": { + "message": "Afficher les éléments" + }, + "viewItemsHidePass": { + "message": "Afficher les éléments, les mots de passe cachés" + }, + "editItems": { + "message": "Modifier les items" + }, + "editItemsHidePass": { + "message": "Modifier les éléments, les mots de passe cachés" }, "disable": { "message": "Désactiver" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Un problème est survenu lors de la lecture de la clé de sécurité. Veuillez réessayer." }, - "twoFactorWebAuthnWarning": { - "message": "En raison des limitations de la plate-forme, WebAuthn ne peut pas être utilisé sur toutes les applications Bitwarden. Vous devriez mettre en place un autre fournisseur d'authentification à deux facteurs afin de pouvoir accéder à votre compte lorsque WebAuthn ne peut pas être utilisé. Plateformes supportées :" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Coffre web et extensions sur un ordinateur fixe/portable avec un navigateur compatible WebAuthn (Chrome, Opera, Vivaldi ou Firefox avec FIDO U2F activé)." + "twoFactorWebAuthnWarning1": { + "message": "En raison des limitations de plate-forme, WebAuthn ne peut pas être utilisé sur toutes les applications Bitwarden. Vous devriez mettre en place un autre fournisseur d'authentification à deux facteurs afin de pouvoir accéder à votre compte lorsque WebAuthn ne peut pas être utilisé." }, "twoFactorRecoveryYourCode": { "message": "Votre code de récupération de d'authentification à deux facteurs Bitwarden" @@ -3339,7 +3378,7 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "Il vous reste 1 invitation." }, "inviteZeroEmailDesc": { "message": "Il vous reste 0 invitations." @@ -3363,7 +3402,7 @@ "message": "Propriétaire" }, "ownerDesc": { - "message": "L’utilisateur avec l’accès le plus élevé qui peut gérer tous les aspects de votre organisation." + "message": "Gérer tous les aspects de votre organisation, y compris la facturation et les abonnements" }, "clientOwnerDesc": { "message": "Cet utilisateur doit être indépendant du fournisseur. Si le fournisseur est dissocié de l'organisation, cet utilisateur conservera la propriété de l'organisation." @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Définir les exigences pour le générateur de mot de passe." }, - "passwordGeneratorPolicyInEffect": { - "message": "Une ou plusieurs politiques de sécurité de l'organisation affectent les paramètres de votre générateur." - }, "masterPasswordPolicyInEffect": { "message": "Une ou plusieurs politiques de sécurité de l'organisation exigent que votre mot de passe principal réponde aux exigences suivantes :" }, @@ -5132,7 +5168,7 @@ "message": "Accordez et gérez l'accès d'urgence pour les contacts de confiance. Les contacts de confiance peuvent demander l'accès pour afficher ou reprendre le contrôle de votre compte en cas d'urgence. Consultez notre page d'aide pour plus d'informations et de détails sur le fonctionnement du partage à divulgation nulle de connaissance (zero knowledge sharing)." }, "emergencyAccessOwnerWarning": { - "message": "Vous êtes propriétaire d'une ou de plusieurs organisations. Si vous autorisez la prise de contrôle à un contact d'urgence, il sera en mesure d'utiliser toutes vos permissions de propriétaire après la prise de contrôle." + "message": "Vous êtes propriétaire d'une ou de plusieurs organisations. Si vous autorisez la prise de contrôle à un contact d'urgence, il sera en mesure d'utiliser toutes vos autorisations de propriétaire après la prise de contrôle." }, "trustedEmergencyContacts": { "message": "Contacts d'urgence de confiance" @@ -5359,7 +5395,7 @@ "message": "Permissions" }, "permission": { - "message": "Permission" + "message": "Autorisation" }, "accessEventLogs": { "message": "Accéder aux journaux d'événements" @@ -6641,7 +6677,7 @@ } }, "accessDenied": { - "message": "Accès Refusé. Vous n'avez pas la permission de voir cette page." + "message": "Accès Refusé. Vous n'avez pas l'autorisation d'afficher cette page." }, "masterPassword": { "message": "Mot de passe principal" @@ -6681,15 +6717,6 @@ "message": "Générateur", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Que souhaitez-vous générer ?" - }, - "passwordType": { - "message": "Type de mot de passe" - }, - "regenerateUsername": { - "message": "Régénérer le Nom d'Utilisateur" - }, "generateUsername": { "message": "Générer le Nom d'Utilisateur" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Type de Nom d'Utilisateur" - }, "plusAddressedEmail": { "message": "Courriel Adressé Plus", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6780,7 +6804,7 @@ "message": "Service" }, "unknownCipher": { - "message": "Élément inconnu, vous devrez peut-être vous connecter avec un autre compte pour accéder à cet élément." + "message": "Élément inconnu, vous devrez peut-être demander l'autorisation d'accéder à cet élément." }, "cannotSponsorSelf": { "message": "Vous ne pouvez pas réclamer pour le compte actif. Saisissez un courriel différent." @@ -6952,9 +6976,6 @@ "message": "Nom d'hôte", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Jetons d'accès API" - }, "deviceVerification": { "message": "Vérification de l'Appareil" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Aucune collection" }, - "canView": { - "message": "Peut voir" - }, - "canViewExceptPass": { - "message": "Peut voir, sauf les mots de passe" - }, - "canEdit": { - "message": "Peut modifier" - }, - "canEditExceptPass": { - "message": "Peut modifier, sauf les mots de passe" - }, "noCollectionsAdded": { "message": "Pas de collections ajoutées" }, @@ -7868,7 +7877,7 @@ "message": "Sélectionner les groupes" }, "userPermissionOverrideHelperDesc": { - "message": "Les permissions définies pour un membre remplaceront les permissions définies par le groupe de ce membre." + "message": "Les autorisations définies pour un membre remplaceront les autorisations définies par le groupe de ce membre." }, "noMembersOrGroupsAdded": { "message": "Aucun membre ou groupe ajouté" @@ -8255,7 +8264,7 @@ "message": "Exiger que les membres existants changent leurs mots de passe" }, "smProjectDeleteAccessRestricted": { - "message": "Vous n'avez pas les droits pour supprimer ce projet", + "message": "Vous n'avez pas les autorisations pour supprimer ce projet", "description": "The individual description shown to the user when the user doesn't have access to delete a project." }, "smProjectsDeleteBulkConfirmation": { @@ -8626,7 +8635,7 @@ "message": "Limiter la suppression de collections aux propriétaires et administrateurs" }, "limitItemDeletionDesc": { - "message": "Limite la suppression de l'élément aux membres avc l'autorisation Peut gérer" + "message": "Limite la suppression de l'élément aux membres avec l'autorisation Peut gérer" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Les propriétaires et les administrateurs peuvent gérer toutes les collections et tous les éléments" @@ -8677,9 +8686,6 @@ "message": "URL du serveur auto-hébergé", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Domaine de l'alias" - }, "alreadyHaveAccount": { "message": "Vous avez déjà un compte ?" }, @@ -8690,7 +8696,7 @@ "message": "Sauter directement au contenu" }, "managePermissionRequired": { - "message": "Au moins un membre ou un groupe doit avoir la permission peut gérer." + "message": "Au moins un membre ou un groupe doit avoir l'autorisation peut gérer." }, "typePasskey": { "message": "Passkey" @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Vous n'avez pas accès à la gestion de cette collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "\"Peut Gérer les Permissions\" manquant" + "grantManageCollectionWarningTitle": { + "message": "Autorisations pour Gérer la Collection manquantes" }, - "grantAddAccessCollectionWarning": { - "message": "Accorder \"Peut Gérer les Permissions\" pour permettre une gestion complète de la collection, y compris la suppression de la collection." + "grantManageCollectionWarning": { + "message": "Accorde les autorisations pour Gérer la collection pour permettre la gestion complète de la collection incluant sa suppression." }, "grantCollectionAccess": { "message": "Accorder l'accès à cette collection aux groupes ou aux membres." @@ -9458,16 +9464,16 @@ "message": "Informations sur les taxes mises à jour" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "ID de taxe non valide, si vous pensez qu'il s'agit d'une erreur, veuillez contacter le support." }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "Nous n'avons pu valider votre ID de taxes. Si vous pensez que c'est une erreur, veuillez contacter le support s'il-vous-plaît." }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "ID de taxe non valide, si vous pensez qu'il s'agit d'une erreur, veuillez contacter le support." }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "Une erreur s'est produite lors de la prévisualisation de la facture. Veuillez réessayer plus tard." }, "unverified": { "message": "Non vérifié" @@ -9510,7 +9516,7 @@ "message": "(Aucune collection)" }, "memberAccessReportNoCollectionPermission": { - "message": "(Aucune permission de collection)" + "message": "(Aucune Autorisation de Collection)" }, "memberAccessReportNoGroup": { "message": "(Aucun groupe)" @@ -9552,7 +9558,7 @@ "message": " Contactez le Support Client pour rétablir votre abonnement." }, "secretPeopleDescription": { - "message": "Autoriser les groupes ou les personnes à accéder à ce secret. Les permissions définies pour les personnes remplaceront les permissions définies par les groupes." + "message": "Autoriser les groupes ou les personnes à accéder à ce secret. Les autorisations définies pour les personnes remplaceront les autorisations définies par les groupes." }, "secretPeopleEmptyMessage": { "message": "Ajouter des personnes ou des groupes pour partager l'accès à ce secret" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Code descripteur" }, + "cannotRemoveViewOnlyCollections": { + "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Avis important" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Les administrateurs ont maintenant la possibilité de supprimer les comptes de membre qui appartiennent à un domaine revendiqué." + }, + "deleteManagedUserWarningDesc": { + "message": "Cette action supprimera le compte du membre, incluant tous les éléments de son coffre. Cela remplace l'action précédente de Supprimer." + }, + "deleteManagedUserWarning": { + "message": "Supprimer est une nouvelle action !" + }, + "seatsRemaining": { + "message": "Vous avez $REMAINING$ places restantes sur $TOTAL$ attribuées à cette organisation. Contactez votre fournisseur pour gérer votre abonnement.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Organisation existante" + }, + "selectOrganizationProviderPortal": { + "message": "Sélectionnez une organisation à ajouter à votre Portail fournisseur." + }, + "noOrganizations": { + "message": "Il n'y a aucune organisation à lister" + }, + "yourProviderSubscriptionCredit": { + "message": "Votre abonnement à un fournisseur recevra un crédit pour tout temps restant dans l'abonnement de l'organisation." + }, + "doYouWantToAddThisOrg": { + "message": "Voulez-vous ajouter cette organisation à $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Organisation existante ajoutée" + }, + "assignedExceedsAvailable": { + "message": "Les places assignées dépassent les places disponibles." } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index b7baf7097ae..f5cd301fc5f 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nome do elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "Non podes eliminar coleccións con permisos de só lectura: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Non podes eliminar coleccións con permisos de só lectura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index fe6b6008f66..27ea87bcfe4 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ערוך תיקייה" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "שם בסיס הדומיין", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "לדוגמא", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "שלח" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "גרסה $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "צור סיסמה חדשה" - }, "length": { "message": "אורך" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "נהל" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "בטל" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "היתה בעיה בקריאת מפתח האבטחה. נסה בשנית." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "קוד השחזור שלך עבור כניסה דו שלבית לBitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "הגדר דרישות מינימום במחולל הסיסמאות." }, - "passwordGeneratorPolicyInEffect": { - "message": "מדיניות ארגונית אחת או יותר משפיעה על הגדרות המחולל שלך." - }, "masterPasswordPolicyInEffect": { "message": "אחד או יותר מכללי מדיניות הארגון דורשים שסיסמתך הראשית תעמוד בדרישות הבאות:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index f23ad758ea6..266a868e435 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index b157f158a53..d5675a9cca3 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -114,7 +114,7 @@ "message": "Rizični korisnici" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Izloženi članovi ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -123,7 +123,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "Izložene aplikacije ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -132,13 +132,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Ovi članovi se prijavljuju u aplikacije slabim, izloženim ili ponovno korištenim lozinkama." }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "Ove aplikacije imaju slabe, izložene ili ponovno korištene lozinke." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Ovi članovi se u $APPNAME$ prijavljuju slabim, izloženim ili ponovno korištenim lozinkama.", "placeholders": { "appname": { "content": "$1", @@ -156,10 +156,10 @@ "message": "Ukupno aplikacija" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Odznači kao kritičnu aplikaciju" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Kritična aplikacija uspješno odznačena" }, "whatTypeOfItem": { "message": "Koja je ovo vrsta stavke?" @@ -464,6 +464,18 @@ "editFolder": { "message": "Uredi mapu" }, + "newFolder": { + "message": "Nova mapa" + }, + "folderName": { + "message": "Naziv mape" + }, + "folderHintText": { + "message": "Ugnijezdi mapu dodavanjem naziva roditeljske mape i znaka kroz. Npr. Mreže/Forumi" + }, + "deleteFolderPermanently": { + "message": "Sigurno želiš trajno izbrisati ovu mapu?" + }, "baseDomain": { "message": "Primarna domena", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Naziv stavke" }, - "cannotRemoveViewOnlyCollections": { - "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "npr.", "description": "Short abbreviation for 'example'." @@ -1168,20 +1171,23 @@ "message": "Potvrdi svoj identitet" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Nastavi prijavu" }, "whatIsADevice": { - "message": "What is a device?" + "message": "Što je uređaj?" }, "aDeviceIs": { - "message": "A device is a unique installation of the Bitwarden app where you have logged in. Reinstalling, clearing app data, or clearing your cookies could result in a device appearing multiple times." + "message": "Uređaj je jedinstvena instalacija Bitwarden aplikacije gdje si prijavljen/a. Ponovna instalacija, brisanje podataka aplikacije ili kolačića može rezultirati višestrukim prikazom uređaja." }, "logInInitiated": { "message": "Pokrenuta prijava" }, + "logInRequestSent": { + "message": "Zahtjev poslan" + }, "submit": { "message": "Pošalji" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Obavijest je poslana na tvoj uređaj." }, + "notificationSentDevicePart1": { + "message": "Otključaj Bitwarden na svojem uređaju ili na " + }, + "areYouTryingToAccessYourAccount": { + "message": "Pokušavaš li pristupiti svom računu?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ pokušava pristupiti", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potvrdi pristup" + }, + "denyAccess": { + "message": "Odbij pristup" + }, + "notificationSentDeviceAnchor": { + "message": "web trezoru" + }, + "notificationSentDevicePart2": { + "message": "Provjeri slaže li se jedinstvena fraza s ovdje prikazanom prije odobravanja." + }, + "notificationSentDeviceComplete": { + "message": "Otključaj Bitwarden na svojem uređaju. Provjeri slaže li se jedinstvena fraza s ovdje prikazanom prije odobravanja." + }, "aNotificationWasSentToYourDevice": { "message": "Obavijest je poslana na tvoj uređaj" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Provjeri je li trezor otključan i slaže li se jedinstvena fraza s drugim uređajem" - }, "versionNumber": { "message": "Verzija $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Izbjegavaj dvosmislene znakove", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Ponovno generiraj lozinku" - }, "length": { "message": "Duljina" }, @@ -1767,10 +1797,10 @@ "message": "Molimo, ponovno se prijavi." }, "currentSession": { - "message": "Current session" + "message": "Trenutna sesija" }, "requestPending": { - "message": "Request pending" + "message": "Zahtjev u tijeku" }, "logBackInOthersToo": { "message": "Molimo, ponovno se prijavi. Ako koristiš druge aplikacije Bitwarden i u njima napravi odjavu/prijavu." @@ -1849,25 +1879,25 @@ "message": "Ako nastaviš, trenutna sesija će biti zatvorena, što će zahtijevati ponovnu prijavu uklljučujući i prijavu dvostrukom autentifikacijom, ako je ona aktivna. Aktivne sesije na drugim uređajima mogu ostati aktivne još jedan sat." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Prijava novog uređaja" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Isključi zaštitu prijave novih uređaja" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Uključi zaštitu prijave novih uređaja" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Za prestanak dobivanja e-pošte kada se prijaviš s novog uređaja, nastavi niže." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Za dobivanje e-pošte kada se prijaviš s novog uređaja, nastavi niže." }, "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": "Ako je zaštita prijave novih uređaja isključena, bilo tko s tvojom glavnom lozinkom može pristupiti tvom računu s bilo kojeg uređaja. Za zaštitu svog računa bez potvrde e-poštom, uključi dvostruku autentifikaciju." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Promjene zaštite prijave novih uređaja su spremljene" }, "sessionsDeauthorized": { "message": "Sve sesije deautorizirane" @@ -2170,8 +2200,20 @@ "manage": { "message": "Upravljaj" }, - "canManage": { - "message": "Može upravljati" + "manageCollection": { + "message": "Upravljaj zbirkom" + }, + "viewItems": { + "message": "Prikaz stavke" + }, + "viewItemsHidePass": { + "message": "Prikaz stavke, skrivene lozinke" + }, + "editItems": { + "message": "Uredi stavke" + }, + "editItemsHidePass": { + "message": "Uredi stavke, skrivene lozinke" }, "disable": { "message": "Onemogući" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Došlo je do pogreške kod očitavanja sigurnosnog ključa. Pokušaj ponovno." }, - "twoFactorWebAuthnWarning": { - "message": "Zbog platformskih ograničenja, WebAuthn nije moguće koristiti s Bitwarden aplikacijama na svim platformama. Za pristup računu kada nije moguće koristiti WebAuthn, trebalo bi uključiti drugog pružatelja prijave dvostrukom autentifikacijom. Platforme na kojima je WebAuthn podržan:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web trezor i proširenja preglednika na stolnim/prijenosnim računalima s WebAuthn podržanim preglednikom (npr. Chrome, Opera, Vivaldi ili Firefox s omogućenim WebAuthn)." + "twoFactorWebAuthnWarning1": { + "message": "Zbog platformskih ograničenja, WebAuthn nije moguće koristiti sa svim Bitwarden aplikacijama. Uključi drugi način dvostruke autentifikacije za pristup računu kada se ne može koristiti WebAuthn." }, "twoFactorRecoveryYourCode": { "message": "Tvoj kôd za oporavak Bitwarden prijave dvostrukom autentifikacijom" @@ -3339,10 +3378,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "Imaš jednu preostalu pozivnicu." }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "Nemaš preostalih pozivnica." }, "userUsingTwoStep": { "message": "Ovaj korisnik upotrebljava prijavu u dva koraka za zaštitu svog računa." @@ -3796,7 +3835,7 @@ } }, "unlinkedSso": { - "message": "Unlinked SSO." + "message": "SSO odspojen." }, "unlinkedSsoUser": { "message": "Odspojen SSO za korisnika $ID$.", @@ -3847,22 +3886,22 @@ "message": "Uređaj" }, "loginStatus": { - "message": "Login status" + "message": "Status prijave" }, "firstLogin": { - "message": "First login" + "message": "Prva prijava" }, "trusted": { - "message": "Trusted" + "message": "Pouzdan" }, "needsApproval": { - "message": "Needs approval" + "message": "Zahtjeva odobrenje" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Pokušavaš li se prijaviti?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "$EMAIL$ se pokušava prijaviti", "placeholders": { "email": { "content": "$1", @@ -3871,22 +3910,22 @@ } }, "deviceType": { - "message": "Device Type" + "message": "Vrsta uređaja" }, "ipAddress": { - "message": "IP Address" + "message": "IP Adresa" }, "confirmLogIn": { - "message": "Confirm login" + "message": "Potvrdi prijavu" }, "denyLogIn": { - "message": "Deny login" + "message": "Odbij prijavu" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "Ovaj zahtjev više nije valjan." }, "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", + "message": "Prijava za $EMAIL$ potvrđena na uređaju $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -3899,16 +3938,16 @@ } }, "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "Odbijena je prijava na drugom uređaju. Ako si ovo stvarno ti, pokušaj se ponovno prijaviti uređajem." }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "Zahtjev za prijavu je već istekao." }, "justNow": { - "message": "Just now" + "message": "Upravo" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Zatraženo prije $MINUTES$ minute/a", "placeholders": { "minutes": { "content": "$1", @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Postavi pravila sigurnosti koje mora zadovoljiti generator lozinki." }, - "passwordGeneratorPolicyInEffect": { - "message": "Jedna ili više organizacijskih pravila utječe na postavke generatora." - }, "masterPasswordPolicyInEffect": { "message": "Jedna ili više organizacijskih pravila zahtijeva da tvoja glavna lozinka ispunjava sljedeće uvjete:" }, @@ -5807,17 +5843,17 @@ "message": "Greška" }, "decryptionError": { - "message": "Decryption error" + "message": "Pogreška pri dešifriranju" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nije mogao dešifrirati sljedeće stavke trezora." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Kontaktiraj službu za korisnike", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "kako bi izbjegli gubitak podataka.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Što želiš generirati?" - }, - "passwordType": { - "message": "Tip lozinke" - }, - "regenerateUsername": { - "message": "Ponovno generiraj korisničko ime" - }, "generateUsername": { "message": "Generiraj korisničko ime" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tip korisničkog imena" - }, "plusAddressedEmail": { "message": "Plus adresa e-pošte", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Koristi konfigurirani catch-all sandučić svoje domene." }, "useThisEmail": { - "message": "Use this email" + "message": "Koristi ovu e-poštu" }, "random": { "message": "Nasumično", @@ -6952,9 +6976,6 @@ "message": "Naziv poslužitelja", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token za API pristup" - }, "deviceVerification": { "message": "Provjera uređaja" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Nema zbirke" }, - "canView": { - "message": "Može vidjeti" - }, - "canViewExceptPass": { - "message": "Može vidjeti, osim lozinke" - }, - "canEdit": { - "message": "Može urediti" - }, - "canEditExceptPass": { - "message": "Može urediti, osim lozinke" - }, "noCollectionsAdded": { "message": "Niti jedna zbirka nije dodana" }, @@ -8302,31 +8311,31 @@ "message": "Pouzdani uređaji" }, "memberDecryptionOptionTdeDescPart1": { - "message": "Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The", + "message": "Članovi neće trebati glavnu lozinku kada se prijavljuju putem SSO-a. Glavnu lozinku zamjenjuje ključem za šifriranje pohranjen na uređaju, što taj uređaj čini pouzdanim. Prvi uređaj na kojem član kreira svoj račun i s kojeg se prijavi bit će pouzdan. Nove uređaje morat će odobriti ili postojeći pouzdani uređaj ili administrator. Pravilo", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "isključive organizacije,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "policy,", + "message": "", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "SSO required", + "message": "obavezne SSO prijave", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "policy, and", + "message": "i", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { - "message": "account recovery administration", + "message": "administracije oporavka računa", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "policy will turn on when this option is used.", + "message": "biti će uključeni ako se koristi ova opcija.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { @@ -8405,16 +8414,16 @@ "message": "Odobri zahtjev" }, "deviceApproved": { - "message": "Device approved" + "message": "Uređaj odobren" }, "deviceRemoved": { - "message": "Device removed" + "message": "Uređaj uklonjen" }, "removeDevice": { - "message": "Remove device" + "message": "Ukloni uređaj" }, "removeDeviceConfirmation": { - "message": "Are you sure you want to remove this device?" + "message": "Sigurno želiš ukoniti ovaj uređaj?" }, "noDeviceRequests": { "message": "Nema zahtjeva na čekanju" @@ -8626,7 +8635,7 @@ "message": "Omogući brisanje zbirki samo vlasnicima i adminima" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ograniči brisanje stavke samo članovima koji imaju dozvolu „Moguće upravljanje”" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Vlasnici i admini mogu upravljati svim zbirkama i stavkama" @@ -8677,9 +8686,6 @@ "message": "URL vlastitog poslužitelja", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domene" - }, "alreadyHaveAccount": { "message": "Već imaš račun?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nemaš pristup za upravljanje ovom zbirkom." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Neodstaju prava „Moguće upravljanje”" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Dodijeli prava „Moguće upravljanje” kako bi dozvolili puni pristup zbirkama uključujući brisanje." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Dodijeli grupama i članovima pristup ovoj zbirki." @@ -9307,7 +9313,7 @@ "message": "mjesečno po korisniku" }, "monthPerMemberBilledAnnually": { - "message": "month per member billed annually" + "message": "mjesečno po članu, naplata godišnje" }, "seats": { "message": "Mjesta" @@ -9458,16 +9464,16 @@ "message": "Ažurirane porezne informacije" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Neispravni porezni broj. Ako misliš da je broj ispravan, kontaktiraj podršku." }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "Nismo mogli provjeriti tvoj porezni broj. Ako misliš da je broj ispravan, kontaktiraj podršku." }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Neispravni porezni broj. Ako misliš da je broj ispravan, kontaktiraj podršku." }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "Greška kod pregleda fakture. Pokušaj ponovno kasnije." }, "unverified": { "message": "Nepotvrđeno" @@ -9830,13 +9836,13 @@ "message": "Algoritam ključa" }, "sshPrivateKey": { - "message": "Private key" + "message": "Privatni ključ" }, "sshPublicKey": { - "message": "Public key" + "message": "Javni ključ" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Otisak prsta" }, "sshKeyFingerprint": { "message": "Otisak prsta" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Šifra uplate" }, + "cannotRemoveViewOnlyCollections": { + "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Važna napomena" }, @@ -10131,13 +10146,13 @@ "message": "Ukloni članove" }, "devices": { - "message": "Devices" + "message": "Uređaji" }, "deviceListDescription": { - "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." + "message": "Tvoj račun je prijavljen na svakom od ovih uređaja. Ako ne prepoznaješ uređaj, odmah ga ukloni." }, "deviceListDescriptionTemp": { - "message": "Your account was logged in to each of the devices below." + "message": "Tvoj račun je prijavljen na svakom od ovih uređaja." }, "claimedDomains": { "message": "Potvrđene domene" @@ -10225,7 +10240,7 @@ "message": "Naziv organizacije ne može biti duži od 50 znakova." }, "resellerRenewalWarningMsg": { - "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", + "message": "Tvoja će se pretplata uskoro obnoviti. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnove prije $RENEWAL_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10238,7 +10253,7 @@ } }, "resellerOpenInvoiceWarningMgs": { - "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.", + "message": "Za tvoju je pretplatu $ISSUED_DATE$ izdana faktura. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnove prije $DUE_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10255,7 +10270,7 @@ } }, "resellerPastDueWarningMsg": { - "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.", + "message": "Faktura za tvoju pretplatu nije plaćena. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnovu prije $GRACE_PERIOD_END$.", "placeholders": { "reseller": { "content": "$1", @@ -10268,18 +10283,67 @@ } }, "restartOrganizationSubscription": { - "message": "Organization subscription restarted" + "message": "Organizacijska pretplata ponovno pokrenuta" }, "restartSubscription": { - "message": "Restart your subscription" + "message": "Ponovno pokreni pretplatu" }, "suspendedManagedOrgMessage": { - "message": "Contact $PROVIDER$ for assistance.", + "message": "Kontaktiraj $PROVIDER$ za pomoć.", "placeholders": { "provider": { "content": "$1", "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "Imaš još $REMAINING$ preostalih sjedišta od $TOTAL$ dodijeljenih ovog organizaciji. Kontaktiraj svog pružatelja usluge za upravljanje pretplatom.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Postojeća organizacija" + }, + "selectOrganizationProviderPortal": { + "message": "Odaberi organizaciju koju želiš dodati na svoj portal pružatelja usluga." + }, + "noOrganizations": { + "message": "Nema organizaciji za prikaz" + }, + "yourProviderSubscriptionCredit": { + "message": "Tvoja pretplata davatelja usluga dobit će kredit za preostalo vrijeme u organizacijskoj pretplati." + }, + "doYouWantToAddThisOrg": { + "message": "IP Adresa", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Postojeća organizacija dodana" + }, + "assignedExceedsAvailable": { + "message": "Dodijeljene licence premašuju dostupne licence." } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 64f5c158a9e..bdc55b96d3c 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Mappa szerkesztése" }, + "newFolder": { + "message": "Új mappa" + }, + "folderName": { + "message": "Mappanév" + }, + "folderHintText": { + "message": "Mappa beágyazása a szülőmappa nevének hozzáadásával, majd egy “/” karakterrel. Példa: Közösségi/Fórumok" + }, + "deleteFolderPermanently": { + "message": "Biztosan véglegesen törlésre kerüljön ez a mappa?" + }, "baseDomain": { "message": "Alap domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Elem neve" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "Példa:", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "A bejelentkezés elindításra került." }, + "logInRequestSent": { + "message": "A kérés elküldésre került." + }, "submit": { "message": "Elküldés" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A rendszer értesítést küldött az eszközre." }, + "notificationSentDevicePart1": { + "message": "A Bitwarden zárolás feloldása az eszközön vagy: " + }, + "areYouTryingToAccessYourAccount": { + "message": "A fiókhoz próbálunk hozzáférni?" + }, + "accessAttemptBy": { + "message": "Bejelentkezési kísérlet $EMAIL$ segítségével", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Hozzáférés megerősítése" + }, + "denyAccess": { + "message": "Hozzáférés megtagadása" + }, + "notificationSentDeviceAnchor": { + "message": "webalkalmazás" + }, + "notificationSentDevicePart2": { + "message": "Jóváhagyás előtt győződjünk meg arról, hogy az ujjlenyomat kifejezés megegyezik az alábbi kifejezéssel." + }, + "notificationSentDeviceComplete": { + "message": "Oldjuk fel a Bitwarden zárolását az eszközön. Jóváhagyás előtt győződjünk meg arról, hogy az ujjlenyomat kifejezés megegyezik az alábbi kifejezéssel." + }, "aNotificationWasSentToYourDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Ellenőrizzük, hogy a széf feloldásra került és az ujjlenyomat kifejezés egyezik a másik eszközön levővel." - }, "versionNumber": { "message": "Verzió: $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Félreérthető karakterek mellőzése", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Jelszó újragenerálása" - }, "length": { "message": "Hossz" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Kezelés" }, - "canManage": { - "message": "Kezelhet" + "manageCollection": { + "message": "Gyűjtemény kezelése" + }, + "viewItems": { + "message": "Elemek megtekintése" + }, + "viewItemsHidePass": { + "message": "Elemek megtekintése, rejtett jelszavak" + }, + "editItems": { + "message": "Elemek szerkesztése" + }, + "editItemsHidePass": { + "message": "Elemek szerkesztése, rejtett jelszavak" }, "disable": { "message": "Letiltás" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Probléma lépett fel a biztonsági kulcs olvasásakor. Próbáljuk újra." }, - "twoFactorWebAuthnWarning": { - "message": "A platform korlátozások miatt nem lehetséges minden Bitwarden alkalmazásban YubiKey eszközt használni. Engedélyezzünk egy másik kétlépcsős bejelentkezés szolgáltatót, hogy hozzáférhessünk a fiókhoz akkor is, ha a YubiKey nem használható. Támogatott platformok:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web széf és böngésző kiegészítők asztali gépen / laptopon engedélyezett U2F böngészővel (Chrome, Opera, Vivaldi, vagy Firefox bekapcsolt FIDO U2F-fel)." + "twoFactorWebAuthnWarning1": { + "message": "A platform korlátozások miatt nem lehetséges minden Bitwarden alkalmazásban a WebAuthn használata. Be kell üzemelni egy másik kétlépcsős bejelentkezés szolgáltatót, hogy hozzáférhessünk a fiókhoz akkor is, ha a WebAuthn nem használható." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden kétlépcsős bejelentkezés helyreállító kód" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "A minimális követelmények beállítása a jelszó generáló konfigurációhoz." }, - "passwordGeneratorPolicyInEffect": { - "message": "Egy vagy több szervezeti szabály érinti a generátor beállításokat." - }, "masterPasswordPolicyInEffect": { "message": "Egy vagy több szervezeti szabály előírja a mesterjelszóhoz a következő követelményeket:" }, @@ -6681,15 +6717,6 @@ "message": "Generátor", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Mit szeretnénk generálni?" - }, - "passwordType": { - "message": "Jelszótípus" - }, - "regenerateUsername": { - "message": "Felhasználónév ismételt generálása" - }, "generateUsername": { "message": "Felhasználónév generálása" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Felhasználónév típusa" - }, "plusAddressedEmail": { "message": "További címzési email cím", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Kiszolglónév", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API hozzáférési vezérjel" - }, "deviceVerification": { "message": "Eszköz ellenőrzés" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Nincs gyűjtemény." }, - "canView": { - "message": "Megtekintheti" - }, - "canViewExceptPass": { - "message": "Megtekintheti, kivéve a jelszavakat" - }, - "canEdit": { - "message": "Szerkesztheti" - }, - "canEditExceptPass": { - "message": "Szerkesztheti, kivéve a jelszavakat" - }, "noCollectionsAdded": { "message": "Nem lett gyűjtemény hozzáadva." }, @@ -8626,7 +8635,7 @@ "message": "A gyűjtemény törlésének korlátozása tulajdonosokra és adminisztrátorokra" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Az elemek törlésének korlátozása a Kezelheti jogosultsággal rendelkező tagokra" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Owners and admins can manage all collections and items" @@ -8677,9 +8686,6 @@ "message": "Saját üzemeltetésű szerver webcím", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Áldomain" - }, "alreadyHaveAccount": { "message": "Van már saját fiók?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nincs jogosultság ennek a gyűjteménynek a kezelésére." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Hiányzó gyűjtemény kezelési engedélyek" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Adjunk gyűjtemény kezelési engedélyeket, hogy lehetővé tegyük a teljes gyűjtemény kezelést, beleértve a gyűjtemény törlését is." }, "grantCollectionAccess": { "message": "Adjunk hozzáférést csoportoknak vagy személyeknek eennél a gyűjteménynél." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Leíró kód" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Fontos megjegyzés" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Az adminisztrátorok mostantól törölhetik az igényelt tartományhoz tartozó tagi fiókokat." + }, + "deleteManagedUserWarningDesc": { + "message": "Ez a művelet törli a tagi fiókot, beleértve a tárolókban lévő összes elemet. Ez felváltja az előző Eltávolítás műveletet." + }, + "deleteManagedUserWarning": { + "message": "A törlés új művelet!" + }, + "seatsRemaining": { + "message": "$REMAINING$ hely maradt a szervezethez rendelt $TOTAL$ helyből. Az előfizetés kezeléséhez forduljunk a szolgáltatóhoz.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Létező szervezet" + }, + "selectOrganizationProviderPortal": { + "message": "Válasszuk ki a szolgáltatói portálhoz hozzáadni kívánt szervezetet." + }, + "noOrganizations": { + "message": "Nincsenek listázható szervezetek." + }, + "yourProviderSubscriptionCredit": { + "message": "A szolgáltatói előfizetés jóváírást kap a szervezet előfizetésből hátralévő időre." + }, + "doYouWantToAddThisOrg": { + "message": "Hozzáadásra kerüljön ez a szervezet $PROVIDER$ szolgáltatáshoz?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "A létező szervezet hozzáadásra került." + }, + "assignedExceedsAvailable": { + "message": "A hozzárendelt helyek száma meghaladja a rendelkezésre álló helyek számát." } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 1fd1632e306..565cb743eab 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit Folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Domain dasar", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "cth.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Kirim" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versi $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Buat Ulang Sandi" - }, "length": { "message": "Panjang" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Kelola" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Nonaktifkan" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Ada masalah saat membaca kunci keamanan. Coba lagi." }, - "twoFactorWebAuthnWarning": { - "message": "Karena keterbatasan platform, WebAuthn tidak dapat digunakan di semua aplikasi Bitwarden. Anda harus mengaktifkan penyedia proses masuk dua langkah lainnya sehingga Anda dapat mengakses akun Anda saat WebAUthn tidak dapat digunakan. Platform yang didukung:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Brankas web dan ekstensi browser di desktop / laptop dengan browser yang mendukung WebAuthn (Chrome, Opera, Vivaldi, atau Firefox dengan FIDO U2F diaktifkan)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Kode pemulihan masuk dua langkah Bitwarden Anda" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Tetapkan persyaratan minimum untuk konfigurasi pembuat kata sandi." }, - "passwordGeneratorPolicyInEffect": { - "message": "Satu atau beberapa kebijakan organisasi memengaruhi pengaturan generator Anda." - }, "masterPasswordPolicyInEffect": { "message": "Satu atau lebih kebijakan organisasi memerlukan kata sandi utama Anda untuk memenuhi persyaratan berikut:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Jenis kata sandi" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Jenis nama pengguna" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Verifikasi Perangkat" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 082b087120c..d05dec8e603 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Modifica cartella" }, + "newFolder": { + "message": "Nuova cartella" + }, + "folderName": { + "message": "Nome cartella" + }, + "folderHintText": { + "message": "Annida una cartella aggiungendo il nome della cartella superiore seguito da un “/”. Esempio: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Sei sicuro di voler eliminare definitivamente questo cartella?" + }, "baseDomain": { "message": "Dominio di base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nome elemento" }, - "cannotRemoveViewOnlyCollections": { - "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "es.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Login avviato" }, + "logInRequestSent": { + "message": "Richiesta inviata" + }, "submit": { "message": "Invia" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Una notifica è stata inviata al tuo dispositivo." }, + "notificationSentDevicePart1": { + "message": "Sblocca Bitwarden sul tuo dispositivo o su " + }, + "areYouTryingToAccessYourAccount": { + "message": "Stai cercando di accedere al tuo account?" + }, + "accessAttemptBy": { + "message": "Tentativo di accesso di $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Conferma accesso" + }, + "denyAccess": { + "message": "Nega accesso" + }, + "notificationSentDeviceAnchor": { + "message": "app web" + }, + "notificationSentDevicePart2": { + "message": "Assicurarsi che la frase di impronta digitale corrisponda a quella sottostante prima dell'approvazione." + }, + "notificationSentDeviceComplete": { + "message": "Sblocca Bitwarden sul tuo dispositivo. Assicurati che la frase di impronta digitale corrisponda a quella sottostante prima di approvare." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versione $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Rigenera password" - }, "length": { "message": "Lunghezza" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gestisci" }, - "canManage": { - "message": "Può gestire" + "manageCollection": { + "message": "Gestisci collezione" + }, + "viewItems": { + "message": "Vedi voci" + }, + "viewItemsHidePass": { + "message": "Vedi elementi, parole d'accesso nascoste" + }, + "editItems": { + "message": "Modifica voci" + }, + "editItemsHidePass": { + "message": "Modifica elementi, parole d'accesso nascoste" }, "disable": { "message": "Disattiva" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Si è verificato un problema durante la lettura della chiave di sicurezza. Riprova." }, - "twoFactorWebAuthnWarning": { - "message": "A causa di limitazioni della piattaforma, WebAuthn non può essere utilizzato su tutte le app Bitwarden. Dovresti abilitare un altro metodo di verifica in due passaggi per accedere al tuo account anche quando WebAuthn non può essere usato. Piattaforme supportate:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Cassaforte Web ed estensione per il browser desktop/laptop con un browser abilitato per WebAuthn (Chrome, Opera, Vivaldi o Firefox con FIDO U2F abilitato)." + "twoFactorWebAuthnWarning1": { + "message": "A causa delle limitazioni della piattaforma, WebAuthn non può essere usato in tutte le applicazioni Bitwarden. È necessario impostare un altro fornitore d'accesso in due passaggi in modo da poter accedere al tuo account quando WebAuthn non può essere usato." }, "twoFactorRecoveryYourCode": { "message": "Il tuo codice di recupero Bitwarden per la verifica in due passaggi" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Imposta requisiti minimi di complessità per il generatore di password." }, - "passwordGeneratorPolicyInEffect": { - "message": "Una o più politiche dell'organizzazione stanno influenzando le impostazioni del tuo generatore." - }, "masterPasswordPolicyInEffect": { "message": "Una o più politiche dell'organizzazione richiedono che la tua password principale soddisfi questi requisiti:" }, @@ -6681,15 +6717,6 @@ "message": "Generatore", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Cosa vuoi generare?" - }, - "passwordType": { - "message": "Tipo di password" - }, - "regenerateUsername": { - "message": "Rigenera nome utente" - }, "generateUsername": { "message": "Genera nome utente" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipo di nome utente" - }, "plusAddressedEmail": { "message": "Indirizzo email alternativo", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nome host", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token di accesso API" - }, "deviceVerification": { "message": "Verifica del dispositivo" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Nessuna raccolta" }, - "canView": { - "message": "Può visualizzare" - }, - "canViewExceptPass": { - "message": "Può visualizzare, eccetto le password" - }, - "canEdit": { - "message": "Può modificare" - }, - "canEditExceptPass": { - "message": "Può modificare, eccetto le password" - }, "noCollectionsAdded": { "message": "Nessuna raccolta aggiunta" }, @@ -8626,7 +8635,7 @@ "message": "Limit collection deletion to owners and admins" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Limita l'eliminazione di elementi ai membri con il permesso di gestione" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Proprietari e amministratori possono gestire tutte le raccolte e gli elementi" @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Dominio alias" - }, "alreadyHaveAccount": { "message": "Hai già un account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Non hai accesso alla gestione di questa raccolta." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Autorizzazione Può gestire mancante" + "grantManageCollectionWarningTitle": { + "message": "Permessi di gestione raccolte mancanti" }, - "grantAddAccessCollectionWarning": { - "message": "Concedi l'autorizzazione Può gestire per consentire la gestione completa della raccolta, inclusa l'eliminazione della raccolta." + "grantManageCollectionWarning": { + "message": "Concedi i permessi di gestione della collezione per consentire la gestione completa della raccolta, inclusa l'eliminazione della raccolta." }, "grantCollectionAccess": { "message": "Consenti a gruppi o membri di accedere a questa raccolta." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Gli amministratori ora hanno la possibilità di eliminare gli account membri che appartengono a un dominio rivendicato." + }, + "deleteManagedUserWarningDesc": { + "message": "Questa azione eliminerà l'account membro includendo tutti gli elementi nella sua cassaforte. Questo sostituisce l'azione precedente Rimuovi." + }, + "deleteManagedUserWarning": { + "message": "Eliminare è una nuova azione!" + }, + "seatsRemaining": { + "message": "Hai $REMAINING$ posti di $TOTAL$ posti assegnati a quest'organizzazione. Contatta il provider per gestire l'abbonamento.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Organizzazione esistente" + }, + "selectOrganizationProviderPortal": { + "message": "Seleziona un'organizzazione da aggiungere al tuo portale fornitori." + }, + "noOrganizations": { + "message": "Non ci sono organizzazioni da elencare" + }, + "yourProviderSubscriptionCredit": { + "message": "Il tuo abbonamento fornitore riceverà un credito per qualsiasi tempo rimanente nell'abbonamento dell'organizzazione." + }, + "doYouWantToAddThisOrg": { + "message": "Vuoi aggiungere questa organizzazione a $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Aggiunta organizzazione esistente" + }, + "assignedExceedsAvailable": { + "message": "I posti assegnati superano i posti disponibili." } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index b7ca1764125..dbe3ceb6eaf 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "フォルダーを編集" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "ベースドメイン", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "アイテム名" }, - "cannotRemoveViewOnlyCollections": { - "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "例:", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "ログイン開始" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "送信" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "デバイスに通知を送信しました。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "お使いのデバイスに通知が送信されました" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "アカウントがロック解除されていることと、フィンガープリントフレーズが他の端末と一致していることを確認してください" - }, "versionNumber": { "message": "バージョン $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "あいまいな文字を避ける", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "パスワードの再生成" - }, "length": { "message": "長さ" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "管理" }, - "canManage": { - "message": "管理可能" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "無効化" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "セキュリティキーの読み取り中に問題が発生しました。もう一度やり直して下さい。" }, - "twoFactorWebAuthnWarning": { - "message": "プラットフォームの制限により、WebAuthnはBitwardenの全てのアプリケーションで使用できるわけではありません。WebAuthnが使用できない場合に備えて、他の二段階認証プロバイダを有効化しておくことをおすすめします。サポートされているプラットフォーム:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn対応ブラウザ(FIDO U2F が有効な Chrome、Opera、Vivaldi、Firefox)を搭載したデスクトップ/ノートパソコンで、WebVaultとブラウザ拡張機能を使用します。" + "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." }, "twoFactorRecoveryYourCode": { "message": "二段階認証のリカバリーコード" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "パスワード生成の最低要件を設定する。" }, - "passwordGeneratorPolicyInEffect": { - "message": "組織の要件がパスワード生成の設定に影響しています。" - }, "masterPasswordPolicyInEffect": { "message": "組織が求めるマスターパスワードの要件は:" }, @@ -6681,15 +6717,6 @@ "message": "ジェネレーター", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "何を生成しますか?" - }, - "passwordType": { - "message": "パスワードの種類" - }, - "regenerateUsername": { - "message": "ユーザー名を再生成" - }, "generateUsername": { "message": "ユーザー名を生成" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "ユーザー名の種類" - }, "plusAddressedEmail": { "message": "プラス付きのメールアドレス", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "ホスト名", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API アクセストークン" - }, "deviceVerification": { "message": "デバイス認証" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "コレクションなし" }, - "canView": { - "message": "閲覧可能" - }, - "canViewExceptPass": { - "message": "パスワード以外は閲覧可能" - }, - "canEdit": { - "message": "編集可能" - }, - "canEditExceptPass": { - "message": "パスワード以外は編集可能" - }, "noCollectionsAdded": { "message": "コレクションが追加されていません" }, @@ -8677,9 +8686,6 @@ "message": "自己ホスト型サーバー URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "エイリアスドメイン" - }, "alreadyHaveAccount": { "message": "既にアカウントをお持ちですか?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "このコレクションを管理する権限がありません。" }, - "grantAddAccessCollectionWarningTitle": { - "message": "「管理可能」権限がありません" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "コレクションの削除を含む完全なコレクション管理を許可するには「管理可能」権限を許可してください。" + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "グループまたはメンバーにこのコレクションへのアクセスを許可します。" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 40b717edb69..92c64db7f56 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "საქაღალდის ჩასწორება" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "დომენის ბაზა", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "მაგ.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "ავტორიზაცია დაწყებულია" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "გადაცემა" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "შეტყობინება გამოიგზავნა თქვენი ტელეფონის მისამართით." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "ვერსია $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 18c40d79744..83d0f5f6b89 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ಫೋಲ್ಡರ್ ಸಂಪಾದಿಸಿ" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "ಮೂಲ ಡೊಮೇನ್", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ಉದಾಹರಣೆ.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "ಒಪ್ಪಿಸು" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "ಆವೃತ್ತಿ $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಪುನರುತ್ಪಾದಿಸಿ" - }, "length": { "message": "ಉದ್ದ" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "ವ್ಯವಸ್ಥಾಪಕ" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "ನಿಷ್‌ಕ್ರಿಯೆಗೊಳಿಸಿ" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಓದುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸು." }, - "twoFactorWebAuthnWarning": { - "message": "ಪ್ಲಾಟ್‌ಫಾರ್ಮ್ ಮಿತಿಗಳ ಕಾರಣ, ಎಲ್ಲಾ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ವೆಬ್‌ಆಥ್ನ್ ಅನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಇನ್ನೊಂದು ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಒದಗಿಸುವವರನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು ಇದರಿಂದ ವೆಬ್‌ಆಥ್ನ್ ಅನ್ನು ಬಳಸಲಾಗದಿದ್ದಾಗ ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಪ್ರವೇಶಿಸಬಹುದು. ಬೆಂಬಲಿತ ವೇದಿಕೆಗಳು:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "ವೆಬ್‌ಆಥ್ನ್ ಶಕ್ತಗೊಂಡ ಬ್ರೌಸರ್‌ನೊಂದಿಗೆ ಡೆಸ್ಕ್‌ಟಾಪ್ / ಲ್ಯಾಪ್‌ಟಾಪ್‌ನಲ್ಲಿ ವೆಬ್ ವಾಲ್ಟ್ ಮತ್ತು ಬ್ರೌಸರ್ ವಿಸ್ತರಣೆಗಳು (ಕ್ರೋಮ್, ಒಪೇರಾ, ವಿವಾಲ್ಡಿ, ಅಥವಾ ಎಫ್‌ಐಡಿಒ ಯು 2 ಎಫ್ ಸಕ್ರಿಯಗೊಳಿಸಿದ ಫೈರ್‌ಫಾಕ್ಸ್)." + "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." }, "twoFactorRecoveryYourCode": { "message": "ನಿಮ್ಮ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಮರುಪಡೆಯುವಿಕೆ ಕೋಡ್" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "ಪಾಸ್ವರ್ಡ್ ಜನರೇಟರ್ ಕಾನ್ಫಿಗರೇಶನ್ಗಾಗಿ ಕನಿಷ್ಠ ಅವಶ್ಯಕತೆಗಳನ್ನು ಹೊಂದಿಸಿ." }, - "passwordGeneratorPolicyInEffect": { - "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆ ನೀತಿಗಳು ನಿಮ್ಮ ಜನರೇಟರ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತವೆ." - }, "masterPasswordPolicyInEffect": { "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆ ನೀತಿಗಳಿಗೆ ಈ ಕೆಳಗಿನ ಅವಶ್ಯಕತೆಗಳನ್ನು ಪೂರೈಸಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index c7f80ff1cd1..7ff621bf3c1 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "폴더 편집" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "기본 도메인", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "예)", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "보내기" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "기기에 알림이 전송되었습니다." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "버전 $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "비밀번호 재생성" - }, "length": { "message": "길이" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "관리" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "비활성화" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "보안 키를 읽어오는데 문제가 발생했습니다. 다시 시도해보십시오." }, - "twoFactorWebAuthnWarning": { - "message": "플랫폼 제한으로 인해, 모든 Bitwarden 애플리케이션에서 WebAuthn을 사용할 수 없습니다. WebAuthn을 사용할 수 없을 때 계정에 접근할 수 있도록 다른 2단계 로그인 방법을 활성화하십시오. 지원하는 플랫폼:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn 지원 브라우저가 있는 데스크탑/랩탑의 웹 보관함 및 브라우저 확장 (WebAuthn이 활성화된 Chrome, Opera, Vivaldi 또는 Firefox 사용)" + "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." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden 2단계 로그인 복구 코드" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "비밀번호 생성기 설정에 최소 요구 사항을 설정해주세요." }, - "passwordGeneratorPolicyInEffect": { - "message": "하나 이상의 단체 정책이 생성기 설정에 영항을 미치고 있습니다." - }, "masterPasswordPolicyInEffect": { "message": "하나 이상의 단체 정책이 마스터 비밀번호가 다음 사항을 따르도록 요구합니다:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index c29227d3db1..d20d7639487 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Labot mapi" }, + "newFolder": { + "message": "Jauna mape" + }, + "folderName": { + "message": "Mapes nosaukums" + }, + "folderHintText": { + "message": "Apakšmapes var izveidot, ja pievieno iekļaujošās mapes nosaukumu, aiz kura ir \"/\". Piemēram: Tīklošanās/Forumi" + }, + "deleteFolderPermanently": { + "message": "Vai tiešām neatgriezeniski izdzēst šo mapi?" + }, "baseDomain": { "message": "Pamata domēns", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Vienuma nosaukums" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "piem.,", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Uzsākta pieteikšanās" }, + "logInRequestSent": { + "message": "Pieprasījums nosūtīts" + }, "submit": { "message": "Iesniegt" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Uz ierīci ir nosūtīts paziņojums." }, + "notificationSentDevicePart1": { + "message": "Bitwarden jāatslēdz savā ierīcē vai " + }, + "areYouTryingToAccessYourAccount": { + "message": "Vai mēģini piekļūt savam kontam?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ piekļuves mēģinājums", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Apstiprināt piekļuvi" + }, + "denyAccess": { + "message": "Noraidīt piekļuvi" + }, + "notificationSentDeviceAnchor": { + "message": "tīmekļa lietotnē" + }, + "notificationSentDevicePart2": { + "message": "Pirms apstiprināšanas jāpārliecinās, ka pirkstu nospieduma vārdkopa atbilst zemāk esošajai." + }, + "notificationSentDeviceComplete": { + "message": "Savā ierīcē jāatslēdz Bitwarden. Pirms apstiprināšanas jāpārliecinās, ka pirkstu nospieduma vārdkopa atbilst zemāk esošajai." + }, "aNotificationWasSentToYourDevice": { "message": "Uz ierīci tika nosūtīts paziņojums" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lūgums pārliecināties, ka konts ir atslēgts un atpazīšanas vārdkopa ir tāda pati arī otrā ierīcē" - }, "versionNumber": { "message": "Laidiens $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Izvairīties no viegli sajaucamām rakstzīmēm", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Pārizveidot paroli" - }, "length": { "message": "Garums" }, @@ -1849,7 +1879,7 @@ "message": "Tiks veikta atteikšanās no pašreizējās sesijas, un pēc tam būs nepieciešams atkārtoti pieteikties. Būs nepieciešama arī divpakāpju pieteikšanās, ja tā ir iespējota. Citās ierīcēs darbojošās sesijas var būt spēkā līdz vienai stundai." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Pieteikšanās jaunā ierīcē" }, "turnOffNewDeviceLoginProtection": { "message": "Turn off new device login protection" @@ -2170,8 +2200,20 @@ "manage": { "message": "Pārvaldīt" }, - "canManage": { - "message": "Var pārvaldīt" + "manageCollection": { + "message": "Pārvaldīt krājumu" + }, + "viewItems": { + "message": "Apskatīt vienumus" + }, + "viewItemsHidePass": { + "message": "Apskatīt vienumus, paslēptās paroles" + }, + "editItems": { + "message": "Labot vienumus" + }, + "editItemsHidePass": { + "message": "Labot vienumus, paslēptās paroles" }, "disable": { "message": "Atspējot" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Radās sarežģījumi, nolasot drošības atslēgu. Jāmēģina vēlreiz." }, - "twoFactorWebAuthnWarning": { - "message": "Platformas ierobežojumu dēļ WebAuth nevar izmantot visās Bitwarden lietotnēs. Ir ieteicams iespējot vēl kādu divpakāpju pieteikšanās nodrošinātāju, lai varētu piekļūt kontam, kad nav iespējams izmantot WebAuth. Atbalstītās platformas:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Tīmekļa glabātava un pārlūku paplašinājums galddatorā/klēpjdatorā ar WebAuthn iespējotu pārlūku (Chrome, Opera, Vivaldi vai Firefox ar iespējotu FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Platformas ierobežojumu dēļ WebAuth nevar izmantot visās Bitwarden lietotnēs. Ir ieteicams iespējot vēl kādu divpakāpju pieteikšanās nodrošinātāju, lai varētu piekļūt kontam, kad nav iespējams izmantot WebAuth." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden divpakāpju pieteikšanās atkopšanas kods" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Uzstādīt paroļu veidotāja uzstādījumu mazākās izpildāmās prasības." }, - "passwordGeneratorPolicyInEffect": { - "message": "Viens vai vairāki apvienības nosacījumi ietekmē veidotāja iestatījumus." - }, "masterPasswordPolicyInEffect": { "message": "Vienā vai vairākos apvienības nosacījumos ir norādīts, ka galvenajai parolei ir jāatbilst šādām prasībām:" }, @@ -6681,15 +6717,6 @@ "message": "Veidotājs", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Ko ir vēlme izveidot?" - }, - "passwordType": { - "message": "Paroles veids" - }, - "regenerateUsername": { - "message": "Pārizveidot lietotājvārdu" - }, "generateUsername": { "message": "Izveidot lietotājvārdu" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Lietotājvārda veids" - }, "plusAddressedEmail": { "message": "E-pasta adrese ar plusu", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Izmantot uzstādīto domēna visu tverošo iesūtni." }, "useThisEmail": { - "message": "Use this email" + "message": "Izmantot šo e-pasta adresi" }, "random": { "message": "Nejauši", @@ -6952,9 +6976,6 @@ "message": "Resursdatora nosaukums", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API piekļuves pilnvara" - }, "deviceVerification": { "message": "Ierīces apstiprināšana" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Nav krājuma" }, - "canView": { - "message": "Var skatīt" - }, - "canViewExceptPass": { - "message": "Var skatīt, izņemot paroles" - }, - "canEdit": { - "message": "Var labot" - }, - "canEditExceptPass": { - "message": "Var labot, izņemot paroles" - }, "noCollectionsAdded": { "message": "Nav pievienotu krājumu" }, @@ -8626,7 +8635,7 @@ "message": "Ļaut krājumu izdzēšanu tikai īpašniekiem un pārvaldītājiem" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ierobežot lietotājiem vienumu izdzēšanu ar atļauju \"Var pārvaldīt\"" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Īpašnieki un pārvaldnieki var pārvaldīt visus krājumus un vienumus" @@ -8677,9 +8686,6 @@ "message": "Pašmitināta servera URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aizstājdomēns" - }, "alreadyHaveAccount": { "message": "Jau ir konts?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nav piekļuves pārvaldīt šo krājumu." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Trūkst atļaujas \"Var pārvaldīt\"" + "grantManageCollectionWarningTitle": { + "message": "Trūkst krājumu pārvaldīšanas atļaujas" }, - "grantAddAccessCollectionWarning": { - "message": "Jānodrošina atļauja \"Var pārvaldīt\", lai ļautu pilnu krājuma pārvaldību, tajā skaitā krājuma izdzēšanu." + "grantManageCollectionWarning": { + "message": "Jānodrošina atļauja \"Pārvaldīt kŗajumu\", lai ļautu pilnu krājuma pārvaldību, tajā skaitā krājuma izdzēšanu." }, "grantCollectionAccess": { "message": "Piešķirt kopām vai dalībniekiem piekļuvi šim krājumam." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Apraksta kods" }, + "cannotRemoveViewOnlyCollections": { + "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Svarīgs paziņojums" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Pārvaldītājiem tagad ir iespēja izdzēst dalībnieku kontus, kas pieder pieteiktam domēnam." + }, + "deleteManagedUserWarningDesc": { + "message": "Šī darbība izdzēsīs dalībnieka kontu, tajā skaitā visus glabātavas vienumus. Tā aizstāj iepriekšējo darbību \"Noņemt\"." + }, + "deleteManagedUserWarning": { + "message": "\"Izdzēst\" ir jaunā darbība." + }, + "seatsRemaining": { + "message": "Ir atlikušas $REMAINING$ no apvienībai piesaistītajām $TOTAL$ vietām. Jāsazinās ar nodrošinātāju, lai pārvaldītu savu abonementu.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Esoša apvienība" + }, + "selectOrganizationProviderPortal": { + "message": "Jāatlasa apvienība, kuru pievienot savam nodrošinātāju portālam." + }, + "noOrganizations": { + "message": "Nav apvienību, ko uzskaitīt" + }, + "yourProviderSubscriptionCredit": { + "message": "Nodrošinātāja abonements saņemts kredītu par jebkuru atlikušo laiku apvienības abonementā." + }, + "doYouWantToAddThisOrg": { + "message": "Vai šo apvienību pievienot $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Pievienota esoša apvienība" + }, + "assignedExceedsAvailable": { + "message": "Piešķirtās vietas pārsniedz pieejamās vietas." } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 34ef4b72023..617f3b2d8ac 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "ഫോൾഡർ തിരുത്തുക" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "അടിസ്ഥാന ഡൊമെയ്ൻ", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ഉദാഹരണം.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "സമർപ്പിക്കുക" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "വേർഷൻ $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "പാസ്സ്‌വേഡ് വീണ്ടും സൃഷ്ടിക്കുക" - }, "length": { "message": "ദൈര്‍ഘ്യം" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "നിയന്ത്രിക്കുക" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "പ്രവര്‍ത്തന രഹിതമാക്കുക" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "പാസ്‌വേഡ് ജനറേറ്റർ കോൺഫിഗറേഷനായി മിനിമം ആവശ്യകതകൾ സജ്ജമാക്കുക." }, - "passwordGeneratorPolicyInEffect": { - "message": "ഒന്നോ അതിലധികമോ സംഘടന നയങ്ങൾ നിങ്ങളുടെ പാസ്സ്‌വേഡ് സൃഷ്ടാവിൻ്റെ ക്രമീകരണങ്ങളെ ബാധിക്കുന്നു." - }, "masterPasswordPolicyInEffect": { "message": "ഒന്നോ അതിലധികമോ ഓർഗനൈസേഷൻ നയങ്ങൾക്ക് ഇനിപ്പറയുന്ന ആവശ്യകതകൾ നിറവേറ്റുന്നതിന് നിങ്ങളുടെ മാസ്റ്റർ പാസ്‌വേഡ് ആവശ്യമാണ്:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 621f5de51a9..a804f5dfafb 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -96,7 +96,7 @@ "message": "Apps marked as critical" }, "application": { - "message": "Application" + "message": "Program" }, "atRiskPasswords": { "message": "At-risk passwords" @@ -208,22 +208,22 @@ "message": "Kortholderens navn" }, "loginCredentials": { - "message": "Login credentials" + "message": "Legitimasjoner for innlogging" }, "personalDetails": { - "message": "Personal details" + "message": "Personlige detaljer" }, "identification": { - "message": "Identification" + "message": "Identifikasjon" }, "contactInfo": { - "message": "Contact info" + "message": "Kontaktinfo" }, "cardDetails": { - "message": "Card details" + "message": "Kortdetaljer" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "$BRAND$-detaljer", "placeholders": { "brand": { "content": "$1", @@ -232,19 +232,19 @@ } }, "itemHistory": { - "message": "Item history" + "message": "Gjenstandshistorikk" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Autentiseringsnøkkel" }, "autofillOptions": { - "message": "Autofill options" + "message": "Autoutfyllings-innstillinger" }, "websiteUri": { - "message": "Website (URI)" + "message": "Nettsted (URİ)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Nettsted (URİ) $COUNT$", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -254,16 +254,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Nettsted lagt til" }, "addWebsite": { - "message": "Add website" + "message": "Legg til nettsted" }, "deleteWebsite": { - "message": "Delete website" + "message": "Slett nettsted" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Standard ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -384,7 +384,7 @@ "message": "Dr․" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Utløpt kort" }, "cardExpiredMessage": { "message": "If you've renewed it, update the card's information" @@ -408,7 +408,7 @@ "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "Lær mer om autentisering" }, "folder": { "message": "Mappe" @@ -432,17 +432,17 @@ "message": "Boolsk verdi" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Avkryssingsboks" }, "cfTypeLinked": { "message": "Tilknyttet", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Felttype" }, "fieldLabel": { - "message": "Field label" + "message": "Feltetikett" }, "remove": { "message": "Fjern" @@ -455,7 +455,7 @@ "description": "This is the folder for uncategorized items" }, "selfOwnershipLabel": { - "message": "You", + "message": "Du", "description": "Used as a label to indicate that the user is the owner of an item." }, "addFolder": { @@ -464,6 +464,18 @@ "editFolder": { "message": "Rediger mappen" }, + "newFolder": { + "message": "Ny mappe" + }, + "folderName": { + "message": "Mappenavn" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Grunndomene", "description": "Domain name. Example: website.com" @@ -508,7 +520,7 @@ "message": "Generer et passord" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Generér passordfrase" }, "checkPassword": { "message": "Sjekk om passordet har blitt utsatt." @@ -611,7 +623,7 @@ "message": "Sikkert notat" }, "typeSshKey": { - "message": "SSH key" + "message": "SSH-nøkkel" }, "typeLoginPlural": { "message": "Innlogginger" @@ -644,7 +656,7 @@ "message": "Fullt navn" }, "address": { - "message": "Address" + "message": "Adresse" }, "address1": { "message": "Adresse 1" @@ -689,7 +701,7 @@ "message": "Vis elementet" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "Ny $TYPE$", "placeholders": { "type": { "content": "$1", @@ -698,7 +710,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "Rediger $TYPE$", "placeholders": { "type": { "content": "$1", @@ -723,19 +735,10 @@ "message": "Element" }, "itemDetails": { - "message": "Item details" + "message": "Gjenstandens detaljer" }, "itemName": { - "message": "Item name" - }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } + "message": "Gjenstandens navn" }, "ex": { "message": "f.eks.", @@ -761,7 +764,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiering lyktes" }, "copyValue": { "message": "Kopier verdien", @@ -776,7 +779,7 @@ "description": "Copy passphrase to clipboard" }, "passwordCopied": { - "message": "Password copied" + "message": "Passordet er kopiert" }, "copyUsername": { "message": "Kopier brukernavnet", @@ -795,7 +798,7 @@ "description": "Copy URI to clipboard" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "Kopiér $FIELD$", "placeholders": { "field": { "content": "$1", @@ -804,34 +807,34 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "Kopiér nettsted" }, "copyNotes": { - "message": "Copy notes" + "message": "Kopiér notater" }, "copyAddress": { - "message": "Copy address" + "message": "Kopiér adresse" }, "copyPhone": { - "message": "Copy phone" + "message": "Kopiér telefonnummer" }, "copyEmail": { "message": "Copy email" }, "copyCompany": { - "message": "Copy company" + "message": "Kopiér firma" }, "copySSN": { - "message": "Copy Social Security number" + "message": "Kopiér fødselsnummer" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Kopiér passnummer" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Kopiér lisensnummer" }, "copyName": { - "message": "Copy name" + "message": "Kopiér navn" }, "me": { "message": "Meg" @@ -922,7 +925,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Gjenstandene ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -931,7 +934,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Gjenstanden ble flyttet til $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -991,22 +994,22 @@ "message": "Logget av" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Du har blitt logget ut av kontoen din." }, "loginExpired": { "message": "Din innloggingsøkt har utløpt." }, "restartRegistration": { - "message": "Restart registration" + "message": "Start registreringen på nytt" }, "expiredLink": { - "message": "Expired link" + "message": "Utløpt lenke" }, "pleaseRestartRegistrationOrTryLoggingIn": { "message": "Please restart registration or try logging in." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "Du har kanskje allerede en konto" }, "logOutConfirmation": { "message": "Er du sikker på at du vil logge av?" @@ -1033,7 +1036,7 @@ "message": "Logg på med enhet må settes opp i Bitwarden-innstillingene. Trenger du et annet alternativ?" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Trenger du et annet alternativ?" }, "loginWithMasterPassword": { "message": "Logg på med hovedpassord" @@ -1048,13 +1051,13 @@ "message": "Bruk en annen innloggingsmetode" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Logg inn med passnøkkel" }, "useSingleSignOn": { "message": "Use single sign-on" }, "welcomeBack": { - "message": "Welcome back" + "message": "Velkommen tilbake" }, "invalidPasskeyPleaseTryAgain": { "message": "Ugyldig Passkey. Vennligst prøv igjen." @@ -1138,10 +1141,10 @@ "message": "Opprett en konto" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Er du ny til Bitwarden?" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "Velg et sterkt passord" }, "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" @@ -1156,7 +1159,7 @@ "message": "Logg på" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Logg inn på Bitwarden" }, "authenticationTimeout": { "message": "Authentication timeout" @@ -1171,7 +1174,7 @@ "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Fortsett innloggingen" }, "whatIsADevice": { "message": "What is a device?" @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Pålogging startet" }, + "logInRequestSent": { + "message": "Forespørsel sendt" + }, "submit": { "message": "Send inn" }, @@ -1235,13 +1241,13 @@ "message": "Innstillinger" }, "accountEmail": { - "message": "Account email" + "message": "Kontoens E-postadresse" }, "requestHint": { - "message": "Request hint" + "message": "Be om et hint" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "Be om passordhint" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" @@ -1284,10 +1290,10 @@ "message": "Din nye konto har blitt opprettet! Du kan nå logge på." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "Den nye kontoen din er opprettet!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "Du har blitt logget inn!" }, "trialAccountCreated": { "message": "Kontoen ble opprettet." @@ -1305,10 +1311,10 @@ "message": "E-postadresse" }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Hvelvet ditt er låst" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Kontoen din er låst" }, "uuid": { "message": "UUID" @@ -1371,11 +1377,38 @@ "notificationSentDevice": { "message": "Et varsel har blitt sendt til enheten din." }, - "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "nett-app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, + "aNotificationWasSentToYourDevice": { + "message": "Et varsel ble sendt til enheten din" }, "versionNumber": { "message": "Versjon $VERSION_NUMBER$", @@ -1480,7 +1513,7 @@ "message": "E-post" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "Skriv inn koden du har fått tilsendt på E-post." }, "continue": { "message": "Fortsett" @@ -1661,17 +1694,14 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Unngå forvekslingsbare tegn", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerer passord" - }, "length": { "message": "Lengde" }, "passwordMinLength": { - "message": "Minimum password length" + "message": "Minimum passordlengde" }, "uppercase": { "message": "Store bokstaver (A-Z)", @@ -1709,10 +1739,10 @@ "message": "Passordhistorikk" }, "generatorHistory": { - "message": "Generator history" + "message": "Generatorhistorikk" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Tøm generatorhistorikk" }, "cleargGeneratorHistoryDescription": { "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" @@ -1721,13 +1751,13 @@ "message": "Det er ingen passord å liste opp." }, "clearHistory": { - "message": "Clear history" + "message": "Tøm historikk" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Ingenting å vise" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Du har ikke generert noe i det siste" }, "clear": { "message": "Tøm", @@ -1767,7 +1797,7 @@ "message": "Vennligst logg på igjen." }, "currentSession": { - "message": "Current session" + "message": "Gjeldende økt" }, "requestPending": { "message": "Request pending" @@ -1959,7 +1989,7 @@ "message": "Dataene har blitt vellykket importert inn i hvelvet ditt." }, "importSuccessNumberOfItems": { - "message": "A total of $AMOUNT$ items were imported.", + "message": "$AMOUNT$ gjenstander totalt ble importert.", "placeholders": { "amount": { "content": "$1", @@ -1989,16 +2019,16 @@ "message": "Feil under dekryptering av den eksporterte filen. Krypteringsnøkkelen samsvarte ikke med krypteringsnøkkelen som ble brukt eksport av data." }, "destination": { - "message": "Destination" + "message": "Destinasjon" }, "learnAboutImportOptions": { - "message": "Learn about your import options" + "message": "Lær mer om importalternativene dine" }, "selectImportFolder": { - "message": "Select a folder" + "message": "Velg en mappe" }, "selectImportCollection": { - "message": "Select a collection" + "message": "Velg en samling" }, "importTargetHint": { "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", @@ -2011,7 +2041,7 @@ } }, "importUnassignedItemsError": { - "message": "File contains unassigned items." + "message": "Filen inneholder utildelte elementer." }, "selectFormat": { "message": "Velg formatet til importfilen" @@ -2170,8 +2200,20 @@ "manage": { "message": "Behandle" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Deaktiver" @@ -2210,7 +2252,7 @@ "message": "You are leaving Bitwarden and launching an external website in a new window." }, "twoStepContinueToBitwardenUrlTitle": { - "message": "Continue to bitwarden.com?" + "message": "Vil du fortsette til bitwarden.com?" }, "twoStepContinueToBitwardenUrlDesc": { "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website." @@ -2225,7 +2267,7 @@ "message": "Nøkkel" }, "twoStepAuthenticatorEnterCodeV2": { - "message": "Verification code" + "message": "Verifiseringskode" }, "twoStepAuthenticatorReaddDesc": { "message": "Dersom du trenger å legge den til til en annen enhet, er QR-koden (eller -nøkkelen) som kreves av din autentiseringsapp nedenfor." @@ -2309,7 +2351,7 @@ "message": "Client Id" }, "twoFactorDuoClientSecret": { - "message": "Client Secret" + "message": "Klienthemmelighet" }, "twoFactorDuoApiHostname": { "message": "API-vertsnavn" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Det oppsto et problem med å lese sikkerhetsnøkkelen. Prøv igjen." }, - "twoFactorWebAuthnWarning": { - "message": "På grunn av plattformbegrensninger, kan ikke WebAuthn brukes på alle Bitwarden-apper. Du bør aktivere en annen 2-trinnsinnloggingsleverandør, slik at du kan få tilgang til kontoen din når WebAuthn ikke kan brukes. Støttede plattformer:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Netthvelv og nettleserutvidelser, på en datamaskin med en WebAuthn støttende nettleser (Chrome, Opera, Vivaldi, eller Firefox med FIDO U2F aktivert)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Din 2-trinnsinnloggingsgjenopprettingskode for Bitwarden" @@ -2953,7 +2992,7 @@ "message": "Ta kontakt med kundestøtte" }, "contactSupportShort": { - "message": "Contact Support" + "message": "Kontakt kundestøtte" }, "updatedPaymentMethod": { "message": "Oppdaterte betalingsmetoden." @@ -3420,7 +3459,7 @@ "message": "Netthvelv" }, "cli": { - "message": "CLI" + "message": "Ledetekst" }, "bitWebVault": { "message": "Bitwarden Web vault" @@ -3450,13 +3489,13 @@ "message": "Innloggingsforsøket mislyktes grunnet feil 2-trinnsinnlogging." }, "incorrectPassword": { - "message": "Incorrect password" + "message": "Feil passord" }, "incorrectCode": { - "message": "Incorrect code" + "message": "Feil kode" }, "incorrectPin": { - "message": "Incorrect PIN" + "message": "Feil PIN-kode" }, "pin": { "message": "PIN", @@ -3508,7 +3547,7 @@ } }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Vis alle påloggingsalternativer" }, "viewAllLoginOptions": { "message": "Vis alle påloggingsalternativer" @@ -3853,16 +3892,16 @@ "message": "First login" }, "trusted": { - "message": "Trusted" + "message": "Betrodd" }, "needsApproval": { "message": "Needs approval" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Prøver du å logge på?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "Påloggingsforsøk av $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3874,7 +3913,7 @@ "message": "Device Type" }, "ipAddress": { - "message": "IP Address" + "message": "IP-adresse" }, "confirmLogIn": { "message": "Confirm login" @@ -3905,7 +3944,7 @@ "message": "Login request has already expired." }, "justNow": { - "message": "Just now" + "message": "Akkurat nå" }, "requestedXMinutesAgo": { "message": "Requested $MINUTES$ minutes ago", @@ -3917,25 +3956,25 @@ } }, "creatingAccountOn": { - "message": "Creating account on" + "message": "Oppretter en konto på" }, "checkYourEmail": { - "message": "Check your email" + "message": "Sjekk E-postinnboksen din" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "Følg lenken i E-postadressen som ble sendt til" }, "andContinueCreatingYourAccount": { "message": "and continue creating your account." }, "noEmail": { - "message": "No email?" + "message": "Ingen E-post?" }, "goBack": { - "message": "Go back" + "message": "Gå tilbake" }, "toEditYourEmailAddress": { - "message": "to edit your email address." + "message": "for å redigere E-postadressen din." }, "view": { "message": "Vis" @@ -4019,7 +4058,7 @@ "message": "Din E-postadresse har blitt bekreftet." }, "emailVerifiedV2": { - "message": "Email verified" + "message": "E-post bekreftet" }, "emailVerifiedFailed": { "message": "Klarte ikke å bekrefte E-postadressen din. Prøv å sende en ny bekreftelses-E-post." @@ -4476,10 +4515,10 @@ "message": "Unsubscribe" }, "atAnyTime": { - "message": "at any time." + "message": "når som helst." }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "Ved å fortsette, samtykker du til" }, "and": { "message": "and" @@ -4503,7 +4542,7 @@ "message": "Pause for hvelvet" }, "vaultTimeout1": { - "message": "Timeout" + "message": "Tidsavbrudd" }, "vaultTimeoutDesc": { "message": "Velg når hvelvet ditt skal ta pause og utføre den valgte handlingen." @@ -4572,7 +4611,7 @@ "message": "Valgt" }, "recommended": { - "message": "Recommended" + "message": "Anbefalt" }, "ownership": { "message": "Eierskap" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Sett minimumskrav for konfigurasjon av passordgenerator." }, - "passwordGeneratorPolicyInEffect": { - "message": "En eller flere av organisasjonens vilkår påvirker generatorinnstillingene dine." - }, "masterPasswordPolicyInEffect": { "message": "En eller flere av organisasjonens vilkår krever hovedpassordet ditt for å oppfylle følgende krav:" }, @@ -4888,13 +4924,13 @@ "message": "Du kan nå lukke denne fanen og fortsette i utvidelsen." }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "Du har vellykket logget inn" }, "thisWindowWillCloseIn5Seconds": { "message": "This window will automatically close in 5 seconds" }, "youMayCloseThisWindow": { - "message": "You may close this window" + "message": "Du kan lukke dette vinduet" }, "includeAllTeamsFeatures": { "message": "Alle Lag funksjoner, plus:" @@ -5059,7 +5095,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copyLink": { - "message": "Copy link" + "message": "Kopier lenke" }, "copySendLink": { "message": "Kopier Send-lenke", @@ -5807,7 +5843,7 @@ "message": "Feil" }, "decryptionError": { - "message": "Decryption error" + "message": "Dekrypteringsfeil" }, "couldNotDecryptVaultItemsBelow": { "message": "Bitwarden could not decrypt the vault item(s) listed below." @@ -5817,7 +5853,7 @@ "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "for å unngå ytterligere datatap.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -6484,7 +6520,7 @@ "message": "Rotasjon av faktureringssynkroniserings-token vil gjøre den forrige token ugyldig." }, "selfHostedServer": { - "message": "self-hosted" + "message": "selvbetjent" }, "customEnvironment": { "message": "Custom environment" @@ -6681,23 +6717,14 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Hva vil du generere?" - }, - "passwordType": { - "message": "Passordtype" - }, - "regenerateUsername": { - "message": "Regenerer Brukernavn" - }, "generateUsername": { "message": "Generer brukernavn" }, "generateEmail": { - "message": "Generate email" + "message": "Generér E-post" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Verdien må være mellom $MIN$ og $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -6711,7 +6738,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Bruk minst $RECOMMENDED$ tegn for å generere et sterkt passord.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Brukernavntype" - }, "plusAddressedEmail": { "message": "Pluss-adressert e-post", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Bruk domenets konfigurerte catch-all innboks." }, "useThisEmail": { - "message": "Use this email" + "message": "Bruk denne E-postadressen" }, "random": { "message": "Vilkårlig", @@ -6757,23 +6781,23 @@ "message": "Vilkårlig ord" }, "usernameGenerator": { - "message": "Username generator" + "message": "Brukernavngenerator" }, "useThisPassword": { - "message": "Use this password" + "message": "Bruk dette passordet" }, "useThisUsername": { - "message": "Use this username" + "message": "Bruk dette brukernavnet" }, "securePasswordGenerated": { "message": "Secure password generated! Don't forget to also update your password on the website." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Bruk denne generatoren", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "for å lage et sterkt og unikt passord", "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'" }, "service": { @@ -6839,11 +6863,11 @@ "message": "Generer et e-postalias med en ekstern videresendingstjeneste." }, "forwarderDomainName": { - "message": "Email domain", + "message": "E-postdomene", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Velg et domene som støttes av den valgte tjenesten", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -6861,11 +6885,11 @@ } }, "forwarderGeneratedBy": { - "message": "Generated by Bitwarden.", + "message": "Generert av Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "message": "Nettsted: $WEBSITE$. Generert av Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -6875,7 +6899,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Ugyldig $SERVICENAME$-API-sjetong", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -6885,7 +6909,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Ugyldig $SERVICENAME$-API-sjetong: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -6909,7 +6933,7 @@ } }, "forwarderNoDomain": { - "message": "Invalid $SERVICENAME$ domain.", + "message": "Ugyldig $SERVICENAME$-domene.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -6929,7 +6953,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Ukjent $SERVICENAME$-feil oppstod.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -6952,9 +6976,6 @@ "message": "Vertsnavn", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API tilgangstoken" - }, "deviceVerification": { "message": "Enhetsverifisering" }, @@ -7071,7 +7092,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "Inndataverdien må være minst $MIN$.", "placeholders": { "min": { "content": "$1", @@ -7080,7 +7101,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "Inndataverdien kan ikke være mer enn $MAX$.", "placeholders": { "max": { "content": "$1", @@ -7110,10 +7131,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 felt trenger din oppmerksomhet." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ felter trenger din oppmerksomhet.", "placeholders": { "count": { "content": "$1", @@ -7131,7 +7152,7 @@ "message": "Duo two-step login is required for your account." }, "launchDuo": { - "message": "Launch Duo" + "message": "Start Duo" }, "turnOn": { "message": "Slå på" @@ -7140,7 +7161,7 @@ "message": "På" }, "off": { - "message": "Off" + "message": "Av" }, "members": { "message": "Medlemmer" @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Ingen samling" }, - "canView": { - "message": "Kan vise" - }, - "canViewExceptPass": { - "message": "Kan vise, bortsett fra passord" - }, - "canEdit": { - "message": "Kan redigere" - }, - "canEditExceptPass": { - "message": "Kan redigere, bortsett fra passord" - }, "noCollectionsAdded": { "message": "Ingen samlinger lagt til" }, @@ -7826,37 +7835,37 @@ "message": "Verification required for this action. Set a PIN to continue." }, "setPin": { - "message": "Set PIN" + "message": "Velg PIN" }, "verifyWithBiometrics": { - "message": "Verify with biometrics" + "message": "Bekreft med biometri" }, "awaitingConfirmation": { - "message": "Awaiting confirmation" + "message": "Avventer bekreftelse" }, "couldNotCompleteBiometrics": { - "message": "Could not complete biometrics." + "message": "Kunne ikke fullføre biometri." }, "needADifferentMethod": { - "message": "Need a different method?" + "message": "Trenger du en annen metode?" }, "useMasterPassword": { - "message": "Use master password" + "message": "Bruk hovedpassord" }, "usePin": { - "message": "Use PIN" + "message": "Bruk PIN-kode" }, "useBiometrics": { - "message": "Use biometrics" + "message": "Bruk biometri" }, "enterVerificationCodeSentToEmail": { - "message": "Enter the verification code that was sent to your email." + "message": "Skriv inn bekreftelseskoden som ble sendt til e-postadressen din." }, "resendCode": { - "message": "Resend code" + "message": "Send koden på nytt" }, "memberColumnHeader": { - "message": "Member" + "message": "Medlem" }, "groupSlashMemberColumnHeader": { "message": "Group/Member" @@ -7970,7 +7979,7 @@ "message": "Filopplasting" }, "upload": { - "message": "Upload" + "message": "Last opp" }, "acceptedFormats": { "message": "Aksepterte formater:" @@ -7982,13 +7991,13 @@ "message": "eller" }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Lås opp med biometri" }, "unlockWithPin": { - "message": "Unlock with PIN" + "message": "Lås opp med PIN-kode" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "Lås opp med hovedpassord" }, "licenseAndBillingManagement": { "message": "Håndtering av lisens og fakturering" @@ -8084,10 +8093,10 @@ "message": "This user can access Secrets Manager" }, "important": { - "message": "Important:" + "message": "Viktig:" }, "viewAll": { - "message": "View all" + "message": "Vis alle" }, "showingPortionOfTotal": { "message": "Showing $PORTION$ of $TOTAL$", @@ -8103,10 +8112,10 @@ } }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Resolve the errors below and try again." + "message": "Fiks feilene nedenfor og prøv igjen." }, "description": { - "message": "Description" + "message": "Beskrivelse" }, "errorReadingImportFile": { "message": "An error occurred when trying to read the import file" @@ -8125,7 +8134,7 @@ "description": "Software Development Kit" }, "createAnAccount": { - "message": "Create an account" + "message": "Opprett en konto" }, "createSecret": { "message": "Create a secret" @@ -8147,7 +8156,7 @@ "message": "Import secrets" }, "getStarted": { - "message": "Get started" + "message": "Kom i gang" }, "complete": { "message": "$COMPLETED$/$TOTAL$ Complete", @@ -8266,7 +8275,7 @@ "message": "Update KDF settings" }, "loginInitiated": { - "message": "Login initiated" + "message": "Innlogging igangsatt" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" @@ -8275,25 +8284,25 @@ "message": "Device approval required. Select an approval option below:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Enhetsgodkjennelse kreves" }, "selectAnApprovalOptionBelow": { "message": "Select an approval option below" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Husk denne enheten" }, "uncheckIfPublicDevice": { "message": "Uncheck if using a public device" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Godkjenn fra en av dine andre enheter" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Be om administratorgodkjennelse" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Godkjenn med hovedpassord" }, "trustedDeviceEncryption": { "message": "Trusted device encryption" @@ -8338,7 +8347,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "out of $TOTAL$", + "message": "av $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -8356,7 +8365,7 @@ } }, "verificationRequired": { - "message": "Verification required", + "message": "Verifisering kreves", "description": "Default title for the user verification dialog." }, "recoverAccount": { @@ -8393,7 +8402,7 @@ "message": "Device info" }, "time": { - "message": "Time" + "message": "Tid" }, "denyAllRequests": { "message": "Deny all requests" @@ -8492,7 +8501,7 @@ } }, "next": { - "message": "Next" + "message": "Neste" }, "ssoLoginIsRequired": { "message": "SSO login is required" @@ -8507,16 +8516,16 @@ "message": "Admin approval requested" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Forespørselen din har blitt sendt til administratoren din." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "Du vil bli varslet når det er godkjent." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "Har du problemer med å logge inn?" }, "loginApproved": { - "message": "Login approved" + "message": "Innlogging godkjent" }, "userEmailMissing": { "message": "User email missing" @@ -8525,18 +8534,18 @@ "message": "Active user email not found. Logging you out." }, "deviceTrusted": { - "message": "Device trusted" + "message": "Enheten er betrodd" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "message": "Ingen aktive Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", + "message": "Bruk Send til å dele kryptert informasjon med noen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inviteUsers": { - "message": "Invite Users" + "message": "Inviter brukere" }, "secretsManagerForPlan": { "message": "Secrets Manager for $PLAN$", @@ -8659,7 +8668,7 @@ "message": "Max potential service account cost" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "Innlogget!" }, "beta": { "message": "Beta" @@ -8671,32 +8680,29 @@ "message": "Edited collections" }, "baseUrl": { - "message": "Server URL" + "message": "Tjener-URL" }, "selfHostBaseUrl": { "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { - "message": "Already have an account?" + "message": "Har du allerede en konto?" }, "toggleSideNavigation": { "message": "Toggle side navigation" }, "skipToContent": { - "message": "Skip to content" + "message": "Hopp frem til innholdet" }, "managePermissionRequired": { "message": "At least one member or group must have can manage permission." }, "typePasskey": { - "message": "Passkey" + "message": "Passnøkkel" }, "passkeyNotCopied": { - "message": "Passkey will not be copied" + "message": "Passkoden vil ikke bli kopiert" }, "passkeyNotCopiedAlert": { "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" @@ -8711,7 +8717,7 @@ } }, "seeDetailedInstructions": { - "message": "See detailed instructions on our help site at", + "message": "Se detaljerte instruksjoner på hjelpesidene våre på", "description": "This is followed a by a hyperlink to the help website." }, "installBrowserExtension": { @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -8760,7 +8766,7 @@ "message": "Service account access updated" }, "commonImportFormats": { - "message": "Common formats", + "message": "Vanlige formater", "description": "Label indicating the most common import formats" }, "maintainYourSubscription": { @@ -8837,7 +8843,7 @@ "message": "Provider Portal" }, "success": { - "message": "Success" + "message": "Suksess" }, "restrictedGroupAccess": { "message": "You cannot add yourself to groups." @@ -8846,10 +8852,10 @@ "message": "You cannot add yourself to collections." }, "assign": { - "message": "Assign" + "message": "Knytt" }, "assignToCollections": { - "message": "Assign to collections" + "message": "Legg til i samlinger" }, "assignToTheseCollections": { "message": "Assign to these collections" @@ -8861,7 +8867,7 @@ "message": "Only organization members with access to these collections will be able to see the items." }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Velg samlinger å tilordne" }, "noCollectionsAssigned": { "message": "No collections have been assigned" @@ -8883,25 +8889,25 @@ } }, "addField": { - "message": "Add field" + "message": "Legg til felt" }, "editField": { - "message": "Edit field" + "message": "Rediger felt" }, "items": { - "message": "Items" + "message": "Gjenstander" }, "assignedSeats": { "message": "Assigned seats" }, "assigned": { - "message": "Assigned" + "message": "Tildelt" }, "used": { - "message": "Used" + "message": "Brukt" }, "remaining": { - "message": "Remaining" + "message": "Gjenstår" }, "unlinkOrganization": { "message": "Unlink organization" @@ -8929,11 +8935,11 @@ "description": "A subscription status label." }, "pastDue": { - "message": "Past due", + "message": "Forbi måldatoen", "description": "A subscription status label" }, "subscriptionExpired": { - "message": "Subscription expired", + "message": "Abonnement har utløpt", "description": "The date header used when a subscription is past due." }, "pastDueWarningForChargeAutomatically": { @@ -9189,7 +9195,7 @@ "description": "The title for the section that deals with integrations and SDKs." }, "integrations": { - "message": "Integrations" + "message": "Integreringer" }, "integrationsDesc": { "message": "Automatically sync secrets from Bitwarden Secrets Manager to a third-party service." @@ -9201,7 +9207,7 @@ "message": "Use Bitwarden Secrets Manager SDK in the following programming languages to build your own applications." }, "ssoDescStart": { - "message": "Configure", + "message": "Sett opp", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "ssoDescEnd": { @@ -9215,7 +9221,7 @@ "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configure ", + "message": "Sett opp ", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { @@ -9355,7 +9361,7 @@ "message": "Enter your Enterprise organization information" }, "viewItemsIn": { - "message": "View items in $NAME$", + "message": "Vis gjenstander i $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -9365,7 +9371,7 @@ } }, "backTo": { - "message": "Back to $NAME$", + "message": "Tilbake til $NAME$", "description": "Navigate back to a previous folder or collection", "placeholders": { "name": { @@ -9375,11 +9381,11 @@ } }, "back": { - "message": "Back", + "message": "Tilbake", "description": "Button text to navigate back" }, "removeItem": { - "message": "Remove $NAME$", + "message": "Fjern $NAME$", "description": "Remove a selected option, such as a folder or collection", "placeholders": { "name": { @@ -9473,7 +9479,7 @@ "message": "Unverified" }, "verified": { - "message": "Verified" + "message": "Verifisert" }, "viewSecret": { "message": "View secret" @@ -9492,7 +9498,7 @@ "message": "Quickly view member access across the organization by upgrading to an Enterprise plan." }, "date": { - "message": "Date" + "message": "Dato" }, "exportClientReport": { "message": "Export client report" @@ -9519,13 +9525,13 @@ "message": "On" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "Av" }, "memberAccessReportAuthenticationEnabledTrue": { "message": "On" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "Av" }, "higherKDFIterations": { "message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker." @@ -9570,7 +9576,7 @@ "message": "This action will remove your access to this secret." }, "invoice": { - "message": "Invoice" + "message": "Faktura" }, "unassignedSeatsAvailable": { "message": "You have $SEATS$ unassigned seats available.", @@ -9597,7 +9603,7 @@ "message": "Client details" }, "downloadCSV": { - "message": "Download CSV" + "message": "Last ned CSV" }, "monthlySubscriptionUserSeatsMessage": { "message": "Adjustments to your subscription will result in prorated charges to your billing totals on your next billing period. " @@ -9631,7 +9637,7 @@ "message": "Add to folder" }, "selectFolder": { - "message": "Select folder" + "message": "Velg mappe" }, "personalItemTransferWarningSingular": { "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." @@ -9683,13 +9689,13 @@ "message": "Project IDs" }, "projectId": { - "message": "Project ID" + "message": "Prosjekt-ID" }, "projectsAccessedByMachineAccount": { "message": "The following projects can be accessed by this machine account." }, "config": { - "message": "Config" + "message": "Oppsett" }, "learnMoreAboutEmergencyAccess": { "message": "Learn more about emergency access" @@ -9830,22 +9836,22 @@ "message": "Key algorithm" }, "sshPrivateKey": { - "message": "Private key" + "message": "Privat nøkkel" }, "sshPublicKey": { - "message": "Public key" + "message": "Offentlig nøkkel" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Fingeravtrykk" }, "sshKeyFingerprint": { - "message": "Fingerprint" + "message": "Fingeravtrykk" }, "sshKeyPrivateKey": { - "message": "Private key" + "message": "Privat nøkkel" }, "sshKeyPublicKey": { - "message": "Public key" + "message": "Offentlig nøkkel" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -9881,7 +9887,7 @@ "message": "Passwordless SSO" }, "accountRecovery": { - "message": "Account recovery" + "message": "Kontogjenoppretting" }, "customRoles": { "message": "Custom roles" @@ -9899,13 +9905,13 @@ "message": "Up to 20 machine accounts" }, "current": { - "message": "Current" + "message": "Nåværende" }, "secretsManagerSubscriptionInfo": { "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { - "message": "Bitwarden Password Manager" + "message": "Bitwarden passordbehandler" }, "secretsManagerComplimentaryPasswordManager": { "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." @@ -9914,20 +9920,20 @@ "message": "File saved to device. Manage from your device downloads." }, "publicApi": { - "message": "Public API", + "message": "Offentlig API", "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "Vis tegntelleren" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Skjul tegntelleren" }, "editAccess": { "message": "Edit access" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Bruk tekstfelter for data som sikkerhetsspørsmål" }, "hiddenHelpText": { "message": "Use hidden fields for sensitive data like a password" @@ -9942,15 +9948,15 @@ "message": "Enter the the field's html id, name, aria-label, or placeholder." }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Inkluder store bokstaver", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { - "message": "A-Z", + "message": "A-Å", "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "Inkluder små bokstaver", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -9958,7 +9964,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "Inkluder tall", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -9966,7 +9972,7 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "Inkluder spesialtegn", "description": "Full description for the password generator special characters checkbox" }, "specialCharactersLabel": { @@ -9974,10 +9980,10 @@ "description": "Label for the password generator special characters checkbox" }, "addAttachment": { - "message": "Add attachment" + "message": "Legg til vedlegg" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "Maksimal filstørrelse er 500 MB" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" @@ -10091,11 +10097,20 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { - "message": "Important notice" + "message": "Viktig melding" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Sett opp 2-trinnspålogging" }, "newDeviceVerificationNoticeContentPage1": { "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." @@ -10104,7 +10119,7 @@ "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." }, "remindMeLater": { - "message": "Remind me later" + "message": "Minn meg på det senere" }, "newDeviceVerificationNoticePageOneFormContent": { "message": "Do you have reliable access to your email, $EMAIL$?", @@ -10122,16 +10137,16 @@ "message": "Yes, I can reliably access my email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Slå på 2-trinnsinnlogging" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Endre kontoens E-postadresse" }, "removeMembers": { "message": "Remove members" }, "devices": { - "message": "Devices" + "message": "Enheter" }, "deviceListDescription": { "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 60c19be21fc..20ceae6f33b 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index fa40759c62a..09374b1cb02 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Map bewerken" }, + "newFolder": { + "message": "Nieuwe map" + }, + "folderName": { + "message": "Mapnaam" + }, + "folderHintText": { + "message": "Je kunt een map onderbrengen door het toevoegen van de naam van de bovenliggende map gevolgd door een \"/\". Voorbeeld: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Weet je zeker dat je deze map definitief wilt verwijderen?" + }, "baseDomain": { "message": "Basisdomein", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Itemnaam" }, - "cannotRemoveViewOnlyCollections": { - "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "bijv.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Inloggen gestart" }, + "logInRequestSent": { + "message": "Verzoek verzonden" + }, "submit": { "message": "Versturen" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Er is een bericht naar je apparaat verstuurd." }, + "notificationSentDevicePart1": { + "message": "Ontgrendel Bitwarden op je apparaat of op de " + }, + "areYouTryingToAccessYourAccount": { + "message": "Probeer je toegang te krijgen tot je account?" + }, + "accessAttemptBy": { + "message": "Inlogpoging door $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Toegang bevestigen" + }, + "denyAccess": { + "message": "Toegang weigeren" + }, + "notificationSentDeviceAnchor": { + "message": "web-app" + }, + "notificationSentDevicePart2": { + "message": "Zorg ervoor dat de Vingerafdrukzin overeenkomt met de onderstaande voor je deze goedkeurt." + }, + "notificationSentDeviceComplete": { + "message": "Ontgrendel Bitwarden op je apparaat. Zorg ervoor dat de vingerafdruk-zin overeenkomt met de onderstaande zin voordat je deze goedkeurt." + }, "aNotificationWasSentToYourDevice": { "message": "Er is een melding naar je apparaat verzonden" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Zorg ervoor dat je kluis is ontgrendeld en de vingerafdrukzin hetzelfde is op het andere apparaat" - }, "versionNumber": { "message": "Versie $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Dubbelzinnige tekens vermijden", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Opnieuw genereren" - }, "length": { "message": "Lengte" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Beheren" }, - "canManage": { - "message": "Kan beheren" + "manageCollection": { + "message": "Collectie beheren" + }, + "viewItems": { + "message": "Items bekijken" + }, + "viewItemsHidePass": { + "message": "Items bekijken, verborgen wachtwoorden" + }, + "editItems": { + "message": "Items bewerken" + }, + "editItemsHidePass": { + "message": "Items bewerken, verborgen wachtwoorden" }, "disable": { "message": "Uitschakelen" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Er was een probleem met het lezen van de beveiligingssleutel. Probeer het nogmaals." }, - "twoFactorWebAuthnWarning": { - "message": "Vanwege platformbeperkingen kan WebAuthn niet in alle Bitwarden applicaties gebruikt worden. Stel een andere tweestapsaanmeldingsaanbieder in zodat je je account kunt benaderen wanneer WebAuthn niet beschikbaar is. De volgende platformen worden ondersteund:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webkluis en browser-extensies op een desktop/laptop met een browser met ondersteuning voor WebAuthn (Chrome, Opera, Vivaldi of Firefox met FIDO U2F ingeschakeld)." + "twoFactorWebAuthnWarning1": { + "message": "Vanwege platformbeperkingen kan WebAuthn niet in alle Bitwarden-applicaties gebruikt worden. Stel een andere tweestapsaanmeldingsaanbieder in zodat je je account kunt benaderen wanneer WebAuthn niet beschikbaar is." }, "twoFactorRecoveryYourCode": { "message": "Je herstelcode voor Bitwarden-tweestapsaanmelding" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Stel minimale vereisten in voor de configuratie van het wachtwoord generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "Een of meer organisatiebeleidseisen heeft invloed op de instellingen van je generator." - }, "masterPasswordPolicyInEffect": { "message": "Een of meer organisatiebeleidseisen stelt de volgende eisen aan je hoofdwachtwoord:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Wat wil je genereren?" - }, - "passwordType": { - "message": "Type wachtwoord" - }, - "regenerateUsername": { - "message": "Gebruikersnaam opnieuw genereren" - }, "generateUsername": { "message": "Gebruikersnaam genereren" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Type gebruikersnaam" - }, "plusAddressedEmail": { "message": "E-mailadres-met-plus", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostnaam", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-toegangstoken" - }, "deviceVerification": { "message": "Apparaatverificatie" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Geen collectie" }, - "canView": { - "message": "Kan bekijken" - }, - "canViewExceptPass": { - "message": "Kan bekijken, behalve wachtwoorden" - }, - "canEdit": { - "message": "Kan bewerken" - }, - "canEditExceptPass": { - "message": "Kan bewerken, behalve wachtwoorden" - }, "noCollectionsAdded": { "message": "Geen collecties toegevoegd" }, @@ -8677,9 +8686,6 @@ "message": "URL zelfgehoste server", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aliasdomein" - }, "alreadyHaveAccount": { "message": "Heb je al een account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Je hebt geen toegang om deze collectie te beheren." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Ontbrekende Kan beheren machtigingen" + "grantManageCollectionWarningTitle": { + "message": "Recht voor het beheren van machtigingen ontbreekt" }, - "grantAddAccessCollectionWarning": { - "message": "Kan beheren machtigingen verlenen voor volledig verzamelingsbeheer, inclusief het verwijderen van verzamelingen." + "grantManageCollectionWarning": { + "message": "Beheren van machtigingen toekennen voor het toestaan van het volledig verzamelingenbeheer, inclusief het verwijderen van een verzameling." }, "grantCollectionAccess": { "message": "Groepen of mensen toegang tot deze collectie geven." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Code bankafschrift" }, + "cannotRemoveViewOnlyCollections": { + "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Belangrijke mededeling" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Beheerders hebben nu de mogelijkheid om leden van een geclaimd domein te verwijderen." + }, + "deleteManagedUserWarningDesc": { + "message": "Deze actie verwijdert het account van het lid, inclusief alle items in hun kluis. Dit vervangt de vorige verwijderactie." + }, + "deleteManagedUserWarning": { + "message": "Verwijderen is een nieuwe actie!" + }, + "seatsRemaining": { + "message": "Je hebt nog $REMAINING$ plaatsen van de $TOTAL$ plaatsen die aan deze organisatie zijn toegewezen. Neem contact op met je provider om je abonnement te beheren.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Bestaande toevoegen" + }, + "selectOrganizationProviderPortal": { + "message": "Kies een organisatie om aan je providerportaal toe te voegen." + }, + "noOrganizations": { + "message": "Er zijn geen organisaties om weer te geven" + }, + "yourProviderSubscriptionCredit": { + "message": "Je providerabonnement zal een credit ontvangen voor de resterende tijd van het abonnement van de organisatie." + }, + "doYouWantToAddThisOrg": { + "message": "Wilt je deze organisatie toevoegen aan $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Bestaande organisatie toegevoegd" + }, + "assignedExceedsAvailable": { + "message": "Meer toegewezen dan beschikbare plaatsen." } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 10547f94847..8b7682fa39c 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Rediger mappe" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Grunndomene", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "t.d.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Slå av" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index a299723f594..6935f334d62 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -3,22 +3,22 @@ "message": "Wszystkie aplikacje" }, "criticalApplications": { - "message": "Critical applications" + "message": "Krytyczne aplikacje" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "Dostęp do informacji" }, "riskInsights": { - "message": "Risk Insights" + "message": "Spostrzeżenia dotyczące ryzyka" }, "passwordRisk": { - "message": "Password Risk" + "message": "Ryzyko związne z hasłem" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Przejrzyj hasła zagrożone (słabe, ujawnione lub ponownie używane) we wszystkich aplikacjach. Wybierz swoje najbardziej krytyczne aplikacje, aby nadać priorytet działaniom bezpieczeństwa swoim użytkownikom, aby zająć się hasłami zagrożonymi." }, "dataLastUpdated": { - "message": "Data last updated: $DATE$", + "message": "Data ostatniej aktualizacji: $DATE$", "placeholders": { "date": { "content": "$1", @@ -30,16 +30,16 @@ "message": "Powiadomieni członkowie" }, "revokeMembers": { - "message": "Revoke members" + "message": "Unieważnij członk" }, "restoreMembers": { - "message": "Restore members" + "message": "Przywróć członków" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "Nie można przywrócić dostępu organizacji" }, "allApplicationsWithCount": { - "message": "All applications ($COUNT$)", + "message": "Wszystkie aplikacje ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -48,10 +48,10 @@ } }, "createNewLoginItem": { - "message": "Create new login item" + "message": "Utwórz nowy element logowania" }, "criticalApplicationsWithCount": { - "message": "Critical applications ($COUNT$)", + "message": "Aplikacje krytyczne ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -60,7 +60,7 @@ } }, "notifiedMembersWithCount": { - "message": "Notified members ($COUNT$)", + "message": "Powiadomieni członkowie ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -69,7 +69,7 @@ } }, "noAppsInOrgTitle": { - "message": "No applications found in $ORG NAME$", + "message": "Nie znaleziono aplikacji w $ORG NAME$", "placeholders": { "org name": { "content": "$1", @@ -78,43 +78,43 @@ } }, "noAppsInOrgDescription": { - "message": "As users save logins, applications appear here, showing any at-risk passwords. Mark critical apps and notify users to update passwords." + "message": "Jako użytkownicy zapisują logowania, pojawiają się tutaj aplikacje, pokazujące wszelkie hasła zagrożone. Zaznacz kluczowe aplikacje i powiadamiaj użytkowników o potrzebie aktualizacji haseł." }, "noCriticalAppsTitle": { - "message": "You haven't marked any applications as a Critical" + "message": "Nie oznaczyłeś żadnych aplikacji jako krytycznych" }, "noCriticalAppsDescription": { - "message": "Select your most critical applications to discover at-risk passwords, and notify users to change those passwords." + "message": "Wybierz najbardziej krytyczne aplikacje, aby odkryć hasła zagrożone i poinformuj użytkowników, by zmienili te hasła." }, "markCriticalApps": { - "message": "Mark critical apps" + "message": "Oznacz krytyczne aplikacje" }, "markAppAsCritical": { - "message": "Mark app as critical" + "message": "Oznacz aplikację jako krytyczną" }, "appsMarkedAsCritical": { - "message": "Apps marked as critical" + "message": "Aplikacje oznaczone jako krytyczne" }, "application": { "message": "Aplikacja" }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Zagrożone hasła" }, "requestPasswordChange": { - "message": "Request password change" + "message": "Poproś o zmianę hasła" }, "totalPasswords": { - "message": "Total passwords" + "message": "Wszystkie hasła" }, "searchApps": { - "message": "Search applications" + "message": "Wyszukaj aplikacje" }, "atRiskMembers": { - "message": "At-risk members" + "message": "Zagrożeni użytkownicy" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Zagrożeni członkowie ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -123,7 +123,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "Zagrożone aplikacje ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -132,13 +132,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "Ci członkowie logują się do aplikacji ze słabymi, ujawnionymi lub ponownie używanymi hasłami." }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "Te aplikacje mają słabe, ujawnione lub ponownie użyte hasła." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "Ci użytkownicy logują się do $APPNAME$ ze słabymi, ujawnionymi lub ponownie używanymi hasłami.", "placeholders": { "appname": { "content": "$1", @@ -147,19 +147,19 @@ } }, "totalMembers": { - "message": "Total members" + "message": "Wszyscy członkowie" }, "atRiskApplications": { - "message": "At-risk applications" + "message": "Zagrożone aplikacje" }, "totalApplications": { - "message": "Total applications" + "message": "Wszystkie aplikacje" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Odznacz jako krytyczną aplikację" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Krytyczna aplikacja została pomyślnie odznaczona" }, "whatTypeOfItem": { "message": "Jakiego rodzaju jest to element?" @@ -464,6 +464,18 @@ "editFolder": { "message": "Edytuj folder" }, + "newFolder": { + "message": "Nowy folder" + }, + "folderName": { + "message": "Nazwa folderu" + }, + "folderHintText": { + "message": "Zagnieżdżaj foldery dodając nazwę folderu nadrzędnego, a następnie “/”. Przykład: Społeczne/Fora" + }, + "deleteFolderPermanently": { + "message": "Czy na pewno chcesz trwale usunąć ten folder?" + }, "baseDomain": { "message": "Domena podstawowa", "description": "Domain name. Example: website.com" @@ -508,7 +520,7 @@ "message": "Wygeneruj hasło" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Wygeneruj hasło wyrazowe" }, "checkPassword": { "message": "Sprawdź, czy hasło zostało ujawnione." @@ -611,7 +623,7 @@ "message": "Bezpieczna notatka" }, "typeSshKey": { - "message": "SSH key" + "message": "Klucz SSH" }, "typeLoginPlural": { "message": "Dane logowania" @@ -707,7 +719,7 @@ } }, "viewItemType": { - "message": "Zobacz $TYPE$", + "message": "Zobacz $ITEMTYPE$", "placeholders": { "itemtype": { "content": "$1", @@ -728,15 +740,6 @@ "itemName": { "message": "Nazwa elementu" }, - "cannotRemoveViewOnlyCollections": { - "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "np.", "description": "Short abbreviation for 'example'." @@ -772,11 +775,11 @@ "description": "Copy password to clipboard" }, "copyPassphrase": { - "message": "Copy passphrase", + "message": "Skopiuj hasło wyrazowe", "description": "Copy passphrase to clipboard" }, "passwordCopied": { - "message": "Password copied" + "message": "Hasło zostało skopiowane" }, "copyUsername": { "message": "Kopiuj nazwę użytkownika", @@ -1033,7 +1036,7 @@ "message": "Logowanie za pomocą urządzenia musi być włączone w ustawieniach aplikacji Bitwarden. Potrzebujesz innej opcji?" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Potrzebujesz innego sposobu?" }, "loginWithMasterPassword": { "message": "Logowanie hasłem głównym" @@ -1048,13 +1051,13 @@ "message": "Użyj innej metody logowania" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Logowanie się za pomocą Passkey" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "Użyj jednokrotnego logowania" }, "welcomeBack": { - "message": "Welcome back" + "message": "Witaj ponownie" }, "invalidPasskeyPleaseTryAgain": { "message": "Błędny passkey. Spróbuj ponownie." @@ -1138,7 +1141,7 @@ "message": "Utwórz konto" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Nowy na Bitwarden?" }, "setAStrongPassword": { "message": "Ustaw silne hasło" @@ -1156,32 +1159,35 @@ "message": "Zaloguj się" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Zaloguj do Bitwarden" }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "Limit czasu uwierzytelniania" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "Upłynął limit czasu uwierzytelniania. Uruchom ponownie proces logowania." }, "verifyIdentity": { "message": "Zweryfikuj swoją tożsamość" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Kontynuuj logowanie" }, "whatIsADevice": { - "message": "What is a device?" + "message": "Czym jest urządzenie?" }, "aDeviceIs": { - "message": "A device is a unique installation of the Bitwarden app where you have logged in. Reinstalling, clearing app data, or clearing your cookies could result in a device appearing multiple times." + "message": "Urządzenie to unikalna instalacja aplikacji Bitwarden, w której się zalogowano. Ponowna instalacja, wyczyszczenie danych aplikacji lub usunięcie plików cookie może spowodować, że urządzenie pojawi się wielokrotnie." }, "logInInitiated": { "message": "Logowanie rozpoczęte" }, + "logInRequestSent": { + "message": "Żądanie wysłane" + }, "submit": { "message": "Wyślij" }, @@ -1305,10 +1311,10 @@ "message": "Adres e-mail" }, "yourVaultIsLockedV2": { - "message": "Twój sejf jest zablokowany." + "message": "Twój sejf jest zablokowany" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Twoje konto jest zablokowane" }, "uuid": { "message": "UUID" @@ -1345,7 +1351,7 @@ "message": "Nie masz uprawnień do przeglądania wszystkich elementów w tej kolekcji." }, "youDoNotHavePermissions": { - "message": "You do not have permissions to this collection" + "message": "Nie masz uprawnień do tej kolekcji" }, "noCollectionsInList": { "message": "Brak kolekcji do wyświetlenia." @@ -1371,11 +1377,38 @@ "notificationSentDevice": { "message": "Powiadomienie zostało wysłane na urządzenie." }, - "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "notificationSentDevicePart1": { + "message": "Odblokuj Bitwarden na swoim urządzeniu lub w" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + "areYouTryingToAccessYourAccount": { + "message": "Czy próbujesz uzyskać dostęp do swojego konta?" + }, + "accessAttemptBy": { + "message": "Próba dostępu przez $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potwierdź dostęp" + }, + "denyAccess": { + "message": "Odmów dostępu" + }, + "notificationSentDeviceAnchor": { + "message": "aplikacji internetowej" + }, + "notificationSentDevicePart2": { + "message": "Upewnij się, że fraza odcisku palca zgadza się z tą poniżej, zanim zatwierdzisz." + }, + "notificationSentDeviceComplete": { + "message": "Odblokuj Bitwarden na swoim urządzeniu. Przed zatwierdzeniem upewnij się, że fraza odcisku palca pasuje do tej poniżej." + }, + "aNotificationWasSentToYourDevice": { + "message": "Powiadomienie zostało wysłane na twoje urządzenie" }, "versionNumber": { "message": "Wersja $VERSION_NUMBER$", @@ -1468,7 +1501,7 @@ "message": "Klucz bezpieczeństwa FIDO U2F" }, "webAuthnTitle": { - "message": "FIDO2 WebAuthn" + "message": "Klucz dostępu" }, "webAuthnDesc": { "message": "Użyj dowolnego klucza bezpieczeństwa WebAuthn, aby uzyskać dostęp do swojego konta." @@ -1661,12 +1694,9 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Unikaj niejednoznacznych znaków", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Wygeneruj ponownie hasło" - }, "length": { "message": "Długość" }, @@ -1709,25 +1739,25 @@ "message": "Historia hasła" }, "generatorHistory": { - "message": "Generator history" + "message": "Historia generatora" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Wyczyść historię generatora" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "Jeśli zatwierdzisz, wszystkie wygenerowane hasła zostaną usunięte z historii generatora. Czy chcesz kontynuować mimo to?" }, "noPasswordsInList": { "message": "Brak haseł." }, "clearHistory": { - "message": "Clear history" + "message": "Wyczyść historię" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Brak zawartości do pokazania" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Nic nie zostało wygenerowane przez ciebie w ostatnim czasie" }, "clear": { "message": "Wyczyść", @@ -1767,10 +1797,10 @@ "message": "Zaloguj się ponownie." }, "currentSession": { - "message": "Current session" + "message": "Aktualna sesja" }, "requestPending": { - "message": "Request pending" + "message": "Zapytanie oczekuje" }, "logBackInOthersToo": { "message": "Zaloguj się ponownie. Jeśli używasz innych aplikacji Bitwarden, wyloguj się i zaloguj ponownie również w nich." @@ -1849,31 +1879,31 @@ "message": "Ta czynność spowoduje wylogowanie z bieżącej sesji, przez co konieczne będzie ponowne zalogowanie się. Zostaniesz również poproszony o ponowne logowanie dwustopniowe, jeśli masz włączoną tę opcję. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Logowanie nowego urządzenia" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Wyłącz ochronę logowania na nowym urządzeniu" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Włącz ochronę logowania na nowym urządzeniu" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Przejdź poniżej, aby wyłączyć e-maile weryfikacyjne wysyłane przez Bitwarden podczas logowania z nowego urządzenia." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Przejdź poniżej, aby Bitwarden wysyłał Ci e-maile weryfikacyjne podczas logowania z nowego urządzenia." }, "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": "Po wyłączeniu ochrony logowania na nowym urządzeniu, każdy, kto zna Twoje hasło główne, może uzyskać dostęp do Twojego konta z dowolnego urządzenia. Aby chronić swoje konto bez e-maili weryfikacyjnych, skonfiguruj dwuetapowe logowanie." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Zapisano nowe zmiany ochrony logowania" }, "sessionsDeauthorized": { "message": "Wszystkie sesje zostały zakończone" }, "accountIsOwnedMessage": { - "message": "This account is owned by $ORGANIZATIONNAME$", + "message": "To konto jest własnością $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -1938,7 +1968,7 @@ "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLoginLink": { - "message": "new login", + "message": "Nowe dane logowania", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsPartTwoNoOrgs": { @@ -2170,8 +2200,20 @@ "manage": { "message": "Zarządzaj" }, - "canManage": { - "message": "Może zarządzać" + "manageCollection": { + "message": "Zarządzaj kolekcją" + }, + "viewItems": { + "message": "Zobacz elementy" + }, + "viewItemsHidePass": { + "message": "Zobacz elementy, ukryte hasła" + }, + "editItems": { + "message": "Edytuj elementy" + }, + "editItemsHidePass": { + "message": "Edytuj elementy, ukryte hasła" }, "disable": { "message": "Wyłącz" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Wystąpił problem z odczytem klucza bezpieczeństwa. Spróbuj ponownie." }, - "twoFactorWebAuthnWarning": { - "message": "Z powodu ograniczeń platformy, klucze WebAuthn nie mogą być używane we wszystkich aplikacjach Bitwarden. Musisz włączyć inną metodę logowania dwustopniowego, aby zachować dostęp do konta w pozostałych sytuacjach. Wspierane platformy:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Sejf internetowy i rozszerzenia przeglądarki na komputerze/laptopie z przeglądarką obsługującą WebAuthn (Chrome, Opera, Vivaldi lub Firefox z włączoną obsługą FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Z powodu ograniczeń platformy, klucze WebAuthn nie mogą być używane we wszystkich aplikacjach Bitwarden. Musisz włączyć inną metodę logowania dwustopniowego, aby zachować dostęp do konta w pozostałych sytuacjach." }, "twoFactorRecoveryYourCode": { "message": "Kod odzyskiwania konta Bitwarden" @@ -2477,7 +2516,7 @@ "message": "Sprawdź ujawnione hasła" }, "timesExposed": { - "message": "Times exposed" + "message": "Ujawniono" }, "exposedXTimes": { "message": "Ujawnione $COUNT$ raz(y)", @@ -2514,7 +2553,7 @@ "message": "Brak elementów zawierających słabe hasła." }, "weakness": { - "message": "Weakness" + "message": "Słabe" }, "reusedPasswordsReport": { "message": "Identyczne hasła" @@ -2542,7 +2581,7 @@ "message": "Nie znaleźliśmy identycznych haseł w sejfie." }, "timesReused": { - "message": "Times reused" + "message": "Ponownie użyto" }, "reusedXTimes": { "message": "Wykorzystane $COUNT$ razy", @@ -2842,7 +2881,7 @@ "message": "Pobierz licencję" }, "viewBillingToken": { - "message": "View Billing Token" + "message": "Pokaż token płatności" }, "updateLicense": { "message": "Zaktualizuj licencję" @@ -2891,10 +2930,10 @@ "message": "Faktury" }, "noUnpaidInvoices": { - "message": "No unpaid invoices." + "message": "Brak nieopłaconych faktur." }, "noPaidInvoices": { - "message": "No paid invoices." + "message": "Brak opłaconych faktur." }, "paid": { "message": "Zapłacono", @@ -3339,10 +3378,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "Pozostało Ci 1 zaproszenie." }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "Pozostało Ci 0 zaproszeń." }, "userUsingTwoStep": { "message": "Ten użytkownik korzysta z logowania dwustopniowego, aby chronić swoje konto." @@ -3378,7 +3417,7 @@ "message": "Użytkownik" }, "userDesc": { - "message": "Standardowy użytkownik, posiadający dostęp do kolekcji w Twojej organizacji." + "message": "Standardowy użytkownik, posiadający dostęp do kolekcji w Twojej organizacji" }, "all": { "message": "Wszyscy" @@ -3508,7 +3547,7 @@ } }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Zobacz wszystkie sposoby logowania" }, "viewAllLoginOptions": { "message": "Zobacz wszystkie sposoby logowania" @@ -3796,7 +3835,7 @@ } }, "unlinkedSso": { - "message": "Unlinked SSO." + "message": "Odłączone SSO" }, "unlinkedSsoUser": { "message": "Odłącz logowanie jednokrotne SSO dla użytkownika %$ID$.", @@ -3847,22 +3886,22 @@ "message": "Urządzenie" }, "loginStatus": { - "message": "Login status" + "message": "Status zalogowania" }, "firstLogin": { - "message": "First login" + "message": "Pierwsze logowanie" }, "trusted": { - "message": "Trusted" + "message": "Zaufane" }, "needsApproval": { - "message": "Needs approval" + "message": "Wymaga zatwierdzenia" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "Próbujesz się zalogować?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "Próba logowania przez $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3871,22 +3910,22 @@ } }, "deviceType": { - "message": "Device Type" + "message": "Typ urządenia" }, "ipAddress": { - "message": "IP Address" + "message": "Adres IP" }, "confirmLogIn": { - "message": "Confirm login" + "message": "Potwierdź logowanie" }, "denyLogIn": { - "message": "Deny login" + "message": "Odrzuć logowanie" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "To żądanie jest już nieważne." }, "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", + "message": "Logowanie potwierdzone dla $EMAIL$ na $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -3899,16 +3938,16 @@ } }, "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "Odrzucono próby logowania z innego urządzenia. Jeśli to naprawdę Ty, spróbuj ponownie zalogować się za pomocą urządzenia." }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "Prośba logowania wygasła." }, "justNow": { - "message": "Just now" + "message": "Teraz" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Poproszono $MINUTES$ minut temu", "placeholders": { "minutes": { "content": "$1", @@ -4034,13 +4073,13 @@ "message": "Aktualizuj przeglądarkę" }, "generatingRiskInsights": { - "message": "Generating your risk insights..." + "message": "Generowanie informacji o ryzyku..." }, "updateBrowserDesc": { "message": "Używasz nieobsługiwanej przeglądarki. Sejf internetowy może działać niewłaściwie." }, "freeTrialEndPromptCount": { - "message": "Your free trial ends in $COUNT$ days.", + "message": "Twój okres próbny kończy się za $COUNT$ dni.", "placeholders": { "count": { "content": "$1", @@ -4049,7 +4088,7 @@ } }, "freeTrialEndPromptMultipleDays": { - "message": "$ORGANIZATION$, your free trial ends in $COUNT$ days.", + "message": "$ORGANIZATION$, twoja darmowa wersja próbna kończy się za $COUNT$ dni.", "placeholders": { "count": { "content": "$2", @@ -4062,7 +4101,7 @@ } }, "freeTrialEndPromptTomorrow": { - "message": "$ORGANIZATION$, your free trial ends tomorrow.", + "message": "$ORGANIZATION$, twoja darmowa wersja próbna kończy się jutro", "placeholders": { "organization": { "content": "$1", @@ -4071,10 +4110,10 @@ } }, "freeTrialEndPromptTomorrowNoOrgName": { - "message": "Your free trial ends tomorrow." + "message": "Twój okres próbny kończy się jutro." }, "freeTrialEndPromptToday": { - "message": "$ORGANIZATION$, your free trial ends today.", + "message": "$ORGANIZATION$, twoja darmowa wersja próbna kończy się dzisiaj", "placeholders": { "organization": { "content": "$1", @@ -4083,10 +4122,10 @@ } }, "freeTrialEndingTodayWithoutOrgName": { - "message": "Your free trial ends today." + "message": "Twój okres próbny kończy się dzisiaj." }, "clickHereToAddPaymentMethod": { - "message": "Click here to add a payment method." + "message": "Kliknij tutaj, aby dodać metodę płatności." }, "joinOrganization": { "message": "Dołącz do organizacji" @@ -4643,7 +4682,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "Zostaniesz powiadomiony po zatwierdzeniu prośby" }, "free": { "message": "Darmowy", @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Ustaw minimalne wymagania dla generatora hasła." }, - "passwordGeneratorPolicyInEffect": { - "message": "Co najmniej jedna zasada organizacji wpływa na ustawienia generatora." - }, "masterPasswordPolicyInEffect": { "message": "Co najmniej jedna zasada organizacji wymaga, aby hasło główne spełniało następujące wymagania:" }, @@ -4876,10 +4912,10 @@ "message": "Zaloguj się za pomocą logowania jednokrotnego SSO swojej organizacji. Aby rozpocząć, wpisz swój identyfikator organizacji." }, "singleSignOnEnterOrgIdentifier": { - "message": "Enter your organization's SSO identifier to begin" + "message": "Wprowadź identyfikator SSO swojej organizacji, aby rozpocząć" }, "singleSignOnEnterOrgIdentifierText": { - "message": "To log in with your SSO provider, enter your organization's SSO identifier to begin. You may need to enter this SSO identifier when you log in from a new device." + "message": "Aby zalogować się za pomocą dostawcy SSO, wprowadź identyfikator SSO organizacji, aby rozpocząć. Może być konieczne wprowadzenie identyfikatora SSO podczas logowania z nowego urządzenia." }, "enterpriseSingleSignOn": { "message": "Logowanie jednokrotne" @@ -4949,7 +4985,7 @@ "message": "Zablokuj użytkownikom możliwość dołączania do innych organizacji." }, "singleOrgPolicyDesc": { - "message": "Restrict members from joining other organizations. This policy is required for organizations that have enabled domain verification." + "message": "Ogranicz członków do dołączania do innych organizacji. Ta polityka jest wymagana dla organizacji, które włączyły weryfikację domeny." }, "singleOrgBlockCreateMessage": { "message": "Twoja obecna organizacja posiada zasady, które nie pozwalają na dołączanie do więcej niż jednej organizacji. Skontaktuj się z administratorami swojej organizacji lub zarejestruj się z innego konta Bitwarden." @@ -4958,7 +4994,7 @@ "message": "Członkowie organizacji, którzy nie są właścicielami lub administratorami i są już członkami innej organizacji zostaną usunięci z Twojej organizacji." }, "singleOrgPolicyMemberWarning": { - "message": "Non-compliant members will be placed in revoked status until they leave all other organizations. Administrators are exempt and can restore members once compliance is met." + "message": "Niezgodni członkowie zostaną objęci cofniętym statusem do czasu opuszczenia przez nich wszystkich innych organizacji. Administratorzy są zwolnieni i mogą przywrócić członków po osiągnięciu zgodności." }, "requireSso": { "message": "Uwierzytelnianie logowaniem jednokrotnym" @@ -5338,7 +5374,7 @@ "message": "Niestandardowe" }, "customDesc": { - "message": "Umożliwia zaawansowaną kontrolę uprawnień użytkownika." + "message": "Umożliwia zaawansowaną kontrolę uprawnień użytkownika" }, "customDescNonEnterpriseStart": { "message": "Role niestandardowe to ", @@ -5684,7 +5720,7 @@ "message": "Hasło zostało zresetowane!" }, "resetPasswordEnrollmentWarning": { - "message": "Rejestracja zezwala administratorom organizacji na zmianę Twojego hasła głównego. Czy na pewno chcesz się zarejestrować?" + "message": "Rejestracja zezwala administratorom organizacji na zmianę Twojego hasła głównego" }, "accountRecoveryPolicy": { "message": "Administracja odzyskiwaniem konta" @@ -5783,13 +5819,13 @@ "message": "Przywrócono dostęp do organizacji" }, "bulkFilteredMessage": { - "message": "Wykluczono, nie dotyczy tej akcji." + "message": "Wykluczono, nie dotyczy tej akcji" }, "nonCompliantMembersTitle": { - "message": "Non-compliant members" + "message": "Niezgodni członkowie" }, "nonCompliantMembersError": { - "message": "Members that are non-compliant with the Single organization or Two-step login policy cannot be restored until they adhere to the policy requirements" + "message": "Niezgodni członkowie z jedną organizacją lub dwustopniową regułą logowania nie mogą zostać przywróceni, dopóki nie będą przestrzegali wymogów polityki" }, "fingerprint": { "message": "Unikalny identyfikator konta" @@ -5807,17 +5843,17 @@ "message": "Błąd" }, "decryptionError": { - "message": "Decryption error" + "message": "Błąd odszyfrowywania" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden nie mógł odszyfrować elementów sejfu wymienionych poniżej." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Skontaktuj się z działem obsługi klienta,", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "aby uniknąć dalszej utraty danych.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -5836,7 +5872,7 @@ "message": "Nazwa dostawcy" }, "providerSetup": { - "message": "Dostawca został skonfigurowany." + "message": "Dostawca został skonfigurowany" }, "clients": { "message": "Klienci" @@ -6391,11 +6427,11 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Połącz logowanie za pomocą SSO z Twoim serwerem kluczy odszyfrowania. Używając tej opcji, członkowie nie będą musieli używać swoich haseł głównych, aby odszyfrować dane sejfu.", + "message": "Połącz logowanie za pomocą SSO z Twoim serwerem kluczy odszyfrowania. Używając tej opcji, członkowie nie będą musieli używać swoich haseł głównych, aby odszyfrować dane sejfu", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "Wymaga uwierzytelniania SSO i polityki jednej organizacji", + "message": "wymaga uwierzytelniania SSO i polityki jednej organizacji", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { @@ -6457,7 +6493,7 @@ "message": "Pokaż token synchronizacji płatności" }, "generateBillingToken": { - "message": "Generate billing token" + "message": "Wygeneruj token płatności" }, "copyPasteBillingSync": { "message": "Skopiuj i wklej ten token do ustawień synchronizacji rozliczeniowej swojej organizacji." @@ -6466,7 +6502,7 @@ "message": "Twój token synchronizacji płatności może edytować ustawienia subskrypcji tej organizacji." }, "manageBillingTokenSync": { - "message": "Manage Billing Token" + "message": "Zarządzaj tokenami płatności" }, "setUpBillingSync": { "message": "Skonfiguruj synchronizację płatności" @@ -6532,7 +6568,7 @@ "message": "Token synchronizacji płatności" }, "automaticBillingSyncDesc": { - "message": "Automatic sync unlocks Families sponsorships and allows you to sync your license without uploading a file. After making updates in the Bitwarden cloud server, select Sync License to apply changes." + "message": "Automatyczna synchronizacja odblokowuje sponsorowanie rodzin i pozwala na synchronizację licencji bez przesyłania pliku. Po aktualizacjach w chmurze Bitwarden, wybierz licencję synchronizacji aby zastosować zmiany." }, "active": { "message": "Aktywny" @@ -6602,7 +6638,7 @@ "message": "Wymagane, jeśli identyfikatorem podmiotu nie jest adres URL." }, "offerNoLongerValid": { - "message": "This offer is no longer valid. Contact your organization administrators for more information." + "message": "Ta oferta nie jest już ważna. Aby uzyskać więcej informacji, skontaktuj się z administratorami organizacji." }, "openIdOptionalCustomizations": { "message": "Opcjonalne dostosowania" @@ -6681,23 +6717,14 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Co chcesz wygenerować?" - }, - "passwordType": { - "message": "Rodzaj hasła" - }, - "regenerateUsername": { - "message": "Wygeneruj ponownie nazwę użytkownika" - }, "generateUsername": { "message": "Wygeneruj nazwę użytkownika" }, "generateEmail": { - "message": "Generate email" + "message": "Wygeneruj e-mail" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Wartość musi być pomiędzy $MIN$ a $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -6711,7 +6738,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Użyj $RECOMMENDED$ znaków lub więcej, aby wygenerować silne hasło.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -6721,7 +6748,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " Użyj $RECOMMENDED$ słów lub więcej, aby wygenerować silne hasło.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Rodzaj nazwy użytkownika" - }, "plusAddressedEmail": { "message": "Adres e-mail z plusem", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Użyj skonfigurowanej skrzynki catch-all w swojej domenie." }, "useThisEmail": { - "message": "Use this email" + "message": "Użyj tego adresu e-mail" }, "random": { "message": "Losowa", @@ -6839,11 +6863,11 @@ "message": "Wygeneruj alias adresu e-mail z zewnętrznej usługi przekierowania." }, "forwarderDomainName": { - "message": "Email domain", + "message": "Domena e-mail", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Wybierz domenę, która jest obsługiwana przez wybraną usługę", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -6952,9 +6976,6 @@ "message": "Nazwa hosta", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token dostępu API" - }, "deviceVerification": { "message": "Weryfikacja urządzenia" }, @@ -6988,7 +7009,7 @@ "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimIntegrationDescription": { - "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning. Find supported integrations", + "message": "Automatycznie dostarczaj użytkownikom i grupom preferowanego dostawcy tożsamości za pomocą usługi SCIM. Znajdź obsługiwane integracje", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Brak kolekcji" }, - "canView": { - "message": "Może wyświetlać" - }, - "canViewExceptPass": { - "message": "Może wyświetlać z wyjątkiem haseł" - }, - "canEdit": { - "message": "Można edytować" - }, - "canEditExceptPass": { - "message": "Może edytować z wyjątkiem haseł" - }, "noCollectionsAdded": { "message": "Nie dodano kolekcji" }, @@ -8000,7 +8009,7 @@ "message": "Przesyłanie ręczne" }, "manualBillingTokenUploadDesc": { - "message": "If you do not want to opt into billing sync, manually upload your license here. This will not automatically unlock Families sponsorships." + "message": "Jeśli nie chcesz zrezygnować z synchronizacji rozliczeniowej, ręcznie prześlij swoją licencję tutaj. Nie odblokuje to automatycznie sponsorowania dla rodziny." }, "syncLicense": { "message": "Synchronizuj licencję" @@ -8269,16 +8278,16 @@ "message": "Logowanie rozpoczęte" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "Zapamiętaj to urządzenie, aby przyszłe logowania były bezproblemowe" }, "deviceApprovalRequired": { "message": "Wymagane zatwierdzenie urządzenia. Wybierz opcję zatwierdzenia poniżej:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Wymagane zatwierdzenie urządzenia" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "Wybierz opcję zatwierdzenia poniżej" }, "rememberThisDevice": { "message": "Zapamiętaj to urządzenie" @@ -8302,31 +8311,31 @@ "message": "Zaufane urządzenia" }, "memberDecryptionOptionTdeDescPart1": { - "message": "Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The", + "message": "Członkowie nie będą potrzebowali hasła głównego podczas logowania się za pomocą SSO. Hasło główne jest zastąpione kluczem szyfrowania przechowywanym na urządzeniu, co sprawia, że urządzenie jest zaufane. Pierwsze urządzenie, do którego użytkownik tworzy swoje konto i logi, będą zaufane. Nowe urządzenia będą musiały zostać zatwierdzone przez istniejące zaufane urządzenie lub przez administratora.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "pojedyncza organizacja", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "policy,", + "message": "polityka,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "SSO required", + "message": "Wymagane SSO", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "policy, and", + "message": "polityka i ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { - "message": "account recovery administration", + "message": "Administracja odzyskiwaniem konta", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "policy will turn on when this option is used.", + "message": "polityka włączy się, gdy ta opcja zostanie wykorzystana.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { @@ -8405,16 +8414,16 @@ "message": "Zatwierdź prośbę" }, "deviceApproved": { - "message": "Device approved" + "message": "Urządzenie zostało zatwierdzone" }, "deviceRemoved": { - "message": "Device removed" + "message": "Urządzenie zostało usunięte" }, "removeDevice": { - "message": "Remove device" + "message": "Usuń urządzenie" }, "removeDeviceConfirmation": { - "message": "Are you sure you want to remove this device?" + "message": "Czy na pewno chcesz usunąć to urządzenie?" }, "noDeviceRequests": { "message": "Brak urządzeń do zatwierdzenia" @@ -8471,7 +8480,7 @@ "message": "Poproszono o zatwierdzenie urządzenia." }, "tdeOffboardingPasswordSet": { - "message": "User set a master password during TDE offboarding." + "message": "Użytkownik ustawił hasło główne podczas wyłączania TDE." }, "startYour7DayFreeTrialOfBitwardenFor": { "message": "Rozpocznij 7-dniowy darmowy okres próbny Bitwarden dla $ORG$", @@ -8522,7 +8531,7 @@ "message": "Brak adresu e-mail użytkownika" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "Nie znaleziono aktywnego adresu e-mail. Trwa wylogowanie." }, "deviceTrusted": { "message": "Zaufano urządzeniu" @@ -8620,13 +8629,13 @@ "message": "Zarządzaj zachowaniami kolekcji w organizacji" }, "limitCollectionCreationDesc": { - "message": "Limit collection creation to owners and admins" + "message": "Ogranicz tworzenie kolekcji do właścicieli i administratorów" }, "limitCollectionDeletionDesc": { - "message": "Limit collection deletion to owners and admins" + "message": "Ogranicz usuwanie kolekcji do właścicieli i administratorów" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ogranicz usuwanie elementów do członków z uprawnieniami do zarządzania" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Właściciele i administratorzy mogą zarządzać wszystkimi zbiorami i elementami" @@ -8674,12 +8683,9 @@ "message": "Adres URL serwera" }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "URL samodzielnie hostowanego serwera", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Domena aliasu" - }, "alreadyHaveAccount": { "message": "Masz już konto?" }, @@ -8741,10 +8747,10 @@ "readOnlyCollectionAccess": { "message": "Nie masz dostępu do zarządzania tą kolekcją." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Brak uprawnienia Zarządzaj Uprawnieniami" + "grantManageCollectionWarningTitle": { + "message": "Brak uprawnień do zarządzania kolekcją" }, - "grantAddAccessCollectionWarning": { + "grantManageCollectionWarning": { "message": "Przyznaj uprawnienie Zarządzaj Uprawnieniami w celu umożliwienia pełnego zarządzania kolekcją, w tym usuwania kolekcji." }, "grantCollectionAccess": { @@ -9201,47 +9207,47 @@ "message": "Użyj SDK Menedżera Sekretów Bitwarden w następujących językach programowania, aby zbudować własne aplikacje." }, "ssoDescStart": { - "message": "Configure", + "message": "Konfiguruj", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "ssoDescEnd": { - "message": "for Bitwarden using the implementation guide for your Identity Provider.", + "message": "dla Bitwarden przy użyciu instrukcji implementacyjnych dla Twojego dostawcy tożsamości.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "userProvisioning": { - "message": "User provisioning" + "message": "Aprowizacja użytkowników" }, "scimIntegration": { "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configure ", + "message": "Konfiguruj", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { - "message": "(System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider.", + "message": "(System do zarządzania tożsamością międzydomeną) w celu automatycznej aprowizacji użytkowników i grup do Bitwarden przy użyciu instrukcji implementacji dla Twojego dostawcy tożsamości.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "bwdc": { "message": "Bitwarden Directory Connector" }, "bwdcDesc": { - "message": "Configure Bitwarden Directory Connector to automatically provision users and groups using the implementation guide for your Identity Provider." + "message": "Skonfiguruj Bitwarden Directory Connector do automatycznej aprowizacji użytkowników i grup za pomocą przewodnika implementacyjnego dla dostawcy tożsamości." }, "eventManagement": { - "message": "Event management" + "message": "Zarządzanie zdarzeniami" }, "eventManagementDesc": { - "message": "Integrate Bitwarden event logs with your SIEM (system information and event management) system by using the implementation guide for your platform." + "message": "Zintegruj dzienniki zdarzeń Bitwarden ze swoim systemem SIEM (Security Information and Event Management), korzystając z poradnika implementacyjnego dla Twojej platformy." }, "deviceManagement": { - "message": "Device management" + "message": "Zarządzanie urządzeniem" }, "deviceManagementDesc": { - "message": "Configure device management for Bitwarden using the implementation guide for your platform." + "message": "Skonfiguruj zarządzanie urządzeniem Bitwarden za pomocą instrukcji implementacyjnych dla Twojej platformy." }, "integrationCardTooltip": { - "message": "Launch $INTEGRATION$ implementation guide.", + "message": "Uruchom przewodnik implementacyjny $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -9250,7 +9256,7 @@ } }, "smIntegrationTooltip": { - "message": "Set up $INTEGRATION$.", + "message": "Skonfiguruj $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -9259,7 +9265,7 @@ } }, "smSdkTooltip": { - "message": "View $SDK$ repository", + "message": "Zobacz repozytorium $SDK$", "placeholders": { "sdk": { "content": "$1", @@ -9268,7 +9274,7 @@ } }, "integrationCardAriaLabel": { - "message": "open $INTEGRATION$ implementation guide in a new tab.", + "message": "otwórz przewodnik implementacji $INTEGRATION$ w nowej karcie.", "placeholders": { "integration": { "content": "$1", @@ -9277,7 +9283,7 @@ } }, "smSdkAriaLabel": { - "message": "view $SDK$ repository in a new tab.", + "message": "wyświetl repozytorium $SDK$ w nowej karcie.", "placeholders": { "sdk": { "content": "$1", @@ -9286,7 +9292,7 @@ } }, "smIntegrationCardAriaLabel": { - "message": "set up $INTEGRATION$ implementation guide in a new tab.", + "message": "ustaw przewodnik implementacji $INTEGRATION$ w nowej karcie.", "placeholders": { "integration": { "content": "$1", @@ -9307,7 +9313,7 @@ "message": "miesięcznie za członka" }, "monthPerMemberBilledAnnually": { - "message": "month per member billed annually" + "message": "miesięcznie na członka, rozliczanie rocznie" }, "seats": { "message": "Miejsca" @@ -9346,13 +9352,13 @@ "message": "Kontynuuj konfigurację darmowego okresu próbnego Menedżera Sekretnych Bitwarden" }, "enterTeamsOrgInfo": { - "message": "Enter your Teams organization information" + "message": "Wprowadź informacje o organizacji Teams" }, "enterFamiliesOrgInfo": { "message": "Wprowadź informacje o swojej organizacji rodzinnej" }, "enterEnterpriseOrgInfo": { - "message": "Enter your Enterprise organization information" + "message": "Wprowadź informacje o organizacji Enterprise" }, "viewItemsIn": { "message": "Zobacz elementy w $NAME$", @@ -9407,10 +9413,10 @@ "message": "Dostawca usług zarządzanych" }, "managedServiceProvider": { - "message": "Managed service provider" + "message": "Zarządzany dostawca usług" }, "multiOrganizationEnterprise": { - "message": "Multi-organization enterprise" + "message": "Przedsiębiorstwo wielu organizacji" }, "orgSeats": { "message": "Miejsca w organizacji" @@ -9458,16 +9464,16 @@ "message": "Zaktualizowane informacje podatkowe" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Nieprawidłowy numer identyfikacji podatkowej, jeśli uważasz, że jest to błąd, skontaktuj się z pomocą techniczną." }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "Nie mogliśmy zweryfikować Twojego identyfikatora podatkowego, jeśli uważasz, że jest to błąd, skontaktuj się z pomocą techniczną." }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Nieprawidłowy numer identyfikacji podatkowej, jeśli uważasz, że jest to błąd, skontaktuj się z pomocą techniczną." }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "Wystąpił błąd podczas podglądu faktury. Spróbuj ponownie później." }, "unverified": { "message": "Niezweryfikowane" @@ -9734,13 +9740,13 @@ "message": "Dowiedz się więcej o API Bitwarden" }, "fileSends": { - "message": "File Sends" + "message": "Wysyłki plików" }, "textSends": { - "message": "Text Sends" + "message": "Wysyłki tekstów" }, "includesXMembers": { - "message": "for $COUNT$ member", + "message": "dla $COUNT$ członków", "placeholders": { "count": { "content": "$1", @@ -9827,37 +9833,37 @@ "message": "GB dodatkowej przestrzeni" }, "sshKeyAlgorithm": { - "message": "Key algorithm" + "message": "Algorytm klucza" }, "sshPrivateKey": { - "message": "Private key" + "message": "Klucz prywatny" }, "sshPublicKey": { - "message": "Public key" + "message": "Klucz publiczny" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Odcisk palca" }, "sshKeyFingerprint": { - "message": "Fingerprint" + "message": "Odcisk palca" }, "sshKeyPrivateKey": { - "message": "Private key" + "message": "Klucz prywatny" }, "sshKeyPublicKey": { - "message": "Public key" + "message": "Klucz publiczny" }, "sshKeyAlgorithmED25519": { "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA 2048-bitowy" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA 3072-bitowy" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA 4096-bitowy" }, "premiumAccounts": { "message": "6 kont premium" @@ -9875,7 +9881,7 @@ "message": "Monitorowanie zdarzeń" }, "directoryIntegration": { - "message": "Directory integration" + "message": "Integracja katalogu" }, "passwordLessSso": { "message": "SSO bez hasła" @@ -9927,22 +9933,22 @@ "message": "Edytuj dostęp" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Użyj pól tekstowych dla danych takich jak pytania bezpieczeństwa" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "Użyj ukrytych pól dla danych poufnych, takich jak hasło" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "Użyj pól wyboru, jeśli chcesz automatycznie wypełnić pole wyboru formularza, np. jak zapamiętywanie e-mail" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "Użyj powiązanego pola, gdy masz problemy z autouzupełnianiem na konkretnej stronie internetowej." }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "Wprowadź atrybut z: html id, name, aria-label lub placeholder." }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Uwzględnij wielkie litery", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -9983,23 +9989,23 @@ "message": "Czy na pewno chcesz trwale usunąć ten załącznik?" }, "manageSubscriptionFromThe": { - "message": "Manage subscription from the", + "message": "Zarządzaj subskrypcją z", "description": "This represents the beginning of a sentence. The full sentence will be 'Manage subscription from the Provider Portal', but 'Provider Portal' will be a link and thus cannot be included in the translation file." }, "toHostBitwardenOnYourOwnServer": { - "message": "To host Bitwarden on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up automatic sync in your self-hosted organization." + "message": "Aby hostować Bitwarden na własnym serwerze, musisz przesłać plik licencyjny. Aby wspierać darmowe plany rodzinne i zaawansowane możliwości rozliczeniowe dla Twojej własnej organizacji, musisz skonfigurować automatyczną synchronizację w swojej własnej organizacji." }, "selfHostingTitleProper": { - "message": "Self-Hosting" + "message": "Samodzielne hostowanie" }, "claim-domain-single-org-warning": { - "message": "Claiming a domain will turn on the single organization policy." + "message": "Rejestracja domeny włączy politykę jednej organizacji." }, "single-org-revoked-user-warning": { - "message": "Non-compliant members will be revoked. Administrators can restore members once they leave all other organizations." + "message": "Niezgodni członkowie zostaną odwołani. Administratorzy mogą przywrócić członków po opuszczeniu wszystkich innych organizacji." }, "deleteOrganizationUser": { - "message": "Delete $NAME$", + "message": "Usuń $NAME$", "placeholders": { "name": { "content": "$1", @@ -10009,7 +10015,7 @@ } }, "deleteOrganizationUserWarningDesc": { - "message": "This will permanently delete all items owned by $NAME$. Collection items are not impacted.", + "message": "Spowoduje to trwałe usunięcie wszystkich elementów należących do $NAME$. Nie ma to wpływu na elementy w kolekcji.", "description": "Warning description for the delete organization user dialog", "placeholders": { "name": { @@ -10019,11 +10025,11 @@ } }, "deleteManyOrganizationUsersWarningDesc": { - "message": "This will permanently delete all items owned by the following members. Collection items are not impacted.", + "message": "Spowoduje to trwałe usunięcie wszystkich elementów należących do następujących członków. Nie ma to wpływu na elementy w kolekcji.", "description": "Warning description for the bulk delete organization users dialog" }, "organizationUserDeleted": { - "message": "Deleted $NAME$", + "message": "Usunięto $NAME$", "placeholders": { "name": { "content": "$1", @@ -10032,10 +10038,10 @@ } }, "organizationUserDeletedDesc": { - "message": "The user was removed from the organization and all associated user data has been deleted." + "message": "Użytkownik został usunięty z organizacji i wszystkie powiązane dane z tym użytkownikiem zostały usunięte." }, "deletedUserId": { - "message": "Deleted user $ID$ - an owner / admin deleted the user account", + "message": "Usunięto użytkownika $ID$ - właściciel / administrator usunął te konto użytkownika", "placeholders": { "id": { "content": "$1", @@ -10044,7 +10050,7 @@ } }, "userLeftOrganization": { - "message": "User $ID$ left organization", + "message": "Użytkownik $ID$ opuścił organizację", "placeholders": { "id": { "content": "$1", @@ -10053,7 +10059,7 @@ } }, "suspendedOrganizationTitle": { - "message": "The $ORGANIZATION$ is suspended", + "message": "$ORGANIZATION$ jest zawieszona", "placeholders": { "organization": { "content": "$1", @@ -10062,52 +10068,61 @@ } }, "suspendedUserOrgMessage": { - "message": "Contact your organization owner for assistance." + "message": "Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." }, "suspendedOwnerOrgMessage": { - "message": "To regain access to your organization, add a payment method." + "message": "Aby odzyskać dostęp do swojej organizacji, dodaj metodę płatności." }, "deleteMembers": { - "message": "Delete members" + "message": "Usuń członków" }, "noSelectedMembersApplicable": { - "message": "This action is not applicable to any of the selected members." + "message": "Ta akcja nie ma zastosowania do żadnego z wybranych członków." }, "deletedSuccessfully": { - "message": "Deleted successfully" + "message": "Usunięto pomyślnie" }, "freeFamiliesSponsorship": { - "message": "Remove Free Bitwarden Families sponsorship" + "message": "Usuń darmowe sponsorowanie rodzin Bitwarden" }, "freeFamiliesSponsorshipPolicyDesc": { - "message": "Do not allow members to redeem a Families plan through this organization." + "message": "Nie zezwalaj członkom na wykupienie planu rodzin za pośrednictwem tej organizacji." }, "verifyBankAccountWithStatementDescriptorWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the organization's billing page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "Płatność na rachunku bankowym jest dostępna tylko dla klientów w Stanach Zjednoczonych. Będziesz musiał zweryfikować swoje konto bankowe. Dokonamy mikrowpłaty w ciągu następnych 1-2 dni roboczych. Wprowadź kod deskryptora instrukcji z tej wpłaty na stronie rozliczeniowej organizacji, aby zweryfikować konto bankowe. Niezweryfikowanie konta bankowego spowoduje nieodebraną płatność, a subskrypcja zostanie zawieszona." }, "verifyBankAccountWithStatementDescriptorInstructions": { - "message": "We have made a micro-deposit to your bank account (this may take 1-2 business days). Enter the six-digit code starting with 'SM' found on the deposit description. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "Dokonaliśmy mikrowpłaty na Twoje konto bankowe (może to zająć 1-2 dni robocze). Wprowadź sześciocyfrowy kod zaczynający się od 'SM' znaleziony w opisie depozytu. Niezweryfikowanie konta bankowego spowoduje nieodebraną płatność, a subskrypcja zostanie zawieszona." }, "descriptorCode": { - "message": "Descriptor code" + "message": "Kod deskryptora" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } }, "importantNotice": { - "message": "Important notice" + "message": "Ważna informacja" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Skonfiguruj dwustopniowe logowanie" }, "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." + "message": "Bitwarden wyśle kod na Twój adres e-mail w celu zweryfikowania logowania z nowych urządzeń, począwszy od lutego 2025 r." }, "newDeviceVerificationNoticeContentPage2": { - "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." + "message": "Możesz skonfigurować dwustopniowe logowanie jako alternatywny sposób ochrony konta lub zmienić swój adres e-mail, do którego masz dostęp." }, "remindMeLater": { - "message": "Remind me later" + "message": "Przypomnij mi później" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "Czy masz pewny dostęp do swojego adresu e-mail, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -10116,49 +10131,49 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "Nie, nie mam" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "Tak, mam pewny dostęp do mojego adresu e-mail" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Włącz dwustopniowe logowanie" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Zmień adres e-mail konta" }, "removeMembers": { - "message": "Remove members" + "message": "Usuń użytkowników" }, "devices": { - "message": "Devices" + "message": "Urządzenia" }, "deviceListDescription": { - "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." + "message": "Twoje konto zostało zalogowane na każdym z poniższych urządzeń. Jeśli nie rozpoznajesz urządzenia, usuń je teraz." }, "deviceListDescriptionTemp": { - "message": "Your account was logged in to each of the devices below." + "message": "Twoje konto zostało zalogowane na każdym z poniższych urządzeń." }, "claimedDomains": { - "message": "Claimed domains" + "message": "Zarejestrowane domeny" }, "claimDomain": { - "message": "Claim domain" + "message": "Zarejestruj domenę" }, "reclaimDomain": { - "message": "Reclaim domain" + "message": "Wyrejestruj domenę" }, "claimDomainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be claimed." + "message": "Przykład: mydomain.com. Subdomeny wymagają osobnych wpisów celem weryfikacji." }, "automaticClaimedDomains": { - "message": "Automatic Claimed Domains" + "message": "Automatycznie zarejestrowane domeny" }, "automaticDomainClaimProcess": { - "message": "Bitwarden will attempt to claim the domain 3 times during the first 72 hours. If the domain can’t be claimed, check the DNS record in your host and manually claim. The domain will be removed from your organization in 7 days if it is not claimed." + "message": "Bitwarden spróbuje zweryfikować domenę 3 razy w ciągu pierwszych 72 godzin. Jeśli nie będzie można zweryfikować domeny, sprawdź rekord DNS na swoim serwerze i wprowadź go ręcznie. Domena zostanie usunięta z Twojej organizacji w ciągu 7 dni, jeśli nie zostanie zweryfikowana" }, "domainNotClaimed": { - "message": "$DOMAIN$ not claimed. Check your DNS records.", + "message": "$DOMAIN$ nie została zweryfikowana. Sprawdź swój rekord DNS.", "placeholders": { "DOMAIN": { "content": "$1", @@ -10167,19 +10182,19 @@ } }, "domainStatusClaimed": { - "message": "Claimed" + "message": "Zweryfikowano" }, "domainStatusUnderVerification": { - "message": "Under verification" + "message": "Podczas weryfikacji" }, "claimedDomainsDesc": { - "message": "Claim a domain to own all member accounts whose email address matches the domain. Members will be able to skip the SSO identifier when logging in. Administrators will also be able to delete member accounts." + "message": "Zweryfikuj domenę do posiadania wszystkich kont użytkowników, których adres e-mail pasuje do domeny. Członkowie będą mogli pominąć identyfikator SSO podczas logowania. Administratorzy będą również mogli usuwać konta członków." }, "invalidDomainNameClaimMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be claimed." + "message": "Wprowadzone dane są niepoprawne. Format: mydomain.com. Subdomeny wymagają osobnych wpisów celem weryfikacji." }, "domainClaimedEvent": { - "message": "$DOMAIN$ claimed", + "message": "Zweryfikowano $DOMAIN$", "placeholders": { "DOMAIN": { "content": "$1", @@ -10188,7 +10203,7 @@ } }, "domainNotClaimedEvent": { - "message": "$DOMAIN$ not claimed", + "message": "$DOMAIN$ nie została zweryfikowana", "placeholders": { "DOMAIN": { "content": "$1", @@ -10197,7 +10212,7 @@ } }, "updatedRevokeSponsorshipConfirmationForSentSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan cannot be redeemed. Are you sure you want to continue?", + "message": "Jeśli usuniesz $EMAIL$, sponsorowanie tego planu rodziny nie może zostać zrealizowane. Czy na pewno chcesz kontynuować?", "placeholders": { "email": { "content": "$1", @@ -10206,7 +10221,7 @@ } }, "updatedRevokeSponsorshipConfirmationForAcceptedSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan will end and the saved payment method will be charged $40 + applicable tax on $DATE$. You will not be able to redeem a new sponsorship until $DATE$. Are you sure you want to continue?", + "message": "Jeśli usuniesz $EMAIL$, sponsorowanie tego planu rodzinnego zakończy się, a zapisana metoda płatności zostanie naliczona 40 USD + obowiązujący podatek od $DATE$. Nie będziesz w stanie wykupić nowego sponsora do dnia $DATE$. Czy na pewno chcesz kontynuować?", "placeholders": { "email": { "content": "$1", @@ -10219,13 +10234,13 @@ } }, "domainClaimed": { - "message": "Domain claimed" + "message": "Domena zarejestrowana" }, "organizationNameMaxLength": { - "message": "Organization name cannot exceed 50 characters." + "message": "Nazwa organizacji nie może przekraczać 50 znaków." }, "resellerRenewalWarningMsg": { - "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", + "message": "Twoja subskrypcja zostanie wkrótce odnowiona. Aby zapewnić nieprzerwaną usługę, skontaktuj się z $RESELLER$ , aby potwierdzić odnowienie przed $RENEWAL_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10238,7 +10253,7 @@ } }, "resellerOpenInvoiceWarningMgs": { - "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.", + "message": "Faktura za subskrypcję została wystawiona dnia $ISSUED_DATE$. Aby zapewnić nieprzerwaną usługę, skontaktuj się z $RESELLER$ , aby potwierdzić odnowienie przed dniem $DUE_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10255,7 +10270,7 @@ } }, "resellerPastDueWarningMsg": { - "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.", + "message": "Faktura za subskrypcję nie została zapłacona. Aby zapewnić nieprzerwaną usługę, skontaktuj się z $RESELLER$ , aby potwierdzić odnowienie przed $GRACE_PERIOD_END$.", "placeholders": { "reseller": { "content": "$1", @@ -10268,18 +10283,67 @@ } }, "restartOrganizationSubscription": { - "message": "Organization subscription restarted" + "message": "Subskrypcja organizacji zrestartowana" }, "restartSubscription": { - "message": "Restart your subscription" + "message": "Zrestartuj swoją subskrypcję" }, "suspendedManagedOrgMessage": { - "message": "Contact $PROVIDER$ for assistance.", + "message": "Skontaktuj się z $PROVIDER$ w celu uzyskania pomocy.", "placeholders": { "provider": { "content": "$1", "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administratorzy mają teraz możliwość usunięcia kont członków, które należą do zarejestrowanej domeny." + }, + "deleteManagedUserWarningDesc": { + "message": "Ta akcja usunie konto członka, w tym wszystkie elementy w ich sejfie. To zastępuje poprzednią akcję Usunięcia." + }, + "deleteManagedUserWarning": { + "message": "Usuń jest nową akcją!" + }, + "seatsRemaining": { + "message": "Pozostało $REMAINING$ miejsc z $TOTAL$ miejsc przypisanych do tej organizacji. Skontaktuj się z dostawcą, aby zarządzać subskrypcją.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Istniejąca organizacja" + }, + "selectOrganizationProviderPortal": { + "message": "Wybierz organizację, aby dodać do portalu dostawcy." + }, + "noOrganizations": { + "message": "Nie ma organizacji, którą można by wyświetlić" + }, + "yourProviderSubscriptionCredit": { + "message": "Subskrypcja twojego dostawcy otrzyma kredyt za pozostały czas w subskrypcji organizacji." + }, + "doYouWantToAddThisOrg": { + "message": "Czy chcesz dodać tę organizację do $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Dodano istniejącą organizację" + }, + "assignedExceedsAvailable": { + "message": "Przypisane miejsca przekraczają dostępne miejsca." } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 4b9e65535ce..85efb0c1027 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editar Pasta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Domínio de base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nome do item" }, - "cannotRemoveViewOnlyCollections": { - "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Login iniciado" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Enviar" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se que sua conta esteja desbloqueado e que a frase de impressão digital corresponda à do outro dispositivo." - }, "versionNumber": { "message": "Versão $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Evitar caracteres ambíguos", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Gerar Nova Senha" - }, "length": { "message": "Comprimento" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gerenciar" }, - "canManage": { - "message": "Pode gerenciar" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Desabilitar" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Houve um problema ao ler a chave de segurança. Tente novamente." }, - "twoFactorWebAuthnWarning": { - "message": "Devido às limitações da plataforma, o WebAuthn não pode ser usado em todos os aplicativos do Bitwarden. Você deve habilitar outro provedor de login em duas etapas, para que você possa acessar a sua conta quando o WebAuthn não puder ser usado. Plataformas suportadas:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Cofre web e extensões de navegador em um desktop/laptop com um navegador habilitado para WebAuthn (Chrome, Opera, Vivaldi ou Firefox com o FIDO U2F ativado)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Seu código de recuperação de login em duas etapas do Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Defina os requisitos mínimos para configuração do gerador de senhas." }, - "passwordGeneratorPolicyInEffect": { - "message": "Uma ou mais políticas da organização estão afetando as suas configurações do gerador." - }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:" }, @@ -6681,15 +6717,6 @@ "message": "Gerador", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "O que você gostaria de gerar?" - }, - "passwordType": { - "message": "Tipo de Senha" - }, - "regenerateUsername": { - "message": "Recriar Usuário" - }, "generateUsername": { "message": "Gerar Usuário" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipo de Usuário" - }, "plusAddressedEmail": { "message": "E-mail alternativo (com um +)", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token de acesso API" - }, "deviceVerification": { "message": "Verificação do dispositivo" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Sem coleções" }, - "canView": { - "message": "Pode ver" - }, - "canViewExceptPass": { - "message": "Pode ver, exceto senhas" - }, - "canEdit": { - "message": "Pode editar" - }, - "canEditExceptPass": { - "message": "Pode editar, exceto senhas" - }, "noCollectionsAdded": { "message": "Nenhuma coleção adicionada" }, @@ -8677,9 +8686,6 @@ "message": "URL do servidor auto-host", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias do domínio" - }, "alreadyHaveAccount": { "message": "Já tem uma conta?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Você não tem acesso para gerenciar esta coleção." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Falta conceder o Poder de Gerenciar Permissões" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Conceda o poder de gerenciar permissões para habilitar o gerenciamento completo da coleção, incluindo a exclusão da coleção." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Conceder acesso de grupos ou membros a esta coleção." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Código do descritor" }, + "cannotRemoveViewOnlyCollections": { + "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 6d724302888..964e4594958 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editar pasta" }, + "newFolder": { + "message": "Nova pasta" + }, + "folderName": { + "message": "Nome da pasta" + }, + "folderHintText": { + "message": "Crie uma subpasta adicionando o nome da pasta principal seguido de um \"/\". Exemplo: Redes Sociais/Fóruns" + }, + "deleteFolderPermanently": { + "message": "Tem a certeza de que pretende eliminar permanentemente esta pasta?" + }, "baseDomain": { "message": "Domínio de base", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Nome do item" }, - "cannotRemoveViewOnlyCollections": { - "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "A preparar o início de sessão" }, + "logInRequestSent": { + "message": "Pedido enviado" + }, "submit": { "message": "Submeter" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Foi enviada uma notificação para o seu dispositivo." }, + "notificationSentDevicePart1": { + "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " + }, + "areYouTryingToAccessYourAccount": { + "message": "Está a tentar aceder à sua conta?" + }, + "accessAttemptBy": { + "message": "Tentativa de acesso por $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirmar acesso" + }, + "denyAccess": { + "message": "Recusar acesso" + }, + "notificationSentDeviceAnchor": { + "message": "aplicação web" + }, + "notificationSentDevicePart2": { + "message": "Certifique-se de que a frase da impressão digital corresponde à frase abaixo indicada antes de a aprovar." + }, + "notificationSentDeviceComplete": { + "message": "Desbloqueie o Bitwarden no seu dispositivo. Certifique-se de que a frase da impressão digital corresponde à frase abaixo antes de a aprovar." + }, "aNotificationWasSentToYourDevice": { "message": "Foi enviada uma notificação para o seu dispositivo" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Certifique-se de que a sua conta está desbloqueada e que a frase de impressão digital corresponde à do outro dispositivo" - }, "versionNumber": { "message": "Versão $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Evitar carateres ambíguos", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerar palavra-passe" - }, "length": { "message": "Comprimento" }, @@ -1849,25 +1879,25 @@ "message": "Ao prosseguir, também terminará a sua sessão atual e terá de iniciar sessão novamente. Ser-lhe-á também pedido que volte efetuar a verificação de dois passos, se estiver configurada. As sessões ativas noutros dispositivos podem continuar ativas até uma hora." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Início de sessão de um novo dispositivo" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Desativar a proteção de início de sessão de novos dispositivos" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Ativar a proteção de início de sessão de novos dispositivos" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Proceda da seguinte forma para desativar os e-mails de verificação que o Bitwarden envia quando inicia sessão a partir de um novo dispositivo." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Proceda da seguinte forma para que o Bitwarden lhe envie e-mails de verificação quando iniciar sessão a partir de um novo dispositivo." }, "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": "Com a proteção de início de sessão de novos dispositivos desativada, qualquer pessoa com a sua palavra-passe mestra pode aceder à sua conta a partir de qualquer dispositivo. Para proteger a sua conta sem e-mails de verificação, configure a verificação de dois passos." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Alterações na proteção do início de sessão do novo dispositivo guardadas" }, "sessionsDeauthorized": { "message": "Todas as sessões desautorizadas" @@ -2170,8 +2200,20 @@ "manage": { "message": "Gerir" }, - "canManage": { - "message": "Pode gerir" + "manageCollection": { + "message": "Gerir coleção" + }, + "viewItems": { + "message": "Ver itens" + }, + "viewItemsHidePass": { + "message": "Ver itens, palavras-passe ocultas" + }, + "editItems": { + "message": "Editar itens" + }, + "editItemsHidePass": { + "message": "Editar itens, palavras-passe ocultas" }, "disable": { "message": "Desativar" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Ocorreu um problema ao ler a chave de segurança. Tente novamente." }, - "twoFactorWebAuthnWarning": { - "message": "Devido a limitações da plataforma, o WebAuthn não pode ser utilizado em todas as aplicações Bitwarden. Deve configurar outro fornecedor de verificação de dois passos para que possa aceder à sua conta quando o WebAuthn não puder ser utilizado. Plataformas suportadas:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Cofre web e extensões do navegador num computador de secretária/portátil com um navegador compatível com WebAuthn (Chrome, Opera, Vivaldi ou Firefox com FIDO U2F ativado)." + "twoFactorWebAuthnWarning1": { + "message": "Devido a limitações da plataforma, o WebAuthn não pode ser utilizado em todas as aplicações Bitwarden. Deve configurar outro fornecedor de verificação de dois passos para poder aceder à sua conta quando o WebAuthn não puder ser utilizado." }, "twoFactorRecoveryYourCode": { "message": "O seu código Bitwarden de recuperação da verificação de dois passos" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Definir requisitos para o gerador de palavras-passe." }, - "passwordGeneratorPolicyInEffect": { - "message": "Uma ou mais políticas da organização estão a afetar as suas definições do gerador." - }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua palavra-passe mestra cumpra os seguintes requisitos:" }, @@ -6681,15 +6717,6 @@ "message": "Gerador", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "O que é que gostaria de gerar?" - }, - "passwordType": { - "message": "Tipo de palavra-passe" - }, - "regenerateUsername": { - "message": "Regenerar nome de utilizador" - }, "generateUsername": { "message": "Gerar nome de utilizador" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tipo de nome de utilizador" - }, "plusAddressedEmail": { "message": "E-mail com subendereço", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nome de domínio", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token de acesso à API" - }, "deviceVerification": { "message": "Verificação do dispositivo" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Sem coleções" }, - "canView": { - "message": "Pode ver" - }, - "canViewExceptPass": { - "message": "Pode ver, excepto palavras-passe" - }, - "canEdit": { - "message": "Pode editar" - }, - "canEditExceptPass": { - "message": "Pode editar, excepto palavras-passe" - }, "noCollectionsAdded": { "message": "Não foram adicionadas coleções" }, @@ -8626,7 +8635,7 @@ "message": "Limitar a eliminação de coleções aos proprietários e administradores" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Limitar a eliminação de itens a membros com a permissão Pode gerir" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Os proprietários e administradores podem gerir todas as coleções e itens" @@ -8677,9 +8686,6 @@ "message": "URL do servidor auto-hospedado", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias de domínio" - }, "alreadyHaveAccount": { "message": "Já tem uma conta?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Não tem acesso para gerir esta coleção." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Faltam permissões Pode gerir" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Conceda permissões Pode gerir para permitir a gestão completa da coleção, incluindo a eliminação da coleção." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Conceder a grupos ou membros acesso a esta coleção." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Código descritor" }, + "cannotRemoveViewOnlyCollections": { + "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Aviso importante" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "Tem $REMAINING$ lugares restantes dos $TOTAL$ lugares atribuídos a esta organização. Contacte o seu fornecedor para gerir a sua subscrição.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Organização existente" + }, + "selectOrganizationProviderPortal": { + "message": "Selecione uma organização para adicionar ao seu Portal do fornecedor." + }, + "noOrganizations": { + "message": "Não existem organizações para listar" + }, + "yourProviderSubscriptionCredit": { + "message": "A subscrição do fornecedor receberá um crédito por qualquer tempo restante na subscrição da organização." + }, + "doYouWantToAddThisOrg": { + "message": "Pretende adicionar esta organização a $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Organização existente adicionada" + }, + "assignedExceedsAvailable": { + "message": "Os lugares atribuídos excedem os lugares disponíveis." } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 966ef8fdcb3..4db5a16a566 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Editare dosar" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Domeniu de bază", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Autentificare inițiată" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Trimitere" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "O notificare a fost trimisă pe dispozitivul dvs." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Versiunea $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerare parolă" - }, "length": { "message": "Lungime" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Gestionare" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Dezactivare" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "A apărut o problemă la citirea cheii de securitate. Încercați din nou." }, - "twoFactorWebAuthnWarning": { - "message": "Din cauza limitărilor de platformă, WebAuthn nu poate fi utilizat pe toate aplicațiile Bitwarden. Ar trebui să configurați un alt furnizor de autentificare în două etape, astfel încât să vă puteți accesa contul atunci când WebAuthn nu se poate utiliza. Platformele acceptate:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Seif web și extensii de browser pe un desktop/laptop cu un browser compatibil cu WebAuthn (Chrome, Opera, Vivaldi sau Firefox cu FIDO U2F activat)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Codul dvs. Bitwarden de recuperare a autentificării în două etape" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Setați cerințele pentru generatorul de parole." }, - "passwordGeneratorPolicyInEffect": { - "message": "Una sau mai multe politici organizaționale vă afectează setările generatorului." - }, "masterPasswordPolicyInEffect": { "message": "Una sau mai multe politici organizaționale necesită ca parola principală să îndeplinească următoarele cerințe:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Ce doriți să generați?" - }, - "passwordType": { - "message": "Tip de parolă" - }, - "regenerateUsername": { - "message": "Regenerare nume de utilizator" - }, "generateUsername": { "message": "Generare nume de utilizator" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Tip de nume de utilizator" - }, "plusAddressedEmail": { "message": "E-mail Plus adresat", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Nume gazdă", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Token de acces API" - }, "deviceVerification": { "message": "Verificarea dispozitivului" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 622fe2f2705..c8017041bad 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -156,16 +156,16 @@ "message": "Всего приложений" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Снять пометку критического приложения" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Критическое приложение успешно снято" }, "whatTypeOfItem": { "message": "Выберите тип элемента" }, "name": { - "message": "Название" + "message": "Имя" }, "uri": { "message": "URI" @@ -464,6 +464,18 @@ "editFolder": { "message": "Изменить папку" }, + "newFolder": { + "message": "Новая папка" + }, + "folderName": { + "message": "Название папки" + }, + "folderHintText": { + "message": "Создайте вложенную папку, добавив название родительской папки и символ \"/\". Пример: Сообщества/Форумы" + }, + "deleteFolderPermanently": { + "message": "Вы действительно хотите безвозвратно удалить эту папку?" + }, "baseDomain": { "message": "Основной домен", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Название элемента" }, - "cannotRemoveViewOnlyCollections": { - "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "напр.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Вход инициирован" }, + "logInRequestSent": { + "message": "Запрос отправлен" + }, "submit": { "message": "Подтвердить" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "На ваше устройство отправлено уведомление." }, + "notificationSentDevicePart1": { + "message": "Разблокируйте Bitwarden на своем устройстве или " + }, + "areYouTryingToAccessYourAccount": { + "message": "Вы пытаетесь получить доступ к своему аккаунту?" + }, + "accessAttemptBy": { + "message": "Попытка доступа $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Подтвердить доступ" + }, + "denyAccess": { + "message": "Отказать в доступе" + }, + "notificationSentDeviceAnchor": { + "message": "веб-приложении" + }, + "notificationSentDevicePart2": { + "message": "Перед одобрением убедитесь, что фраза отпечатка совпадает с приведенной ниже." + }, + "notificationSentDeviceComplete": { + "message": "Разблокируйте Bitwarden на своем устройстве. Перед одобрением убедитесь, что фраза отпечатка совпадает с приведенной ниже." + }, "aNotificationWasSentToYourDevice": { "message": "На ваше устройство было отправлено уведомление" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Убедитесь, что ваш аккаунт разблокирован и фраза отпечатка совпадает с фразой на другом устройстве" - }, "versionNumber": { "message": "Версия $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Избегать неоднозначных символов", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Создать новый пароль" - }, "length": { "message": "Длина" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Управление" }, - "canManage": { - "message": "Может управлять" + "manageCollection": { + "message": "Управление коллекцией" + }, + "viewItems": { + "message": "Просмотр элементов" + }, + "viewItemsHidePass": { + "message": "Просмотр элементов, скрытых паролей" + }, + "editItems": { + "message": "Изменить элементы" + }, + "editItemsHidePass": { + "message": "Изменить элементы, скрытые пароли" }, "disable": { "message": "Отключить" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Не удалось прочитать ключ безопасности. Попробуйте снова." }, - "twoFactorWebAuthnWarning": { - "message": "Из-за ограничений платформы WebAuthn нельзя использовать во всех приложениях Bitwarden. Вы должны настроить другого провайдера двухэтапной аутентификации, чтобы иметь возможность получить доступ к своей учетной записи, когда WebAuthn не может быть использован. Поддерживаемые платформы:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Веб-хранилище и расширения браузера на компьютере/ноутбуке с браузером с поддержкой WebAuthn (Chrome, Opera, Vivaldi или Firefox с включенным FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Из-за ограничений платформы WebAuthn нельзя использовать во всех приложениях Bitwarden. Вы должны настроить другого провайдера двухэтапной аутентификации, чтобы иметь возможность получить доступ к своей учетной записи, когда WebAuthn не может быть использован." }, "twoFactorRecoveryYourCode": { "message": "Ваш код восстановления двухэтапной аутентификации Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Установить требования к генератору паролей." }, - "passwordGeneratorPolicyInEffect": { - "message": "На настройки генератора влияют одна или несколько политик организации." - }, "masterPasswordPolicyInEffect": { "message": "Согласно одной или нескольким политикам организации необходимо, чтобы ваш мастер-пароль отвечал следующим требованиям:" }, @@ -6681,15 +6717,6 @@ "message": "Генератор", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Что вы хотите сгенерировать?" - }, - "passwordType": { - "message": "Тип пароля" - }, - "regenerateUsername": { - "message": "Пересоздать имя пользователя" - }, "generateUsername": { "message": "Создать имя пользователя" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тип имени пользователя" - }, "plusAddressedEmail": { "message": "Субадресованные email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Имя хоста", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Токен доступа к API" - }, "deviceVerification": { "message": "Проверка устройства" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Нет коллекций" }, - "canView": { - "message": "Может просматривать" - }, - "canViewExceptPass": { - "message": "Может просматривать, кроме паролей" - }, - "canEdit": { - "message": "Может редактировать" - }, - "canEditExceptPass": { - "message": "Может редактировать, кроме паролей" - }, "noCollectionsAdded": { "message": "Нет добавленных коллекций" }, @@ -8306,19 +8315,19 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "одна организация", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "policy,", + "message": "политика,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "SSO required", + "message": "Требуется SSO", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "policy, and", + "message": "политика, и", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { @@ -8626,7 +8635,7 @@ "message": "Ограничить удаление коллекций владельцам и администраторам" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Ограничить удаление элементов для пользователей с разрешением 'Может управлять'" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Владельцы и администраторы могут управлять всеми коллекциями и элементами" @@ -8677,9 +8686,6 @@ "message": "URL собственного сервера", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Псевдоним домена" - }, "alreadyHaveAccount": { "message": "Уже зарегистрированы?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "У вас нет доступа к управлению этой коллекцией." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Недостаточно полномочий для управления" + "grantManageCollectionWarningTitle": { + "message": "Отсутствуют разрешения на управление коллекцией" }, - "grantAddAccessCollectionWarning": { - "message": "Предоставить возможность управлять разрешениями коллекций, включая их удаление." + "grantManageCollectionWarning": { + "message": "Представить разрешения на управление коллекцией, включая ее удаление." }, "grantCollectionAccess": { "message": "Предоставить группам или участникам доступ к этой коллекции." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Код дескриптора" }, + "cannotRemoveViewOnlyCollections": { + "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Важное уведомление" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Администраторы теперь могут удалять аккаунты пользователей, принадлежащие заявленному домену." + }, + "deleteManagedUserWarningDesc": { + "message": "Это действие удалит аккаунт пользователя, включая все элементы в его хранилище. Это действие заменяет предыдущее действие Удалить." + }, + "deleteManagedUserWarning": { + "message": "Удалить - это новое действие!" + }, + "seatsRemaining": { + "message": "У вас осталось $REMAINING$ мест из $TOTAL$, закрепленных за этой организацией. Обратитесь к своему провайдеру для управления подпиской.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Существующая организация" + }, + "selectOrganizationProviderPortal": { + "message": "Выберите организацию для добавления на ваш портал провайдеров." + }, + "noOrganizations": { + "message": "Нет организаций для отображения" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Вы хотите добавить эту организацию в $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index e30b09f9329..058528cb18d 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "බහාලුම සංස්කරණය" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "උදා.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index ffc9001562e..bee2d072f91 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Upraviť priečinok" }, + "newFolder": { + "message": "Nový priečinok" + }, + "folderName": { + "message": "Názov priečinka" + }, + "folderHintText": { + "message": "Vnorte priečinok pridaním názvu nadradeného priečinka a znaku \"/\". Príklad: Sociálne siete/Fóra" + }, + "deleteFolderPermanently": { + "message": "Naozaj chcete natrvalo odstrániť tento priečinok?" + }, "baseDomain": { "message": "Základná doména", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Názov položky" }, - "cannotRemoveViewOnlyCollections": { - "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "napr.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Iniciované prihlásenie" }, + "logInRequestSent": { + "message": "Požiadavka bola odoslaná" + }, "submit": { "message": "Potvrdiť" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie." }, + "notificationSentDevicePart1": { + "message": "Odomknúť Bitwarden vo svojom zariadení alebo vo " + }, + "areYouTryingToAccessYourAccount": { + "message": "Snažíte sa získať prístup k svojmu účtu?" + }, + "accessAttemptBy": { + "message": "Pokus o prístup z $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potvrďte prístup" + }, + "denyAccess": { + "message": "Zamietnuť prístup" + }, + "notificationSentDeviceAnchor": { + "message": "webovej aplikácii" + }, + "notificationSentDevicePart2": { + "message": "Pred schválením sa uistite, že sa odtlačok prístupovej frázy zhoduje s tou uvedenou nižšie." + }, + "notificationSentDeviceComplete": { + "message": "Odomknite Bitwarden na vašom zariadení. Pred schválením sa uistite, že sa odtlačok prístupovej frázy zhoduje s tým uvedeným nižšie." + }, "aNotificationWasSentToYourDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Uistite sa, že je váš účet odomknutý a fráza odtlačku prsta sa zhoduje s frázou na druhom zariadení" - }, "versionNumber": { "message": "Verzia $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Vyhnúť sa zameniteľným znakom", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Vygenerovať nové heslo" - }, "length": { "message": "Dĺžka" }, @@ -1849,25 +1879,25 @@ "message": "Ak budete pokračovať, budete tiež odhlásený z vášho súčasného sedenia a budete sa musieť opäť prihlásiť. Tiež budete opäť požiadaný o dvojstupňové prihlásenie ak ho máte zapnuté. Aktívne sedenia na iných zariadeniach môžu ostať aktívne až po dobu jednej hodiny." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Prihlásenie z nového zariadenia" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Vypnúť ochranu pri prihlásení z nového zariadenia" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Zapnúť ochranu pri prihlásení z nového zariadenia" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "Ak chcete vypnúť overovacie emaily, ktoré Bitwarden posiela keď sa prihlasujete z nového zariadenia, pokračujte nižšie." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "Ak chcete aby Bitwarden posielal overovacie emaily keď sa prihlasujete z nového zariadenia, pokračujte nižšie." }, "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": "S vypnutou ochranou pri prihlásení z nového zariadenia môže ktokoľvek, kto pozná vaše hlavne heslo, pristupovať k vášmu účtu z ľubovoľného zariadenia. Ak chcete ochrániť váš účet bez overovacích emailov, nastavte si dvojstupňové overovanie pri prihlasovaní." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "Zmeny v nastavení ochrany prihlasovania z nového zariadenia boli uložené" }, "sessionsDeauthorized": { "message": "Všetky sedenia odhlásené" @@ -2170,8 +2200,20 @@ "manage": { "message": "Spravovať" }, - "canManage": { - "message": "Môže spravovať" + "manageCollection": { + "message": "Spravovať zbierku" + }, + "viewItems": { + "message": "Zobraziť položky" + }, + "viewItemsHidePass": { + "message": "Zobraziť položky, skryté heslá" + }, + "editItems": { + "message": "Upraviť položky" + }, + "editItemsHidePass": { + "message": "Upraviť položky, skryté heslá" }, "disable": { "message": "Vypnúť" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Problém pri čítaní bezpečnostného kľúča. Skúste to znova." }, - "twoFactorWebAuthnWarning": { - "message": "Vzhľadom na obmedzenia platform, WebAuthn nemôže byť použitý vo všetkých Bitwarden aplikáciách. Mali by ste povoliť inú formu dvojitého overenia, aby ste sa mohli prihlásiť k svojmu účtu ak nie je možné použiť WebAuthn. Podporované platformy:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webový trezor a rozšírenia prehliadača na pracovnej stanici s prehliadačom podporujúcim WebAuthn (Chrome, Opera, Vivaldi, alebo Firefox so zapnutou podporou FIDO U2F)." + "twoFactorWebAuthnWarning1": { + "message": "Vzhľadom na obmedzenia platforiem, WebAuthn nemôže byť použitý vo všetkých Bitwarden aplikáciách. Mali by ste nastaviť inú formu dvojitého overenia, aby ste sa mohli prihlásiť k svojmu účtu ak nie je možné použiť WebAuthn." }, "twoFactorRecoveryYourCode": { "message": "Váš Bitwarden záchranný kód pre dvojstupňové overovanie" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Zvoľte minimálne požiadavky pre nastavenie generátora hesiel." }, - "passwordGeneratorPolicyInEffect": { - "message": "Jedno alebo viac nastavení organizácie ovplyvňujú vaše nastavenia generátora." - }, "masterPasswordPolicyInEffect": { "message": "Jedno alebo viac pravidiel organizácie požadujú aby vaše hlavné heslo spĺňalo nasledujúce požiadavky:" }, @@ -6681,15 +6717,6 @@ "message": "Generátor", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Čo by ste chceli vygenerovať?" - }, - "passwordType": { - "message": "Typ hesla" - }, - "regenerateUsername": { - "message": "Vygenerovať nové používateľské meno" - }, "generateUsername": { "message": "Vygenerovať používateľské meno" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Typ používateľského mena" - }, "plusAddressedEmail": { "message": "E-mail s plusovým aliasom", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "Použiť doručenú poštu typu catch-all nastavenú na doméne." }, "useThisEmail": { - "message": "Use this email" + "message": "Použiť tento e-mail" }, "random": { "message": "Náhodné", @@ -6952,9 +6976,6 @@ "message": "Názov hostiteľa", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Prístupový token API" - }, "deviceVerification": { "message": "Overenie zariadenia" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Žiadna zbierka" }, - "canView": { - "message": "Môže zobraziť" - }, - "canViewExceptPass": { - "message": "Môže zobraziť okrem hesiel" - }, - "canEdit": { - "message": "Môže upraviť" - }, - "canEditExceptPass": { - "message": "Môže upravovať okrem hesiel" - }, "noCollectionsAdded": { "message": "Nebolí pridané žiadne zbierky" }, @@ -8626,7 +8635,7 @@ "message": "Obmedziť vymazávanie zbierky len pre vlastníkov a administrátorov" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "Obmedziť vymazávanie položiek na členov s oprávnením \"Môže spravovať\"" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Vlastníci a správcovia môžu spravovať všetky zbierky a položky" @@ -8677,9 +8686,6 @@ "message": "Adresa URL vlastného hostingu", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias doména" - }, "alreadyHaveAccount": { "message": "Už máte účet?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Nemáte prístup k spravovaniu tejto zbierky." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Chýbajúce oprávnenia pre správu zbierky" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Pre povolenie kompletnej správy zbierky vrátane jej vymazania, udeľte oprávnenia na správu zbierky." }, "grantCollectionAccess": { "message": "Povoľte skupinám, alebo jednotlivcom prístup k tejto zbierke." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Kód výpisu" }, + "cannotRemoveViewOnlyCollections": { + "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Dôležité upozornenie" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Odteraz majú správcovia právomoc vymazať konta členov, ktorí prináležia do privlastnenej domény." + }, + "deleteManagedUserWarningDesc": { + "message": "Táto akcia vymaže člena vrátane všetkých ich položiek v trezore. Tato akcia nahrádza predchádzajúcu akciu Odstrániť." + }, + "deleteManagedUserWarning": { + "message": "\"Vymazať\" je nová akcia!" + }, + "seatsRemaining": { + "message": "Z celkovo $TOTAL$ sedení pridelených tejto organizácii vám zostava $REMAINING$ sedení. Pre správu predplatného kontaktujte vášho poskytovateľa.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existujúca organizácia" + }, + "selectOrganizationProviderPortal": { + "message": "Vyberte organizáciu ktorú chcete pridať do portálu poskytovateľa." + }, + "noOrganizations": { + "message": "Neexistujú žiadne organizácie na zobrazenie" + }, + "yourProviderSubscriptionCredit": { + "message": "Váš poskytovateľ predplatného obdrží kredit za zostávajúci čas predplatného vašej organizácie." + }, + "doYouWantToAddThisOrg": { + "message": "Chcete pridať tuto organizáciu k $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Existujúca organizácia pridaná" + }, + "assignedExceedsAvailable": { + "message": "Počet pridelených sedení presahuje počet dostupných sedení." } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index aec4c8bf0f4..c440f0cfcf1 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Uredi mapo" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Bazna domena", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "npr.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Prijava se je začela" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Potrdi" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Na vašo napravo smo poslali obvestilo." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Različica $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Ponovno generiraj geslo" - }, "length": { "message": "Dolžina" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Upravljaj" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Onemogočeno" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Kaj želite generirati?" - }, - "passwordType": { - "message": "Vrsta gesla" - }, - "regenerateUsername": { - "message": "Ponovno generiraj uporabniško ime" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Vrsta uporabniškega imena" - }, "plusAddressedEmail": { "message": "E-naslov s plusom", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Dostopni žeto (\"access token\") za API" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index 2822da7ddee..809fa21d852 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Уреди фасциклу" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Главни домен", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Име ставке" }, - "cannotRemoveViewOnlyCollections": { - "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "нпр.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Пријава је покренута" }, + "logInRequestSent": { + "message": "Захтев је послат" + }, "submit": { "message": "Пошаљи" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Обавештење је послато на ваш уређај." }, + "notificationSentDevicePart1": { + "message": "Откључај Bitwarden на твом уређају или на " + }, + "areYouTryingToAccessYourAccount": { + "message": "Да ли покушавате да приступите вашем налогу?" + }, + "accessAttemptBy": { + "message": "Покушај приступа са $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Потврди приступ" + }, + "denyAccess": { + "message": "Одбиј приступ" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Потврдите да се фраза отиска прста поклапа са овом испод пре одобравања." + }, + "notificationSentDeviceComplete": { + "message": "Октључај Bitwarden на твом уређају. Потврдите да се фраза отиска прста поклапа са овом испод пре одобравања." + }, "aNotificationWasSentToYourDevice": { "message": "Обавештење је послато на ваш уређај" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Уверите се да је ваш налог откључан и да се фраза отиска подудара на другом уређају" - }, "versionNumber": { "message": "Верзија $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Избегавај двосмислене карактере", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Поново генериши лозинку" - }, "length": { "message": "Дужина" }, @@ -1849,13 +1879,13 @@ "message": "Наставак ће вас такође одјавити из тренутне сесије, што захтева поновно пријављивање. Од вас ће такође бити затражено да се поново пријавите у два корака, ако је омогућено. Активне сесије на другим уређајима могу да остану активне још један сат." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "Пријава на новом уређају" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "Искључи заштиту пријаве на новом уређају" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "Укључи заштиту пријаве на новом уређају" }, "turnOffNewDeviceLoginProtectionModalDesc": { "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." @@ -2170,8 +2200,20 @@ "manage": { "message": "Управљати" }, - "canManage": { - "message": "Може управљати" + "manageCollection": { + "message": "Управљај колекцијом" + }, + "viewItems": { + "message": "Прикажи ставке" + }, + "viewItemsHidePass": { + "message": "Прикажи ставке, сакривене лозинке" + }, + "editItems": { + "message": "Уреди ставке" + }, + "editItemsHidePass": { + "message": "Уреди ставке, сакривене лозинке" }, "disable": { "message": "Онемогући" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Догодила се грешка приликом читања безбедносног кључа. Покушајте поново." }, - "twoFactorWebAuthnWarning": { - "message": "Због ограничења платформе, WebAuthn се не могу користити на свим Bitwarden апликацијама. Требали бисте омогућити другог добављача услуге пријављивања у два корака како бисте могли да приступите свом налогу када WebAuthn не могу да се користе. Подржане платформе:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Веб сеф и додатке прегледача на рачунару са WebAuthn омогућен прегледач (Chrome, Opera, Vivaldi, или Firefox са FIDO U2F омогућено)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Ваш Bitwarden код за опоравак пријаве у два корака" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Поставите минималне захтеве за конфигурацију генератора лозинки." }, - "passwordGeneratorPolicyInEffect": { - "message": "Једна или више смерница организације утичу на поставке вашег генератора." - }, "masterPasswordPolicyInEffect": { "message": "Једна или више смерница организације захтевају да ваша главна лозинка да би испуњавали следеће захтеве:" }, @@ -6681,15 +6717,6 @@ "message": "Генератор", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Шта желите да генеришете?" - }, - "passwordType": { - "message": "Тип лозинке" - }, - "regenerateUsername": { - "message": "Поново генериши име" - }, "generateUsername": { "message": "Генериши име" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тип имена" - }, "plusAddressedEmail": { "message": "Плус имејл адресе", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Име домаћина", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Приступни АПИ токен" - }, "deviceVerification": { "message": "Провера уређаја" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Нема колекције" }, - "canView": { - "message": "Може прегледати" - }, - "canViewExceptPass": { - "message": "Може видетим осим лозинке" - }, - "canEdit": { - "message": "Може уређивати" - }, - "canEditExceptPass": { - "message": "Ноже уређивати осим лозинке" - }, "noCollectionsAdded": { "message": "Ниједна колекција додата" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Домен алијаса" - }, "alreadyHaveAccount": { "message": "Већ имате налог?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "Немате приступ за управљање овом колекцијом." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Фале дозволе „Може да управља“" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Додатје дозволе „Може да управља“ да би се омогућило потпуно управљање наплатом укључујући брисање колекције." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Одобрите групама или члановима приступ овој колекцији." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Кôд дескриптора" }, + "cannotRemoveViewOnlyCollections": { + "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Важно обавештење" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index bcac281eaeb..d5971d50c10 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Urеdi fasciklu" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Osnovni domen", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "npr.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Pošalji" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regeneriši lozinku" - }, "length": { "message": "Dužina" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Upravljaj" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index b33e455bb9c..b7762e4c4dc 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Redigera mapp" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Basdomän", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Objektnamn" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "t.ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Inloggning påbörjad" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Skicka" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "En avisering har skickats till din enhet." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Undvik tvetydiga tecken", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Återskapa lösenord" - }, "length": { "message": "Längd" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Hantera" }, - "canManage": { - "message": "Kan hantera" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Stäng av" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Det gick inte att läsa säkerhetsnyckeln. Försök igen." }, - "twoFactorWebAuthnWarning": { - "message": "På grund av plattformsbegränsningar kan WebAuthn inte användas i alla Bitwarden-applikationer. Du bör aktivera en annan metod för tvåstegsverifiering så att du kan komma åt ditt konto när WebAuthn inte kan användas. Plattformar som stöds:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Webbvalvet och webbläsartillägg på en stationär eller bärbar dator med en WebAuthn-aktiverad webbläsare (Chrome, Opera, Vivaldi eller Firefox med FIDO U2F aktiverat)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Din återställningskod för tvåstegsverifiering" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Ange minimikrav för lösenordsgeneratorn." }, - "passwordGeneratorPolicyInEffect": { - "message": "En eller flera organisationspolicyer påverkar dina generatorinställningar." - }, "masterPasswordPolicyInEffect": { "message": "En eller flera organisationspolicyer kräver att ditt huvudlösenord uppfyller följande krav:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Vad skulle du vilja generera?" - }, - "passwordType": { - "message": "Lösenordstyp" - }, - "regenerateUsername": { - "message": "Återskapa användarnamn" - }, "generateUsername": { "message": "Generera användarnamn" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Användarnamnstyp" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Värdnamn", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API-åtkomsttoken" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Ingen samling" }, - "canView": { - "message": "Kan visa" - }, - "canViewExceptPass": { - "message": "Kan visa, utom lösenord" - }, - "canEdit": { - "message": "Kan redigera" - }, - "canEditExceptPass": { - "message": "Kan redigera, utom lösenord" - }, "noCollectionsAdded": { "message": "Ingen samlingar lades till" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Aliasdomän" - }, "alreadyHaveAccount": { "message": "Har du redan ett konto?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Ge grupper eller medlemmar tillgång till denna samling." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 3b8d147b95f..7e6f614b9c8 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Base domain", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "ex.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Submit" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 8136d1f9cc9..e906b3abfd1 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "แก้​ไข​โฟลเดอร์" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "โดเมนพื้นฐาน", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Item name" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "เช่น", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "ส่ง" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Version $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Regenerate password" - }, "length": { "message": "Length" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Manage" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Turn off" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Generator", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias domain" - }, "alreadyHaveAccount": { "message": "Already have an account?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 0ea5e52fd3d..b9db895499f 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Klasörü düzenle" }, + "newFolder": { + "message": "Yeni klasör" + }, + "folderName": { + "message": "Klasör adı" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "deleteFolderPermanently": { + "message": "Bu klasörü kalıcı olarak silmek istediğinizden emin misiniz?" + }, "baseDomain": { "message": "Ana alan adı", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Kayıt adı" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "örn.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Giriş başlatıldı" }, + "logInRequestSent": { + "message": "İstek gönderildi" + }, "submit": { "message": "Gönder" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Cihazınıza bir bildirim gönderildi." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Hesabınıza erişmeye mi çalışıyorsunuz?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ erişim denemesi", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Erişimi onayla" + }, + "denyAccess": { + "message": "Erişimi reddet" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Cihazınıza bir bildirim gönderildi" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Lütfen hesabınızın kilidinin açık olduğundan ve parmak izi ifadesinin diğer cihazla eşleştiğinden emin olun" - }, "versionNumber": { "message": "Sürüm $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Okurken karışabilecek karakterleri kullanma", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Yeni parola oluştur" - }, "length": { "message": "Uzunluk" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Yönet" }, - "canManage": { - "message": "Yönetebilir" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Devre dışı bırak" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Güvenlik anahtarını okurken bir sorun oluştu. Tekrar deneyin." }, - "twoFactorWebAuthnWarning": { - "message": "Platform sınırlamaları nedeniyle WebAuthn tüm Bitwarden uygulamalarında kullanılamaz. WebAuthn kullanılamadığında hesabınıza erişebilmek için başka bir iki aşamalı doğrulama yöntemi ayarlamanız gerekir. Desteklenen platformlar:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn uyumlu bir tarayıcıya (FIDO U2F uyumlu Chrome, Opera, Vivaldi veya Firefox) sahip bir bilgisayardaki tarayıcı uzantıları." + "twoFactorWebAuthnWarning1": { + "message": "Platform sınırlamaları nedeniyle WebAuthn tüm Bitwarden uygulamalarında kullanılamaz. WebAuthn kullanılamadığında hesabınıza erişebilmek için başka bir iki aşamalı doğrulama yöntemi ayarlamanız gerekir." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden iki aşamalı giriş kurtarma kodunuz" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Parola üreticisi gereksinimleri ayarlayın." }, - "passwordGeneratorPolicyInEffect": { - "message": "Bir ya da daha fazla kuruluş ilkesi, oluşturucu ayarlarınızı etkiliyor." - }, "masterPasswordPolicyInEffect": { "message": "Bir veya daha fazla kuruluş ilkesi gereğince ana parolanız aşağıdaki gereksinimleri karşılamalıdır:" }, @@ -6681,15 +6717,6 @@ "message": "Oluşturucu", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Ne oluşturmak istersiniz?" - }, - "passwordType": { - "message": "Parola türü" - }, - "regenerateUsername": { - "message": "Kullanıcı adını yeniden oluştur" - }, "generateUsername": { "message": "Kullanıcı adı oluştur" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Kullanıcı adı türü" - }, "plusAddressedEmail": { "message": "Artı adresli e-posta", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Sunucu", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API erişim token'ı" - }, "deviceVerification": { "message": "Cihaz doğrulama" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Koleksiyon yok" }, - "canView": { - "message": "Görüntüleyebilir" - }, - "canViewExceptPass": { - "message": "Parolalar hariç görüntüleyebilir" - }, - "canEdit": { - "message": "Düzenleyebilir" - }, - "canEditExceptPass": { - "message": "Parolalar hariç düzenleyebilir" - }, "noCollectionsAdded": { "message": "Hiç koleksiyon eklenmedi" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Alias alan adı" - }, "alreadyHaveAccount": { "message": "Zaten hesabınız var mı?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Gruplara veya üyelere bu koleksiyona erişim izni verin." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Önemli uyarı" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 07a8f8893cd..a72ecdc77f7 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Редагування" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Основний домен", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Назва запису" }, - "cannotRemoveViewOnlyCollections": { - "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "зразок", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Ініційовано вхід" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Відправити" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Сповіщення було надіслано на ваш пристрій." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "Сповіщення надіслано на ваш пристрій" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Переконайтеся, що ваш обліковий запис розблоковано і фраза відбитка на іншому пристрої збігається" - }, "versionNumber": { "message": "Версія $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Уникати неоднозначних символів", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Генерувати новий" - }, "length": { "message": "Довжина" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Керувати" }, - "canManage": { - "message": "Може керувати" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Вимкнути" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "Сталася проблема при читанні ключа безпеки. Спробуйте знову." }, - "twoFactorWebAuthnWarning": { - "message": "У зв'язку з обмеженнями платформи, WebAuthn не можна використовувати в усіх програмах Bitwarden. Вам слід активувати іншого провайдера двоетапної перевірки, щоб мати змогу отримати доступ до свого облікового запису, коли неможливо скористатися WebAuthn. Підтримувані платформи:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Вебсховище і розширення браузера на комп'ютерах і ноутбуках з браузерами, що мають підтримку WebAuthn (Chrome, Opera, Vivaldi, або Firefox з увімкненим FIDO U2F)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Ваш код відновлення двоетапної перевірки Bitwarden" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Встановити вимоги для генерування пароля." }, - "passwordGeneratorPolicyInEffect": { - "message": "На параметри генератора впливають одна чи декілька політик організації." - }, "masterPasswordPolicyInEffect": { "message": "Політика однієї або декількох організацій зобов'язує дотримання таких вимог для головного пароля:" }, @@ -6681,15 +6717,6 @@ "message": "Генератор", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "Що ви бажаєте згенерувати?" - }, - "passwordType": { - "message": "Тип пароля" - }, - "regenerateUsername": { - "message": "Повторно генерувати ім'я користувача" - }, "generateUsername": { "message": "Генерувати ім'я користувача" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Тип імені користувача" - }, "plusAddressedEmail": { "message": "Адреса е-пошти з плюсом", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Ім'я вузла", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "Токен доступу до API" - }, "deviceVerification": { "message": "Перевірка пристрою" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "Немає збірки" }, - "canView": { - "message": "Може переглядати" - }, - "canViewExceptPass": { - "message": "Може переглядати, крім паролів" - }, - "canEdit": { - "message": "Може редагувати" - }, - "canEditExceptPass": { - "message": "Може редагувати, крім паролів" - }, "noCollectionsAdded": { "message": "Не додано жодної збірки" }, @@ -8677,9 +8686,6 @@ "message": "URL-адреса власного сервера", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Псевдонім домену" - }, "alreadyHaveAccount": { "message": "Вже маєте обліковий запис?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "У вас немає доступу до керування цією збіркою." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Немає дозволу \"Може керувати\"" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Надайте дозвіл \"Може керувати\" для можливості повноцінного керування збірками, включно з видаленням." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Надайте групам або учасникам доступ до цієї збірки." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Код дескриптора" }, + "cannotRemoveViewOnlyCollections": { + "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Важлива інформація" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 834a8db5e7a..4b7ce90344a 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "Chỉnh sửa thư mục" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "Tên miền cơ sở", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "Tên mục" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "vd.", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "Log in initiated" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "Gửi" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "Một thông báo đã được gửi đến thiết bị của bạn." }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "A notification was sent to your device" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "Phiên bản $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "Tạo lại mật khẩu" - }, "length": { "message": "Độ dài" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "Quản lý" }, - "canManage": { - "message": "Can manage" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "Vô hiệu hoá" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, - "twoFactorWebAuthnWarning": { - "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. Supported platforms:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." + "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." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." }, - "passwordGeneratorPolicyInEffect": { - "message": "Các chính sách của tổ chức đang ảnh hưởng đến cài đặt tạo mật khẩu của bạn." - }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -6681,15 +6717,6 @@ "message": "Trình tạo", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" - }, - "passwordType": { - "message": "Password type" - }, - "regenerateUsername": { - "message": "Regenerate username" - }, "generateUsername": { "message": "Generate username" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "Username type" - }, "plusAddressedEmail": { "message": "Địa chỉ email có hậu tố", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "Hostname", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API access token" - }, "deviceVerification": { "message": "Device verification" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "No collection" }, - "canView": { - "message": "Can view" - }, - "canViewExceptPass": { - "message": "Can view, except passwords" - }, - "canEdit": { - "message": "Can edit" - }, - "canEditExceptPass": { - "message": "Can edit, except passwords" - }, "noCollectionsAdded": { "message": "No collections added" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "Tên miền thay thế" - }, "alreadyHaveAccount": { "message": "Bạn đã có tài khoản?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 8167d2063b7..afd675f5fa4 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -199,7 +199,7 @@ "message": "备注" }, "note": { - "message": "备注" + "message": "笔记" }, "customFields": { "message": "自定义字段" @@ -254,7 +254,7 @@ } }, "websiteAdded": { - "message": "网址已添加" + "message": "网站已添加" }, "addWebsite": { "message": "添加网站" @@ -464,6 +464,18 @@ "editFolder": { "message": "编辑文件夹" }, + "newFolder": { + "message": "新增文件夹" + }, + "folderName": { + "message": "文件夹名称" + }, + "folderHintText": { + "message": "通过在父文件夹名后面添加「/」来嵌套文件夹。示例:Social/Forums" + }, + "deleteFolderPermanently": { + "message": "您确定要永久删除这个文件夹吗?" + }, "baseDomain": { "message": "基础域", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "项目名称" }, - "cannotRemoveViewOnlyCollections": { - "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "例如", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "登录已发起" }, + "logInRequestSent": { + "message": "请求已发送" + }, "submit": { "message": "提交" }, @@ -1213,7 +1219,7 @@ "message": "主密码提示(可选)" }, "newMasterPassHint": { - "message": "新的主密码提示(可选)" + "message": "新主密码提示(可选)" }, "masterPassHintLabel": { "message": "主密码提示" @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "通知已发送到您的设备。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "您正在尝试访问您的账户吗?" + }, + "accessAttemptBy": { + "message": "$EMAIL$ 的访问尝试", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "确认访问" + }, + "denyAccess": { + "message": "拒绝访问" + }, + "notificationSentDeviceAnchor": { + "message": "网页 App" + }, + "notificationSentDevicePart2": { + "message": "在批准前,请确保指纹短语与下面的一致。" + }, + "notificationSentDeviceComplete": { + "message": "在您的设备上解锁 Bitwarden。在批准前,请确保指纹短语与下面的一致。" + }, "aNotificationWasSentToYourDevice": { "message": "通知已发送到您的设备" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "确保您的账户已解锁,并且指纹短语与其他设备上的相匹配。" - }, "versionNumber": { "message": "版本: $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "避免易混淆的字符", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "重新生成密码" - }, "length": { "message": "长度" }, @@ -1743,7 +1773,7 @@ "message": "继续操作将更改您的账户电子邮箱地址。这不会更改用于双重身份验证的电子邮箱地址。您可以在两步登录设置中更改它。" }, "newEmail": { - "message": "新的电子邮箱" + "message": "新电子邮箱" }, "code": { "message": "代码" @@ -1849,25 +1879,25 @@ "message": "继续操作还将使您退出当前会话,并要求您重新登录。如果有设置两步登录,也需要重新验证。其他设备上的活动会话可能会继续保持活动状态长达一小时。" }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "新设备登录" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "关闭新设备登录保护" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "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": "已取消所有会话授权" @@ -2170,8 +2200,20 @@ "manage": { "message": "管理" }, - "canManage": { - "message": "可以管理" + "manageCollection": { + "message": "管理集合" + }, + "viewItems": { + "message": "查看项目" + }, + "viewItemsHidePass": { + "message": "查看项目,隐藏密码" + }, + "editItems": { + "message": "编辑项目" + }, + "editItemsHidePass": { + "message": "编辑项目,隐藏密码" }, "disable": { "message": "停用" @@ -2279,7 +2321,7 @@ } }, "webAuthnkeyX": { - "message": "WebAuthn 密钥 $INDEX$", + "message": "WebAuthn 钥匙 $INDEX$", "placeholders": { "index": { "content": "$1", @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "读取安全钥匙时出现问题,请重试。" }, - "twoFactorWebAuthnWarning": { - "message": "由于平台限制,WebAuthn 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在 WebAuthn 无法使用时可以访问您的账户。支持的平台有:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "桌面/笔记本电脑上支持 WebAuthn 的浏览器(启用了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)中的网页密码库和浏览器扩展。" + "twoFactorWebAuthnWarning1": { + "message": "由于平台限制,WebAuthn 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 WebAuthn 时可以访问您的账户。" }, "twoFactorRecoveryYourCode": { "message": "您的 Bitwarden 两步登录恢复代码" @@ -2644,7 +2683,7 @@ "message": "请确保您的账户有足够的信用额度来用于此购买。如果您的账户信用额度不足,您的默认付款方式将用于补足差额。您可以从「计费」页面向您的账户添加信用额度。" }, "creditAppliedDesc": { - "message": "您账户的信用额度可用于进行消费。任何可用的信用额度将用于自动支付此账户的账单。" + "message": "您账户的信用额度可用于进行消费。任何可用的信用额度将用于自动抵扣此账户的账单。" }, "goPremium": { "message": "升级高级会员", @@ -2920,7 +2959,7 @@ "description": "Noun. A refunded payment that was charged." }, "chargesStatement": { - "message": "任何费用将在您的对账单上以 $STATEMENT_NAME$ 显示。", + "message": "任何费用将以 $STATEMENT_NAME$ 出现在您的账单上。", "placeholders": { "statement_name": { "content": "$1", @@ -2938,7 +2977,7 @@ "message": "添加存储空间将会调整计费总金额,并立即通过您的付款方式进行扣款。第一笔费用将按当前计费周期的剩余时间按比例分配。" }, "storageRemoveNote": { - "message": "移除存储空间将会调整计费总金额,这笔费用将按比例返回下一笔账单费用中。" + "message": "移除存储空间将会调整计费总金额,这笔调整费用将按比例作为信用额度抵扣您的下一笔账单费用。" }, "adjustedStorage": { "message": "已调整 $AMOUNT$ GB 的存储空间。", @@ -3435,7 +3474,7 @@ "message": "更改了帐户密码" }, "enabledUpdated2fa": { - "message": "保存了两步登录" + "message": "两步登录已保存" }, "disabled2fa": { "message": "停用了两步登录" @@ -3796,7 +3835,7 @@ } }, "unlinkedSso": { - "message": "未链接 SSO。" + "message": "取消链接 SSO。" }, "unlinkedSsoUser": { "message": "为用户 $ID$ 取消链接 SSO。", @@ -4410,7 +4449,7 @@ "message": "添加用户席位将会调整计费总金额,并立即通过您的付款方式进行扣款。第一笔费用将按当前计费周期的剩余时间按比例分配。" }, "seatsRemoveNote": { - "message": "移除用户席位将会调整计费总金额,这笔费用将按比例返回下一笔账单费用中。" + "message": "移除用户席位将会调整计费总金额,这笔调整费用将按比例作为信用额度抵扣您的下一笔账单费用。" }, "adjustedSeats": { "message": "调整了 $AMOUNT$ 个用户席位。", @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "设置密码生成器要求。" }, - "passwordGeneratorPolicyInEffect": { - "message": "一个或多个组织策略正在影响您的生成器设置。" - }, "masterPasswordPolicyInEffect": { "message": "一个或多个组织策略要求您的主密码满足以下要求:" }, @@ -5144,7 +5180,7 @@ "message": "添加紧急联系人" }, "designatedEmergencyContacts": { - "message": "已指定为紧急联系人" + "message": "指定为紧急联系人" }, "noGrantedAccess": { "message": "您尚未被任何人指定为紧急联系人。" @@ -5504,7 +5540,7 @@ "message": "发送请求" }, "addANote": { - "message": "添加备注" + "message": "添加笔记" }, "bitwardenSecretsManager": { "message": "Bitwarden 机密管理器" @@ -6226,7 +6262,7 @@ "message": "链接已失效。请让赞助方重新发送邀请。" }, "reclaimedFreePlan": { - "message": "重新认领免费计划" + "message": "重新申领免费计划" }, "redeem": { "message": "兑换" @@ -6681,15 +6717,6 @@ "message": "生成器", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "您想要生成什么?" - }, - "passwordType": { - "message": "密码类型" - }, - "regenerateUsername": { - "message": "重新生成用户名" - }, "generateUsername": { "message": "生成用户名" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "用户名类型" - }, "plusAddressedEmail": { "message": "附加地址电子邮箱", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6747,7 +6771,7 @@ "message": "使用您的域名配置的 Catch-all 收件箱。" }, "useThisEmail": { - "message": "Use this email" + "message": "使用此电子邮箱" }, "random": { "message": "随机", @@ -6952,9 +6976,6 @@ "message": "主机名", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API 访问令牌" - }, "deviceVerification": { "message": "设备验证" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "没有集合" }, - "canView": { - "message": "可以查看" - }, - "canViewExceptPass": { - "message": "除密码外,可以查看" - }, - "canEdit": { - "message": "可以编辑" - }, - "canEditExceptPass": { - "message": "除密码外,可以编辑" - }, "noCollectionsAdded": { "message": "未添加任何集合" }, @@ -8338,7 +8347,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", @@ -8620,13 +8629,13 @@ "message": "管理组织的集合行为" }, "limitCollectionCreationDesc": { - "message": "限制为仅所有者和管理员可以创建集合" + "message": "限制为所有者和管理员可以创建集合" }, "limitCollectionDeletionDesc": { - "message": "限制为仅所有者和管理员可以删除集合" + "message": "限制为所有者和管理员可以删除集合" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "限制为拥有「可以管理」权限的成员可以删除项目" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "所有者和管理员可以管理所有集合和项目" @@ -8677,9 +8686,6 @@ "message": "自托管服务器 URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "别名域" - }, "alreadyHaveAccount": { "message": "已经拥有账户了吗?" }, @@ -8690,7 +8696,7 @@ "message": "跳转到内容" }, "managePermissionRequired": { - "message": "必须至少有一个成员或群组拥有「可以管理」的权限。" + "message": "必须至少有一个成员或群组拥有「可以管理」权限。" }, "typePasskey": { "message": "通行密钥" @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "您没有管理此集合的权限。" }, - "grantAddAccessCollectionWarningTitle": { - "message": "缺少「可以管理」权限" + "grantManageCollectionWarningTitle": { + "message": "缺少「管理集合」权限" }, - "grantAddAccessCollectionWarning": { - "message": "授予「可以管理」权限以允许完整的集合管理,包括删除集合。" + "grantManageCollectionWarning": { + "message": "授予「管理集合」权限以允许完整的集合管理,包括删除集合。" }, "grantCollectionAccess": { "message": "授予群组或成员对此集合的访问权限。" @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "描述符代码" }, + "cannotRemoveViewOnlyCollections": { + "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "重要通知" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "管理员现在可以删除已声明域名下的成员账户。" + }, + "deleteManagedUserWarningDesc": { + "message": "此操作将删除成员账户及其密码库中的所有项目。其取代了之前的「移除」操作。" + }, + "deleteManagedUserWarning": { + "message": "「删除」是一个新的操作!" + }, + "seatsRemaining": { + "message": "该组织已分配 $TOTAL$ 个席位,您还剩余 $REMAINING$ 个席位。请联系提供商管理您的订阅。", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "现有组织" + }, + "selectOrganizationProviderPortal": { + "message": "选择一个要添加到您的提供商门户的组织。" + }, + "noOrganizations": { + "message": "没有可列出的组织" + }, + "yourProviderSubscriptionCredit": { + "message": "您的提供商订阅将获得此组织订阅剩余时间内的信用额度。" + }, + "doYouWantToAddThisOrg": { + "message": "您想将该组织添加到 $PROVIDER$ 吗?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "添加了现有组织" + }, + "assignedExceedsAvailable": { + "message": "分配的席位超过可用席位。" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 9087f640fcf..fc1bf0b63f1 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -464,6 +464,18 @@ "editFolder": { "message": "編輯資料夾" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "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?" + }, "baseDomain": { "message": "基底網域", "description": "Domain name. Example: website.com" @@ -728,15 +740,6 @@ "itemName": { "message": "項目名" }, - "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", - "placeholders": { - "collections": { - "content": "$1", - "example": "Work, Personal" - } - } - }, "ex": { "message": "例如", "description": "Short abbreviation for 'example'." @@ -1182,6 +1185,9 @@ "logInInitiated": { "message": "登入已發起" }, + "logInRequestSent": { + "message": "Request sent" + }, "submit": { "message": "送出" }, @@ -1371,12 +1377,39 @@ "notificationSentDevice": { "message": "通知已傳送至您的裝置。" }, + "notificationSentDevicePart1": { + "message": "Unlock Bitwarden on your device or on the " + }, + "areYouTryingToAccessYourAccount": { + "message": "Are you trying to access your account?" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "notificationSentDeviceAnchor": { + "message": "web app" + }, + "notificationSentDevicePart2": { + "message": "Make sure the Fingerprint phrase matches the one below before approving." + }, + "notificationSentDeviceComplete": { + "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + }, "aNotificationWasSentToYourDevice": { "message": "已傳送通知至您的裝置" }, - "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { - "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" - }, "versionNumber": { "message": "版本 $VERSION_NUMBER$", "placeholders": { @@ -1664,9 +1697,6 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, - "regeneratePassword": { - "message": "重新產生密碼" - }, "length": { "message": "長度" }, @@ -2170,8 +2200,20 @@ "manage": { "message": "管理" }, - "canManage": { - "message": "可以管理" + "manageCollection": { + "message": "Manage collection" + }, + "viewItems": { + "message": "View items" + }, + "viewItemsHidePass": { + "message": "View items, hidden passwords" + }, + "editItems": { + "message": "Edit items" + }, + "editItemsHidePass": { + "message": "Edit items, hidden passwords" }, "disable": { "message": "停用" @@ -2368,11 +2410,8 @@ "twoFactorU2fProblemReadingTryAgain": { "message": "讀取安全鑰匙時發生問題。請再試一次。" }, - "twoFactorWebAuthnWarning": { - "message": "由於平台限制,無法於所有 Bitwarden 應用程式中使用 WebAuthn。請設定另一套兩步驟登入方式,以確保在 WebAuthn 無法使用時還能存取您的帳戶。支援的平台有:" - }, - "twoFactorWebAuthnSupportWeb": { - "message": "桌上型電腦/筆記型電腦上支援 WebAuthn 功能的瀏覽器(啟用了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)上的網頁版密碼庫和瀏覽器擴充套件。" + "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." }, "twoFactorRecoveryYourCode": { "message": "您的 Bitwarden 兩步驟登入復原碼" @@ -4710,9 +4749,6 @@ "passwordGeneratorPolicyDesc": { "message": "設定密碼產生器要求。" }, - "passwordGeneratorPolicyInEffect": { - "message": "一個或多個組織原則正影響密碼產生器設定。" - }, "masterPasswordPolicyInEffect": { "message": "一個或多個組織原則要求您的主密碼須符合下列條件:" }, @@ -6681,15 +6717,6 @@ "message": "產生器", "description": "Short for 'credential generator'." }, - "whatWouldYouLikeToGenerate": { - "message": "您想要產生什麼?" - }, - "passwordType": { - "message": "密碼類型" - }, - "regenerateUsername": { - "message": "重新產生使用者名稱" - }, "generateUsername": { "message": "產生使用者名稱" }, @@ -6730,9 +6757,6 @@ } } }, - "usernameType": { - "message": "使用者名稱類型" - }, "plusAddressedEmail": { "message": "加號地址電子郵件", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" @@ -6952,9 +6976,6 @@ "message": "主機名稱", "description": "Part of a URL." }, - "apiAccessToken": { - "message": "API 存取權杖" - }, "deviceVerification": { "message": "裝置驗證" }, @@ -7666,18 +7687,6 @@ "noCollection": { "message": "沒有分類" }, - "canView": { - "message": "可以檢視" - }, - "canViewExceptPass": { - "message": "可以檢視(除了密碼)" - }, - "canEdit": { - "message": "可以編輯" - }, - "canEditExceptPass": { - "message": "可以編輯(除了密碼)" - }, "noCollectionsAdded": { "message": "未新增任何分類" }, @@ -8677,9 +8686,6 @@ "message": "Self-host server URL", "description": "Label for field requesting a self-hosted integration service URL" }, - "aliasDomain": { - "message": "別名網域" - }, "alreadyHaveAccount": { "message": "已經有一個帳戶了嗎?" }, @@ -8741,11 +8747,11 @@ "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." }, - "grantAddAccessCollectionWarningTitle": { - "message": "Missing Can Manage Permissions" + "grantManageCollectionWarningTitle": { + "message": "Missing Manage Collection Permissions" }, - "grantAddAccessCollectionWarning": { - "message": "Grant Can manage permissions to allow full collection management including deletion of collection." + "grantManageCollectionWarning": { + "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." }, "grantCollectionAccess": { "message": "Grant groups or members access to this collection." @@ -10091,6 +10097,15 @@ "descriptorCode": { "message": "Descriptor code" }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, "importantNotice": { "message": "Important notice" }, @@ -10281,5 +10296,54 @@ "example": "Acme c" } } + }, + "accountDeprovisioningNotification": { + "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + }, + "deleteManagedUserWarningDesc": { + "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!" + }, + "seatsRemaining": { + "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "placeholders": { + "remaining": { + "content": "$1", + "example": "5" + }, + "total": { + "content": "$2", + "example": "10" + } + } + }, + "existingOrganization": { + "message": "Existing organization" + }, + "selectOrganizationProviderPortal": { + "message": "Select an organization to add to your Provider Portal." + }, + "noOrganizations": { + "message": "There are no organizations to list" + }, + "yourProviderSubscriptionCredit": { + "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + }, + "doYouWantToAddThisOrg": { + "message": "Do you want to add this organization to $PROVIDER$?", + "placeholders": { + "provider": { + "content": "$1", + "example": "Cool MSP" + } + } + }, + "addedExistingOrganization": { + "message": "Added existing organization" + }, + "assignedExceedsAvailable": { + "message": "Assigned seats exceed available seats." } } diff --git a/apps/web/src/scss/pages.scss b/apps/web/src/scss/pages.scss index 684d45a1a66..1e5c233e326 100644 --- a/apps/web/src/scss/pages.scss +++ b/apps/web/src/scss/pages.scss @@ -1,37 +1,3 @@ -app-generator { - #lengthRange { - width: 100%; - } - - .card-generated { - .card-body { - @include themify($themes) { - background: themed("foregroundColor"); - } - align-items: center; - display: flex; - flex-wrap: wrap; - font-family: $font-family-monospace; - font-size: $font-size-lg; - justify-content: center; - text-align: center; - } - } -} - -app-password-generator-history { - .list-group-item { - line-height: 1; - @include themify($themes) { - background: themed("backgroundColor"); - } - - .password { - font-family: $font-family-monospace; - } - } -} - tools-import { textarea { height: 150px; diff --git a/apps/web/tsconfig.build.json b/apps/web/tsconfig.build.json index b10c4f9d899..39ab37efbb8 100644 --- a/apps/web/tsconfig.build.json +++ b/apps/web/tsconfig.build.json @@ -1,5 +1,8 @@ { "extends": "./tsconfig.json", "files": ["src/polyfills.ts", "src/main.ts", "src/theme.ts"], - "include": ["src/connectors/*.ts", "../../libs/common/src/platform/services/**/*.worker.ts"] + "include": [ + "src/connectors/*.ts", + "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts" + ] } diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index aad88546211..68ac8c80085 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -19,7 +19,7 @@ "@bitwarden/generator-legacy": ["../../libs/tools/generator/extensions/legacy/src"], "@bitwarden/generator-navigation": ["../../libs/tools/generator/extensions/navigation/src"], "@bitwarden/importer-core": ["../../libs/importer/src"], - "@bitwarden/importer/ui": ["../../libs/importer/src/components"], + "@bitwarden/importer-ui": ["../../libs/importer/src/components"], "@bitwarden/key-management": ["../../libs/key-management/src"], "@bitwarden/key-management-ui": ["../../libs/key-management-ui/src"], "@bitwarden/platform": ["../../libs/platform/src"], @@ -43,6 +43,6 @@ "src/connectors/*.ts", "src/**/*.stories.ts", "src/**/*.spec.ts", - "../../libs/common/src/platform/services/**/*.worker.ts" + "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts" ] } diff --git a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.spec.ts b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.spec.ts index e893b2dfe8c..448399a8bb0 100644 --- a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.spec.ts +++ b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.spec.ts @@ -4,8 +4,8 @@ import { OrganizationUserApiService, OrganizationUserResetPasswordDetailsResponse, } from "@bitwarden/admin-console/common"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { KeyService } from "@bitwarden/key-management"; diff --git a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts index 4c4507e5cb8..025b021f83d 100644 --- a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts +++ b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts @@ -4,7 +4,7 @@ import { OrganizationUserApiService, OrganizationUserResetPasswordDetailsResponse, } from "@bitwarden/admin-console/common"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; diff --git a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/critical-apps.service.spec.ts b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/critical-apps.service.spec.ts index 5b89a2abb1e..64f55ccf99f 100644 --- a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/critical-apps.service.spec.ts +++ b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/critical-apps.service.spec.ts @@ -4,7 +4,7 @@ import { fakeAsync, flush } from "@angular/core/testing"; import { mock } from "jest-mock-extended"; import { of } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { CsprngArray } from "@bitwarden/common/types/csprng"; diff --git a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/critical-apps.service.ts b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/critical-apps.service.ts index 00b4dc78dae..7db34757b96 100644 --- a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/critical-apps.service.ts +++ b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/critical-apps.service.ts @@ -13,7 +13,7 @@ import { zip, } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { OrganizationId } from "@bitwarden/common/types/guid"; import { OrgKey } from "@bitwarden/common/types/key"; diff --git a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/risk-insights-data.service.ts b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/risk-insights-data.service.ts index 668fb187251..386c6fd6865 100644 --- a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/risk-insights-data.service.ts +++ b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/risk-insights-data.service.ts @@ -28,6 +28,7 @@ export class RiskInsightsDataService { dataLastUpdated$ = this.dataLastUpdatedSubject.asObservable(); openDrawer = false; + drawerInvokerId: string = ""; activeDrawerType: DrawerType = DrawerType.None; atRiskMemberDetails: AtRiskMemberDetail[] = []; appAtRiskMembers: AppAtRiskMembersDialogParams | null = null; @@ -73,25 +74,35 @@ export class RiskInsightsDataService { return this.activeDrawerType === drawerType; }; - setDrawerForOrgAtRiskMembers = (atRiskMemberDetails: AtRiskMemberDetail[]): void => { + setDrawerForOrgAtRiskMembers = ( + atRiskMemberDetails: AtRiskMemberDetail[], + invokerId: string = "", + ): void => { this.resetDrawer(DrawerType.OrgAtRiskMembers); this.activeDrawerType = DrawerType.OrgAtRiskMembers; + this.drawerInvokerId = invokerId; this.atRiskMemberDetails = atRiskMemberDetails; this.openDrawer = !this.openDrawer; }; setDrawerForAppAtRiskMembers = ( atRiskMembersDialogParams: AppAtRiskMembersDialogParams, + invokerId: string = "", ): void => { this.resetDrawer(DrawerType.None); this.activeDrawerType = DrawerType.AppAtRiskMembers; + this.drawerInvokerId = invokerId; this.appAtRiskMembers = atRiskMembersDialogParams; this.openDrawer = !this.openDrawer; }; - setDrawerForOrgAtRiskApps = (atRiskApps: AtRiskApplicationDetail[]): void => { + setDrawerForOrgAtRiskApps = ( + atRiskApps: AtRiskApplicationDetail[], + invokerId: string = "", + ): void => { this.resetDrawer(DrawerType.OrgAtRiskApps); this.activeDrawerType = DrawerType.OrgAtRiskApps; + this.drawerInvokerId = invokerId; this.atRiskAppDetails = atRiskApps; this.openDrawer = !this.openDrawer; }; @@ -109,5 +120,6 @@ export class RiskInsightsDataService { this.atRiskMemberDetails = []; this.appAtRiskMembers = null; this.atRiskAppDetails = null; + this.drawerInvokerId = ""; }; } diff --git a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts index ac8ad3112b9..744cf2c4674 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts @@ -10,8 +10,8 @@ import { OrganizationAuthRequestApiService } from "@bitwarden/bit-common/admin-c import { OrganizationAuthRequestService } from "@bitwarden/bit-common/admin-console/auth-requests/organization-auth-request.service"; import { PendingAuthRequestView } from "@bitwarden/bit-common/admin-console/auth-requests/pending-auth-request.view"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/dialogs/bulk-confirm-dialog.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/dialogs/bulk-confirm-dialog.component.ts index 6ab07cc0794..c5b949512d7 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/dialogs/bulk-confirm-dialog.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/dialogs/bulk-confirm-dialog.component.ts @@ -13,8 +13,8 @@ import { ProviderUserBulkConfirmRequest } from "@bitwarden/common/admin-console/ import { ProviderUserBulkRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-user-bulk.request"; import { ProviderUserBulkPublicKeyResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user-bulk-public-key.response"; import { ProviderUserBulkResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user-bulk.response"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { DialogService } from "@bitwarden/components"; diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts index 16f794bd6d2..03e47569a55 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts @@ -15,8 +15,8 @@ import { ProviderUserStatusType, ProviderUserType } from "@bitwarden/common/admi import { ProviderUserBulkRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-user-bulk.request"; import { ProviderUserConfirmRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-user-confirm.request"; import { ProviderUserUserDetailsResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user.response"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.html b/bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.html index a20dd1379e2..bf82fbd160b 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.html +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.html @@ -37,25 +37,5 @@ > - - {{ "providerClientVaultPrivacyNotification" | i18n }} - - {{ "contactBitwardenSupport" | i18n }} . - diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.ts index 3f1a7ff3989..7e47da95e2b 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.ts @@ -10,27 +10,15 @@ import { JslibModule } from "@bitwarden/angular/jslib.module"; import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service"; import { ProviderStatusType } from "@bitwarden/common/admin-console/enums"; import { Provider } from "@bitwarden/common/admin-console/models/domain/provider"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { BannerModule, IconModule, LinkModule } from "@bitwarden/components"; +import { IconModule } from "@bitwarden/components"; import { ProviderPortalLogo } from "@bitwarden/web-vault/app/admin-console/icons/provider-portal-logo"; import { WebLayoutModule } from "@bitwarden/web-vault/app/layouts/web-layout.module"; -import { ProviderClientVaultPrivacyBannerService } from "./services/provider-client-vault-privacy-banner.service"; - @Component({ selector: "providers-layout", templateUrl: "providers-layout.component.html", standalone: true, - imports: [ - CommonModule, - RouterModule, - JslibModule, - WebLayoutModule, - IconModule, - LinkModule, - BannerModule, - ], + imports: [CommonModule, RouterModule, JslibModule, WebLayoutModule, IconModule], }) export class ProvidersLayoutComponent implements OnInit, OnDestroy { protected readonly logo = ProviderPortalLogo; @@ -41,15 +29,9 @@ export class ProvidersLayoutComponent implements OnInit, OnDestroy { protected isBillable: Observable; protected canAccessBilling$: Observable; - protected showProviderClientVaultPrivacyWarningBanner$ = this.configService.getFeatureFlag$( - FeatureFlag.ProviderClientVaultPrivacyBanner, - ); - constructor( private route: ActivatedRoute, private providerService: ProviderService, - private configService: ConfigService, - protected providerClientVaultPrivacyBannerService: ProviderClientVaultPrivacyBannerService, ) {} ngOnInit() { diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/services/provider-client-vault-privacy-banner.service.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/services/provider-client-vault-privacy-banner.service.ts deleted file mode 100644 index c347f5c2aae..00000000000 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/services/provider-client-vault-privacy-banner.service.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Injectable } from "@angular/core"; - -import { - StateProvider, - AC_BANNERS_DISMISSED_DISK, - UserKeyDefinition, -} from "@bitwarden/common/platform/state"; - -export const SHOW_BANNER_KEY = new UserKeyDefinition( - AC_BANNERS_DISMISSED_DISK, - "showProviderClientVaultPrivacyBanner", - { - deserializer: (b) => b, - clearOn: [], - }, -); - -/** Displays a banner warning provider users that client organization vaults - * will soon become inaccessible directly. */ -@Injectable({ providedIn: "root" }) -export class ProviderClientVaultPrivacyBannerService { - private _showBanner = this.stateProvider.getActive(SHOW_BANNER_KEY); - - showBanner$ = this._showBanner.state$; - - constructor(private stateProvider: StateProvider) {} - - async hideBanner() { - await this._showBanner.update(() => false); - } -} diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts index 6b9765e9e05..d3482ea67a5 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts @@ -11,7 +11,7 @@ import { ProviderAddOrganizationRequest } from "@bitwarden/common/admin-console/ import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction"; import { PlanType } from "@bitwarden/common/billing/enums"; import { CreateClientOrganizationRequest } from "@bitwarden/common/billing/models/request/create-client-organization.request"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { StateProvider } from "@bitwarden/common/platform/state"; import { OrganizationId } from "@bitwarden/common/types/guid"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts index ee2395b3f83..8c9f894f8f6 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts @@ -4,8 +4,8 @@ import { Injectable } from "@angular/core"; import { Subject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { KeyService } from "@bitwarden/key-management"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts index a3d46d2ef2e..c761d73d4a1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts @@ -1,7 +1,7 @@ import { mock } from "jest-mock-extended"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { KeyService } from "@bitwarden/key-management"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts index 950d3c42ccb..51c49d79f2d 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts @@ -4,7 +4,7 @@ import { Injectable } from "@angular/core"; import { Subject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { KeyService } from "@bitwarden/key-management"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access.service.ts index 8eb4a5120a2..773cb83e70a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access.service.ts @@ -4,8 +4,8 @@ import { Injectable } from "@angular/core"; import { Subject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts index a85f5c5e09a..a56111bc655 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts @@ -4,8 +4,8 @@ import { Injectable } from "@angular/core"; import { Subject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { KeyService } from "@bitwarden/key-management"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts index fb0ab467a02..6b527d56502 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts @@ -1,7 +1,7 @@ import { mock } from "jest-mock-extended"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts index c5934067fd7..c9d63e61400 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts @@ -4,8 +4,8 @@ import { Injectable } from "@angular/core"; import { Subject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { KeyService } from "@bitwarden/key-management"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts index 4ae80d4decc..d6bc807686a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts @@ -3,7 +3,7 @@ import { mock } from "jest-mock-extended"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { CsprngArray } from "@bitwarden/common/types/csprng"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts index 920e12ef0cf..5223135c17a 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts @@ -4,8 +4,8 @@ import { Injectable } from "@angular/core"; import { Subject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { KeyService } from "@bitwarden/key-management"; diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/access-intelligence.module.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/access-intelligence.module.ts index 5f461ff6c49..8b78a7e8975 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/access-intelligence.module.ts +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/access-intelligence.module.ts @@ -10,7 +10,7 @@ import { } from "@bitwarden/bit-common/tools/reports/risk-insights/services"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength/password-strength.service.abstraction"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { KeyService } from "@bitwarden/key-management"; diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html index bcc15fbc8fc..c0eb8080070 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html @@ -27,19 +27,25 @@

{{ "allApplications" | i18n }}

@@ -75,7 +81,11 @@ - + { + showOrgAtRiskMembers = async (invokerId: string) => { const dialogData = this.reportService.generateAtRiskMemberList(this.dataSource.data); - this.dataService.setDrawerForOrgAtRiskMembers(dialogData); + this.dataService.setDrawerForOrgAtRiskMembers(dialogData, invokerId); }; - showOrgAtRiskApps = async () => { + showOrgAtRiskApps = async (invokerId: string) => { const data = this.reportService.generateAtRiskApplicationList(this.dataSource.data); - this.dataService.setDrawerForOrgAtRiskApps(data); + this.dataService.setDrawerForOrgAtRiskApps(data, invokerId); }; onCheckboxChange(applicationName: string, event: Event) { 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 72e60c470b0..4dc4b7ffb1a 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 @@ -35,19 +35,27 @@
@@ -70,7 +78,11 @@ - + diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts index 4d820a3cc66..f1fa38dd28f 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts @@ -131,17 +131,17 @@ export class CriticalApplicationsComponent implements OnInit { ?.atRiskMemberDetails ?? [], applicationName, }; - this.dataService.setDrawerForAppAtRiskMembers(data); + this.dataService.setDrawerForAppAtRiskMembers(data, applicationName); }; - showOrgAtRiskMembers = async () => { + showOrgAtRiskMembers = async (invokerId: string) => { const data = this.reportService.generateAtRiskMemberList(this.dataSource.data); - this.dataService.setDrawerForOrgAtRiskMembers(data); + this.dataService.setDrawerForOrgAtRiskMembers(data, invokerId); }; - showOrgAtRiskApps = async () => { + showOrgAtRiskApps = async (invokerId: string) => { const data = this.reportService.generateAtRiskApplicationList(this.dataSource.data); - this.dataService.setDrawerForOrgAtRiskApps(data); + this.dataService.setDrawerForOrgAtRiskApps(data, invokerId); }; trackByFunction(_: number, item: ApplicationHealthReportDetailWithCriticalFlag) { diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.html index a368f5c0c18..12082e888b0 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.html +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.html @@ -56,7 +56,11 @@ - + { expect(apiService.send).toHaveBeenCalledWith( "POST", `/tasks/${organizationId}/bulk-create`, - tasks, + { tasks }, true, true, ); diff --git a/bitwarden_license/bit-web/src/app/vault/services/default-admin-task.service.ts b/bitwarden_license/bit-web/src/app/vault/services/default-admin-task.service.ts index 442fde9dbf6..520fb744486 100644 --- a/bitwarden_license/bit-web/src/app/vault/services/default-admin-task.service.ts +++ b/bitwarden_license/bit-web/src/app/vault/services/default-admin-task.service.ts @@ -43,6 +43,12 @@ export class DefaultAdminTaskService implements AdminTaskService { organizationId: OrganizationId, tasks: CreateTasksRequest[], ): Promise { - await this.apiService.send("POST", `/tasks/${organizationId}/bulk-create`, tasks, true, true); + await this.apiService.send( + "POST", + `/tasks/${organizationId}/bulk-create`, + { tasks }, + true, + true, + ); } } diff --git a/bitwarden_license/bit-web/tsconfig.build.json b/bitwarden_license/bit-web/tsconfig.build.json index 9bebbeb5061..6313ce27863 100644 --- a/bitwarden_license/bit-web/tsconfig.build.json +++ b/bitwarden_license/bit-web/tsconfig.build.json @@ -9,6 +9,6 @@ ], "include": [ "../../apps/web/src/connectors/*.ts", - "../../libs/common/src/platform/services/**/*.worker.ts" + "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts" ] } diff --git a/bitwarden_license/bit-web/tsconfig.json b/bitwarden_license/bit-web/tsconfig.json index fa286aafc87..82e0b7f57fa 100644 --- a/bitwarden_license/bit-web/tsconfig.json +++ b/bitwarden_license/bit-web/tsconfig.json @@ -22,7 +22,7 @@ ], "@bitwarden/vault-export-ui": ["../../libs/tools/export/vault-export/vault-export-ui/src"], "@bitwarden/importer-core": ["../../libs/importer/src"], - "@bitwarden/importer/ui": ["../../libs/importer/src/components"], + "@bitwarden/importer-ui": ["../../libs/importer/src/components"], "@bitwarden/key-management": ["../../libs/key-management/src"], "@bitwarden/key-management-ui": ["../../libs/key-management-ui/src"], "@bitwarden/platform": ["../../libs/platform/src"], @@ -46,7 +46,7 @@ "../../apps/web/src/connectors/*.ts", "../../apps/web/src/**/*.stories.ts", "../../apps/web/src/**/*.spec.ts", - "../../libs/common/src/platform/services/**/*.worker.ts", + "../../libs/common/src/key-management/crypto/services/encrypt.worker.ts", "src/**/*.stories.ts", "src/**/*.spec.ts" diff --git a/libs/admin-console/src/common/collections/services/default-collection-admin.service.ts b/libs/admin-console/src/common/collections/services/default-collection-admin.service.ts index 6aafbaf4678..890353d9039 100644 --- a/libs/admin-console/src/common/collections/services/default-collection-admin.service.ts +++ b/libs/admin-console/src/common/collections/services/default-collection-admin.service.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { KeyService } from "@bitwarden/key-management"; diff --git a/libs/admin-console/src/common/collections/services/default-collection.service.spec.ts b/libs/admin-console/src/common/collections/services/default-collection.service.spec.ts index a230a20b2e3..7fe81ade4d2 100644 --- a/libs/admin-console/src/common/collections/services/default-collection.service.spec.ts +++ b/libs/admin-console/src/common/collections/services/default-collection.service.spec.ts @@ -1,7 +1,7 @@ import { mock } from "jest-mock-extended"; import { firstValueFrom, of } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/libs/admin-console/src/common/collections/services/default-collection.service.ts b/libs/admin-console/src/common/collections/services/default-collection.service.ts index 4070c92f27c..da50a25886e 100644 --- a/libs/admin-console/src/common/collections/services/default-collection.service.ts +++ b/libs/admin-console/src/common/collections/services/default-collection.service.ts @@ -3,7 +3,7 @@ import { combineLatest, firstValueFrom, map, Observable, of, switchMap } from "rxjs"; import { Jsonify } from "type-fest"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { diff --git a/libs/admin-console/src/common/collections/services/default-vnext-collection.service.spec.ts b/libs/admin-console/src/common/collections/services/default-vnext-collection.service.spec.ts index 048a4733948..9700fcb695a 100644 --- a/libs/admin-console/src/common/collections/services/default-vnext-collection.service.spec.ts +++ b/libs/admin-console/src/common/collections/services/default-vnext-collection.service.spec.ts @@ -1,7 +1,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { first, firstValueFrom, of, ReplaySubject, takeWhile } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/libs/admin-console/src/common/collections/services/default-vnext-collection.service.ts b/libs/admin-console/src/common/collections/services/default-vnext-collection.service.ts index 2d5a083592b..0ef8ae99ab3 100644 --- a/libs/admin-console/src/common/collections/services/default-vnext-collection.service.ts +++ b/libs/admin-console/src/common/collections/services/default-vnext-collection.service.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { combineLatest, filter, firstValueFrom, map } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { StateProvider, DerivedState } from "@bitwarden/common/platform/state"; diff --git a/libs/angular/src/auth/components/set-password.component.ts b/libs/angular/src/auth/components/set-password.component.ts index 70c103d972e..de079a7ebca 100644 --- a/libs/angular/src/auth/components/set-password.component.ts +++ b/libs/angular/src/auth/components/set-password.component.ts @@ -21,8 +21,8 @@ import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { SetPasswordRequest } from "@bitwarden/common/auth/models/request/set-password.request"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; diff --git a/libs/angular/src/auth/components/sso.component.ts b/libs/angular/src/auth/components/sso.component.ts index d0fc2140f06..5f5e53d8efe 100644 --- a/libs/angular/src/auth/components/sso.component.ts +++ b/libs/angular/src/auth/components/sso.component.ts @@ -1,7 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Directive, OnInit } from "@angular/core"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { ActivatedRoute, NavigationExtras, Router } from "@angular/router"; import { firstValueFrom } from "rxjs"; import { first } from "rxjs/operators"; @@ -28,7 +27,6 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { UserId } from "@bitwarden/common/types/guid"; import { ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; @@ -57,7 +55,6 @@ export class SsoComponent implements OnInit { protected redirectUri: string; protected state: string; protected codeChallenge: string; - protected activeUserId: UserId; constructor( protected ssoLoginService: SsoLoginServiceAbstraction, @@ -77,11 +74,7 @@ export class SsoComponent implements OnInit { protected masterPasswordService: InternalMasterPasswordServiceAbstraction, protected accountService: AccountService, protected toastService: ToastService, - ) { - this.accountService.activeAccount$.pipe(takeUntilDestroyed()).subscribe((account) => { - this.activeUserId = account?.id; - }); - } + ) {} async ngOnInit() { // eslint-disable-next-line rxjs/no-async-subscribe @@ -233,10 +226,8 @@ export class SsoComponent implements OnInit { // - TDE login decryption options component // - Browser SSO on extension open // Note: you cannot set this in state before 2FA b/c there won't be an account in state. - await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier( - orgSsoIdentifier, - this.activeUserId, - ); + 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) diff --git a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth.component.ts b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth.component.ts index 6afee461c42..3e59e4a29b9 100644 --- a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth.component.ts +++ b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth.component.ts @@ -2,7 +2,6 @@ // @ts-strict-ignore import { CommonModule } from "@angular/common"; import { Component, Inject, OnInit, ViewChild } from "@angular/core"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormBuilder, ReactiveFormsModule, Validators } from "@angular/forms"; import { ActivatedRoute, NavigationExtras, Router, RouterLink } from "@angular/router"; import { Subject, takeUntil, lastValueFrom, first, firstValueFrom } from "rxjs"; @@ -32,7 +31,6 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { UserId } from "@bitwarden/common/types/guid"; import { AsyncActionsModule, ButtonModule, @@ -128,7 +126,6 @@ export class TwoFactorAuthComponent extends CaptchaProtectedComponent implements protected changePasswordRoute = "set-password"; protected forcePasswordResetRoute = "update-temp-password"; protected successRoute = "vault"; - protected activeUserId: UserId; constructor( protected loginStrategyService: LoginStrategyServiceAbstraction, @@ -151,10 +148,6 @@ export class TwoFactorAuthComponent extends CaptchaProtectedComponent implements protected toastService: ToastService, ) { super(environmentService, i18nService, platformUtilsService, toastService); - - this.accountService.activeAccount$.pipe(takeUntilDestroyed()).subscribe((account) => { - this.activeUserId = account?.id; - }); } async ngOnInit() { @@ -269,10 +262,8 @@ export class TwoFactorAuthComponent extends CaptchaProtectedComponent implements // Save off the OrgSsoIdentifier for use in the TDE flows // - TDE login decryption options component // - Browser SSO on extension open - await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier( - this.orgIdentifier, - this.activeUserId, - ); + const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier(this.orgIdentifier, userId); this.loginEmailService.clearValues(); // note: this flow affects both TDE & standard users diff --git a/libs/angular/src/auth/components/two-factor.component.ts b/libs/angular/src/auth/components/two-factor.component.ts index 49af9d057f7..e43797332ec 100644 --- a/libs/angular/src/auth/components/two-factor.component.ts +++ b/libs/angular/src/auth/components/two-factor.component.ts @@ -35,7 +35,6 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { UserId } from "@bitwarden/common/types/guid"; import { ToastService } from "@bitwarden/components"; import { CaptchaProtectedComponent } from "./captcha-protected.component"; @@ -74,8 +73,6 @@ export class TwoFactorComponent extends CaptchaProtectedComponent implements OnI protected successRoute = "vault"; protected twoFactorTimeoutRoute = "authentication-timeout"; - protected activeUserId: UserId; - get isDuoProvider(): boolean { return ( this.selectedProviderType === TwoFactorProviderType.Duo || @@ -108,10 +105,6 @@ export class TwoFactorComponent extends CaptchaProtectedComponent implements OnI this.webAuthnSupported = this.platformUtilsService.supportsWebAuthn(win); - this.accountService.activeAccount$.pipe(takeUntilDestroyed()).subscribe((account) => { - this.activeUserId = account?.id; - }); - // Add subscription to authenticationSessionTimeout$ and navigate to twoFactorTimeoutRoute if expired this.loginStrategyService.authenticationSessionTimeout$ .pipe(takeUntilDestroyed()) @@ -295,10 +288,8 @@ export class TwoFactorComponent extends CaptchaProtectedComponent implements OnI // Save off the OrgSsoIdentifier for use in the TDE flows // - TDE login decryption options component // - Browser SSO on extension open - await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier( - this.orgIdentifier, - this.activeUserId, - ); + const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier(this.orgIdentifier, userId); this.loginEmailService.clearValues(); // note: this flow affects both TDE & standard users diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 94c2412652a..719e3a084f1 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -147,13 +147,15 @@ import { BillingApiService } from "@bitwarden/common/billing/services/billing-ap import { OrganizationBillingApiService } from "@bitwarden/common/billing/services/organization/organization-billing-api.service"; import { OrganizationBillingService } from "@bitwarden/common/billing/services/organization-billing.service"; import { TaxService } from "@bitwarden/common/billing/services/tax.service"; +import { BulkEncryptService } from "@bitwarden/common/key-management/crypto/abstractions/bulk-encrypt.service"; +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 { AppIdService as AppIdServiceAbstraction } from "@bitwarden/common/platform/abstractions/app-id.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { BulkEncryptService } from "@bitwarden/common/platform/abstractions/bulk-encrypt.service"; import { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EnvironmentService, RegionConfig, @@ -194,8 +196,6 @@ import { AppIdService } from "@bitwarden/common/platform/services/app-id.service import { ConfigApiService } from "@bitwarden/common/platform/services/config/config-api.service"; import { DefaultConfigService } from "@bitwarden/common/platform/services/config/default-config.service"; import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; -import { BulkEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/bulk-encrypt.service.implementation"; -import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation"; import { DefaultBroadcasterService } from "@bitwarden/common/platform/services/default-broadcaster.service"; import { DefaultEnvironmentService } from "@bitwarden/common/platform/services/default-environment.service"; import { DefaultServerSettingsService } from "@bitwarden/common/platform/services/default-server-settings.service"; diff --git a/libs/angular/src/tools/generator/components/generator.component.ts b/libs/angular/src/tools/generator/components/generator.component.ts deleted file mode 100644 index 1f3c635e499..00000000000 --- a/libs/angular/src/tools/generator/components/generator.component.ts +++ /dev/null @@ -1,389 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Directive, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output } from "@angular/core"; -import { ActivatedRoute } from "@angular/router"; -import { BehaviorSubject, combineLatest, firstValueFrom, Subject } from "rxjs"; -import { debounceTime, first, map, skipWhile, takeUntil } from "rxjs/operators"; - -import { PasswordGeneratorPolicyOptions } from "@bitwarden/common/admin-console/models/domain/password-generator-policy-options"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; -import { - GeneratorType, - DefaultPasswordBoundaries as DefaultBoundaries, -} from "@bitwarden/generator-core"; -import { - PasswordGenerationServiceAbstraction, - UsernameGenerationServiceAbstraction, - UsernameGeneratorOptions, - PasswordGeneratorOptions, -} from "@bitwarden/generator-legacy"; - -export class EmailForwarderOptions { - name: string; - value: string; - validForSelfHosted: boolean; -} - -@Directive() -export class GeneratorComponent implements OnInit, OnDestroy { - @Input() comingFromAddEdit = false; - @Input() type: GeneratorType | ""; - @Output() onSelected = new EventEmitter(); - - usernameGeneratingPromise: Promise; - typeOptions: any[]; - usernameTypeOptions: any[]; - subaddressOptions: any[]; - catchallOptions: any[]; - forwardOptions: EmailForwarderOptions[]; - usernameOptions: UsernameGeneratorOptions = { website: null }; - passwordOptions: PasswordGeneratorOptions = {}; - username = "-"; - password = "-"; - showOptions = false; - avoidAmbiguous = false; - enforcedPasswordPolicyOptions: PasswordGeneratorPolicyOptions; - usernameWebsite: string = null; - - get passTypeOptions() { - return this._passTypeOptions.filter((o) => !o.disabled); - } - private _passTypeOptions: { name: string; value: GeneratorType; disabled: boolean }[]; - - private destroy$ = new Subject(); - private isInitialized$ = new BehaviorSubject(false); - - // update screen reader minimum password length with 500ms debounce - // so that the user isn't flooded with status updates - private _passwordOptionsMinLengthForReader = new BehaviorSubject( - DefaultBoundaries.length.min, - ); - protected passwordOptionsMinLengthForReader$ = this._passwordOptionsMinLengthForReader.pipe( - map((val) => val || DefaultBoundaries.length.min), - debounceTime(500), - ); - - private _password = new BehaviorSubject("-"); - - constructor( - protected passwordGenerationService: PasswordGenerationServiceAbstraction, - protected usernameGenerationService: UsernameGenerationServiceAbstraction, - protected platformUtilsService: PlatformUtilsService, - protected accountService: AccountService, - protected i18nService: I18nService, - protected logService: LogService, - protected route: ActivatedRoute, - protected ngZone: NgZone, - private win: Window, - protected toastService: ToastService, - ) { - this.typeOptions = [ - { name: i18nService.t("password"), value: "password" }, - { name: i18nService.t("username"), value: "username" }, - ]; - this._passTypeOptions = [ - { name: i18nService.t("password"), value: "password", disabled: false }, - { name: i18nService.t("passphrase"), value: "passphrase", disabled: false }, - ]; - this.usernameTypeOptions = [ - { - name: i18nService.t("plusAddressedEmail"), - value: "subaddress", - desc: i18nService.t("plusAddressedEmailDesc"), - }, - { - name: i18nService.t("catchallEmail"), - value: "catchall", - desc: i18nService.t("catchallEmailDesc"), - }, - { - name: i18nService.t("forwardedEmail"), - value: "forwarded", - desc: i18nService.t("forwardedEmailDesc"), - }, - { name: i18nService.t("randomWord"), value: "word" }, - ]; - this.subaddressOptions = [{ name: i18nService.t("random"), value: "random" }]; - this.catchallOptions = [{ name: i18nService.t("random"), value: "random" }]; - - this.forwardOptions = [ - { name: "", value: "", validForSelfHosted: false }, - { name: "addy.io", value: "anonaddy", validForSelfHosted: true }, - { name: "DuckDuckGo", value: "duckduckgo", validForSelfHosted: false }, - { name: "Fastmail", value: "fastmail", validForSelfHosted: true }, - { name: "Firefox Relay", value: "firefoxrelay", validForSelfHosted: false }, - { name: "SimpleLogin", value: "simplelogin", validForSelfHosted: true }, - { name: "Forward Email", value: "forwardemail", validForSelfHosted: true }, - ].sort((a, b) => a.name.localeCompare(b.name)); - - this._password.pipe(debounceTime(250)).subscribe((password) => { - ngZone.run(() => { - this.password = password; - }); - this.passwordGenerationService.addHistory(this.password).catch((e) => { - this.logService.error(e); - }); - }); - } - - cascadeOptions(navigationType: GeneratorType = undefined, accountEmail: string) { - this.avoidAmbiguous = !this.passwordOptions.ambiguous; - - if (!this.type) { - if (navigationType) { - this.type = navigationType; - } else { - this.type = this.passwordOptions.type === "username" ? "username" : "password"; - } - } - - this.passwordOptions.type = - this.passwordOptions.type === "passphrase" ? "passphrase" : "password"; - - const overrideType = this.enforcedPasswordPolicyOptions.overridePasswordType ?? ""; - const isDisabled = overrideType.length - ? (value: string, policyValue: string) => value !== policyValue - : (_value: string, _policyValue: string) => false; - for (const option of this._passTypeOptions) { - option.disabled = isDisabled(option.value, overrideType); - } - - if (this.usernameOptions.type == null) { - this.usernameOptions.type = "word"; - } - if ( - this.usernameOptions.subaddressEmail == null || - this.usernameOptions.subaddressEmail === "" - ) { - this.usernameOptions.subaddressEmail = accountEmail; - } - if (this.usernameWebsite == null) { - this.usernameOptions.subaddressType = this.usernameOptions.catchallType = "random"; - } else { - this.usernameOptions.website = this.usernameWebsite; - } - } - - async ngOnInit() { - combineLatest([ - this.route.queryParams.pipe(first()), - this.accountService.activeAccount$.pipe(first()), - this.passwordGenerationService.getOptions$(), - this.usernameGenerationService.getOptions$(), - ]) - .pipe( - map(([qParams, account, [passwordOptions, passwordPolicy], usernameOptions]) => ({ - navigationType: qParams.type as GeneratorType, - accountEmail: account.email, - passwordOptions, - passwordPolicy, - usernameOptions, - })), - takeUntil(this.destroy$), - ) - .subscribe((options) => { - this.passwordOptions = options.passwordOptions; - this.enforcedPasswordPolicyOptions = options.passwordPolicy; - this.usernameOptions = options.usernameOptions; - - this.cascadeOptions(options.navigationType, options.accountEmail); - this._passwordOptionsMinLengthForReader.next(this.passwordOptions.minLength); - - if (this.regenerateWithoutButtonPress()) { - this.regenerate().catch((e) => { - this.logService.error(e); - }); - } - - this.isInitialized$.next(true); - }); - - // once initialization is complete, `ngOnInit` should return. - // - // FIXME(#6944): if a sync is in progress, wait to complete until after - // the sync completes. - await firstValueFrom( - this.isInitialized$.pipe( - skipWhile((initialized) => !initialized), - takeUntil(this.destroy$), - ), - ); - - if (this.usernameWebsite !== null) { - const websiteOption = { name: this.i18nService.t("websiteName"), value: "website-name" }; - this.subaddressOptions.push(websiteOption); - this.catchallOptions.push(websiteOption); - } - } - - ngOnDestroy() { - this.destroy$.next(); - this.destroy$.complete(); - this.isInitialized$.complete(); - this._passwordOptionsMinLengthForReader.complete(); - } - - async typeChanged() { - await this.savePasswordOptions(); - } - - async regenerate() { - if (this.type === "password") { - await this.regeneratePassword(); - } else if (this.type === "username") { - await this.regenerateUsername(); - } - } - - async sliderChanged() { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.savePasswordOptions(); - await this.passwordGenerationService.addHistory(this.password); - } - - async onPasswordOptionsMinNumberInput($event: Event) { - // `savePasswordOptions()` replaces the null - this.passwordOptions.number = null; - - await this.savePasswordOptions(); - - // fixes UI desync that occurs when minNumber has a fixed value - // that is reset through normalization - ($event.target as HTMLInputElement).value = `${this.passwordOptions.minNumber}`; - } - - async setPasswordOptionsNumber($event: boolean) { - this.passwordOptions.number = $event; - // `savePasswordOptions()` replaces the null - this.passwordOptions.minNumber = null; - - await this.savePasswordOptions(); - } - - async onPasswordOptionsMinSpecialInput($event: Event) { - // `savePasswordOptions()` replaces the null - this.passwordOptions.special = null; - - await this.savePasswordOptions(); - - // fixes UI desync that occurs when minSpecial has a fixed value - // that is reset through normalization - ($event.target as HTMLInputElement).value = `${this.passwordOptions.minSpecial}`; - } - - async setPasswordOptionsSpecial($event: boolean) { - this.passwordOptions.special = $event; - // `savePasswordOptions()` replaces the null - this.passwordOptions.minSpecial = null; - - await this.savePasswordOptions(); - } - - async sliderInput() { - await this.normalizePasswordOptions(); - } - - async savePasswordOptions() { - // map navigation state into generator type - const restoreType = this.passwordOptions.type; - if (this.type === "username") { - this.passwordOptions.type = this.type; - } - - // save options - await this.normalizePasswordOptions(); - await this.passwordGenerationService.saveOptions(this.passwordOptions); - - // restore the original format - this.passwordOptions.type = restoreType; - } - - async saveUsernameOptions() { - await this.usernameGenerationService.saveOptions(this.usernameOptions); - if (this.usernameOptions.type === "forwarded") { - this.username = "-"; - } - } - - async regeneratePassword() { - this._password.next( - await this.passwordGenerationService.generatePassword(this.passwordOptions), - ); - } - - regenerateUsername() { - return this.generateUsername(); - } - - async generateUsername() { - try { - this.usernameGeneratingPromise = this.usernameGenerationService.generateUsername( - this.usernameOptions, - ); - this.username = await this.usernameGeneratingPromise; - if (this.username === "" || this.username === null) { - this.username = "-"; - } - } catch (e) { - this.logService.error(e); - } - } - - copy() { - const password = this.type === "password"; - const copyOptions = this.win != null ? { window: this.win } : null; - this.platformUtilsService.copyToClipboard( - password ? this.password : this.username, - copyOptions, - ); - this.toastService.showToast({ - variant: "info", - title: null, - message: this.i18nService.t( - "valueCopied", - this.i18nService.t(password ? "password" : "username"), - ), - }); - } - - select() { - this.onSelected.emit(this.type === "password" ? this.password : this.username); - } - - toggleOptions() { - this.showOptions = !this.showOptions; - } - - regenerateWithoutButtonPress() { - return this.type !== "username" || this.usernameOptions.type !== "forwarded"; - } - - private async normalizePasswordOptions() { - // Application level normalize options dependent on class variables - this.passwordOptions.ambiguous = !this.avoidAmbiguous; - - if ( - !this.passwordOptions.uppercase && - !this.passwordOptions.lowercase && - !this.passwordOptions.number && - !this.passwordOptions.special - ) { - this.passwordOptions.lowercase = true; - if (this.win != null) { - const lowercase = this.win.document.querySelector("#lowercase") as HTMLInputElement; - if (lowercase) { - lowercase.checked = true; - } - } - } - - await this.passwordGenerationService.enforcePasswordGeneratorPoliciesOnOptions( - this.passwordOptions, - ); - } -} diff --git a/libs/angular/src/tools/generator/components/password-generator-history.component.ts b/libs/angular/src/tools/generator/components/password-generator-history.component.ts deleted file mode 100644 index 2933163fce2..00000000000 --- a/libs/angular/src/tools/generator/components/password-generator-history.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Directive, OnInit } from "@angular/core"; - -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; -import { GeneratedPasswordHistory } from "@bitwarden/generator-history"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -@Directive() -export class PasswordGeneratorHistoryComponent implements OnInit { - history: GeneratedPasswordHistory[] = []; - - constructor( - protected passwordGenerationService: PasswordGenerationServiceAbstraction, - protected platformUtilsService: PlatformUtilsService, - protected i18nService: I18nService, - private win: Window, - protected toastService: ToastService, - ) {} - - async ngOnInit() { - this.history = await this.passwordGenerationService.getHistory(); - } - - clear = async () => { - this.history = await this.passwordGenerationService.clear(); - }; - - copy(password: string) { - const copyOptions = this.win != null ? { window: this.win } : null; - this.platformUtilsService.copyToClipboard(password, copyOptions); - this.toastService.showToast({ - variant: "info", - title: null, - message: this.i18nService.t("valueCopied", this.i18nService.t("password")), - }); - } -} diff --git a/libs/angular/src/tools/generator/generator-swap.ts b/libs/angular/src/tools/generator/generator-swap.ts deleted file mode 100644 index 16fafc67116..00000000000 --- a/libs/angular/src/tools/generator/generator-swap.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Type, inject } from "@angular/core"; -import { Route, Routes } from "@angular/router"; - -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; - -import { componentRouteSwap } from "../../utils/component-route-swap"; - -/** - * Helper function to swap between two components based on the GeneratorToolsModernization feature flag. - * @param defaultComponent - The current non-refreshed component to render. - * @param refreshedComponent - The new refreshed component to render. - * @param options - The shared route options to apply to the default component, and to the alt component if altOptions is not provided. - * @param altOptions - The alt route options to apply to the alt component. - */ -export function generatorSwap( - defaultComponent: Type, - refreshedComponent: Type, - options: Route, - altOptions?: Route, -): Routes { - return componentRouteSwap( - defaultComponent, - refreshedComponent, - async () => { - const configService = inject(ConfigService); - return configService.getFeatureFlag(FeatureFlag.GeneratorToolsModernization); - }, - options, - altOptions, - ); -} diff --git a/libs/angular/src/utils/extension-refresh-redirect.spec.ts b/libs/angular/src/utils/extension-refresh-redirect.spec.ts deleted file mode 100644 index 3291a4496ff..00000000000 --- a/libs/angular/src/utils/extension-refresh-redirect.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { TestBed } from "@angular/core/testing"; -import { Navigation, Router, UrlTree } from "@angular/router"; -import { mock, MockProxy } from "jest-mock-extended"; - -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; - -import { extensionRefreshRedirect } from "./extension-refresh-redirect"; - -describe("extensionRefreshRedirect", () => { - let configService: MockProxy; - let router: MockProxy; - - beforeEach(() => { - configService = mock(); - router = mock(); - - TestBed.configureTestingModule({ - providers: [ - { provide: ConfigService, useValue: configService }, - { provide: Router, useValue: router }, - ], - }); - }); - - it("returns true when ExtensionRefresh flag is disabled", async () => { - configService.getFeatureFlag.mockResolvedValue(false); - - const result = await TestBed.runInInjectionContext(() => - extensionRefreshRedirect("/redirect")(), - ); - - expect(result).toBe(true); - expect(configService.getFeatureFlag).toHaveBeenCalledWith(FeatureFlag.ExtensionRefresh); - expect(router.parseUrl).not.toHaveBeenCalled(); - }); - - it("returns UrlTree when ExtensionRefresh flag is enabled and preserves query params", async () => { - configService.getFeatureFlag.mockResolvedValue(true); - - const urlTree = new UrlTree(); - urlTree.queryParams = { test: "test" }; - - const navigation: Navigation = { - extras: {}, - id: 0, - initialUrl: new UrlTree(), - extractedUrl: urlTree, - trigger: "imperative", - previousNavigation: undefined, - }; - - router.getCurrentNavigation.mockReturnValue(navigation); - - await TestBed.runInInjectionContext(() => extensionRefreshRedirect("/redirect")()); - - expect(configService.getFeatureFlag).toHaveBeenCalledWith(FeatureFlag.ExtensionRefresh); - expect(router.createUrlTree).toHaveBeenCalledWith(["/redirect"], { - queryParams: urlTree.queryParams, - }); - }); -}); diff --git a/libs/angular/src/utils/extension-refresh-redirect.ts b/libs/angular/src/utils/extension-refresh-redirect.ts deleted file mode 100644 index 2baa3a3ec89..00000000000 --- a/libs/angular/src/utils/extension-refresh-redirect.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { inject } from "@angular/core"; -import { UrlTree, Router } from "@angular/router"; - -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; - -/** - * Helper function to redirect to a new URL based on the ExtensionRefresh feature flag. - * @param redirectUrl - The URL to redirect to if the ExtensionRefresh flag is enabled. - */ -export function extensionRefreshRedirect(redirectUrl: string): () => Promise { - return async () => { - const configService = inject(ConfigService); - const router = inject(Router); - - const shouldRedirect = await configService.getFeatureFlag(FeatureFlag.ExtensionRefresh); - if (shouldRedirect) { - const currentNavigation = router.getCurrentNavigation(); - const queryParams = currentNavigation?.extractedUrl?.queryParams || {}; - - // Preserve query params when redirecting as it is likely that the refreshed component - // will be consuming the same query params. - return router.createUrlTree([redirectUrl], { queryParams }); - } else { - return true; - } - }; -} diff --git a/libs/angular/src/utils/extension-refresh-swap.ts b/libs/angular/src/utils/extension-refresh-swap.ts deleted file mode 100644 index 6512be032d2..00000000000 --- a/libs/angular/src/utils/extension-refresh-swap.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Type, inject } from "@angular/core"; -import { Route, Routes } from "@angular/router"; - -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; - -import { componentRouteSwap } from "./component-route-swap"; - -/** - * Helper function to swap between two components based on the ExtensionRefresh feature flag. - * @param defaultComponent - The current non-refreshed component to render. - * @param refreshedComponent - The new refreshed component to render. - * @param options - The shared route options to apply to the default component, and to the alt component if altOptions is not provided. - * @param altOptions - The alt route options to apply to the alt component. - */ -export function extensionRefreshSwap( - defaultComponent: Type, - refreshedComponent: Type, - options: Route, - altOptions?: Route, -): Routes { - return componentRouteSwap( - defaultComponent, - refreshedComponent, - async () => { - const configService = inject(ConfigService); - return configService.getFeatureFlag(FeatureFlag.ExtensionRefresh); - }, - options, - altOptions, - ); -} diff --git a/libs/angular/src/vault/components/attachments.component.ts b/libs/angular/src/vault/components/attachments.component.ts index ec3dc43b447..9f1dd31da0c 100644 --- a/libs/angular/src/vault/components/attachments.component.ts +++ b/libs/angular/src/vault/components/attachments.component.ts @@ -6,8 +6,8 @@ import { firstValueFrom, map } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; 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 { ErrorResponse } from "@bitwarden/common/models/response/error.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/libs/angular/src/vault/components/view.component.ts b/libs/angular/src/vault/components/view.component.ts index abbedf13078..bec4ae52206 100644 --- a/libs/angular/src/vault/components/view.component.ts +++ b/libs/angular/src/vault/components/view.component.ts @@ -11,7 +11,7 @@ import { OnInit, Output, } from "@angular/core"; -import { filter, firstValueFrom, map, Observable } from "rxjs"; +import { filter, firstValueFrom, map, Observable, Subject, takeUntil } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; @@ -20,9 +20,9 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EventType } from "@bitwarden/common/enums"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -81,6 +81,7 @@ export class ViewComponent implements OnDestroy, OnInit { private passwordReprompted = false; private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id)); + private destroyed$ = new Subject(); get fido2CredentialCreationDateValue(): string { const dateCreated = this.i18nService.t("dateCreated"); @@ -146,12 +147,15 @@ export class ViewComponent implements OnDestroy, OnInit { const activeUserId = await firstValueFrom(this.activeUserId$); // Grab individual cipher from `cipherViews$` for the most up-to-date information - this.cipher = await firstValueFrom( - this.cipherService.cipherViews$.pipe( - map((ciphers) => ciphers.find((c) => c.id === this.cipherId)), + this.cipherService.cipherViews$ + .pipe( + map((ciphers) => ciphers?.find((c) => c.id === this.cipherId)), filter((cipher) => !!cipher), - ), - ); + takeUntil(this.destroyed$), + ) + .subscribe((cipher) => { + this.cipher = cipher; + }); this.canAccessPremium = await firstValueFrom( this.billingAccountProfileStateService.hasPremiumFromAnySource$(activeUserId), @@ -524,6 +528,7 @@ export class ViewComponent implements OnDestroy, OnInit { this.showCardNumber = false; this.showCardCode = false; this.passwordReprompted = false; + this.destroyed$.next(); if (this.totpInterval) { clearInterval(this.totpInterval); } diff --git a/libs/angular/src/vault/guards/new-device-verification-notice.guard.spec.ts b/libs/angular/src/vault/guards/new-device-verification-notice.guard.spec.ts index 960590dab53..938d5b32527 100644 --- a/libs/angular/src/vault/guards/new-device-verification-notice.guard.spec.ts +++ b/libs/angular/src/vault/guards/new-device-verification-notice.guard.spec.ts @@ -2,9 +2,8 @@ import { TestBed } from "@angular/core/testing"; import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from "@angular/router"; import { BehaviorSubject } from "rxjs"; -import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -36,17 +35,21 @@ describe("NewDeviceVerificationNoticeGuard", () => { }); const isSelfHost = jest.fn().mockReturnValue(false); const getProfileTwoFactorEnabled = jest.fn().mockResolvedValue(false); - const policyAppliesToActiveUser$ = jest.fn().mockReturnValue(new BehaviorSubject(false)); const noticeState$ = jest.fn().mockReturnValue(new BehaviorSubject(null)); const getProfileCreationDate = jest.fn().mockResolvedValue(eightDaysAgo); + const hasMasterPasswordAndMasterKeyHash = jest.fn().mockResolvedValue(true); + const getUserSSOBound = jest.fn().mockResolvedValue(false); + const getUserSSOBoundAdminOwner = jest.fn().mockResolvedValue(false); beforeEach(() => { getFeatureFlag.mockClear(); isSelfHost.mockClear(); getProfileCreationDate.mockClear(); getProfileTwoFactorEnabled.mockClear(); - policyAppliesToActiveUser$.mockClear(); createUrlTree.mockClear(); + hasMasterPasswordAndMasterKeyHash.mockClear(); + getUserSSOBound.mockClear(); + getUserSSOBoundAdminOwner.mockClear(); TestBed.configureTestingModule({ providers: [ @@ -55,10 +58,15 @@ describe("NewDeviceVerificationNoticeGuard", () => { { provide: NewDeviceVerificationNoticeService, useValue: { noticeState$ } }, { provide: AccountService, useValue: { activeAccount$ } }, { provide: PlatformUtilsService, useValue: { isSelfHost } }, - { provide: PolicyService, useValue: { policyAppliesToActiveUser$ } }, + { provide: UserVerificationService, useValue: { hasMasterPasswordAndMasterKeyHash } }, { provide: VaultProfileService, - useValue: { getProfileCreationDate, getProfileTwoFactorEnabled }, + useValue: { + getProfileCreationDate, + getProfileTwoFactorEnabled, + getUserSSOBound, + getUserSSOBoundAdminOwner, + }, }, ], }); @@ -90,7 +98,7 @@ describe("NewDeviceVerificationNoticeGuard", () => { expect(isSelfHost).not.toHaveBeenCalled(); expect(getProfileTwoFactorEnabled).not.toHaveBeenCalled(); expect(getProfileCreationDate).not.toHaveBeenCalled(); - expect(policyAppliesToActiveUser$).not.toHaveBeenCalled(); + expect(hasMasterPasswordAndMasterKeyHash).not.toHaveBeenCalled(); }); }); @@ -121,13 +129,6 @@ describe("NewDeviceVerificationNoticeGuard", () => { expect(await newDeviceGuard()).toBe(true); }); - it("returns `true` SSO is required", async () => { - policyAppliesToActiveUser$.mockReturnValueOnce(new BehaviorSubject(true)); - - expect(await newDeviceGuard()).toBe(true); - expect(policyAppliesToActiveUser$).toHaveBeenCalledWith(PolicyType.RequireSso); - }); - it("returns `true` when the profile was created less than a week ago", async () => { const sixDaysAgo = new Date(); sixDaysAgo.setDate(sixDaysAgo.getDate() - 6); @@ -143,6 +144,57 @@ describe("NewDeviceVerificationNoticeGuard", () => { expect(await newDeviceGuard()).toBe(true); }); + describe("SSO bound", () => { + beforeEach(() => { + getFeatureFlag.mockImplementation((key) => { + if (key === FeatureFlag.NewDeviceVerificationPermanentDismiss) { + return Promise.resolve(true); + } + + return Promise.resolve(false); + }); + }); + + afterAll(() => { + getFeatureFlag.mockReturnValue(false); + }); + + it('returns "true" when the user is SSO bound and not an admin or owner', async () => { + getUserSSOBound.mockResolvedValueOnce(true); + getUserSSOBoundAdminOwner.mockResolvedValueOnce(false); + + expect(await newDeviceGuard()).toBe(true); + }); + + it('returns "true" when the user is an admin or owner of an SSO bound organization and has not logged in with their master password', async () => { + getUserSSOBound.mockResolvedValueOnce(true); + getUserSSOBoundAdminOwner.mockResolvedValueOnce(true); + hasMasterPasswordAndMasterKeyHash.mockResolvedValueOnce(false); + + expect(await newDeviceGuard()).toBe(true); + }); + + it("shows notice when the user is an admin or owner of an SSO bound organization and logged in with their master password", async () => { + getUserSSOBound.mockResolvedValueOnce(true); + getUserSSOBoundAdminOwner.mockResolvedValueOnce(true); + hasMasterPasswordAndMasterKeyHash.mockResolvedValueOnce(true); + + await newDeviceGuard(); + + expect(createUrlTree).toHaveBeenCalledWith(["/new-device-notice"]); + }); + + it("shows notice when the user that is not in an SSO bound organization", async () => { + getUserSSOBound.mockResolvedValueOnce(false); + getUserSSOBoundAdminOwner.mockResolvedValueOnce(false); + hasMasterPasswordAndMasterKeyHash.mockResolvedValueOnce(true); + + await newDeviceGuard(); + + expect(createUrlTree).toHaveBeenCalledWith(["/new-device-notice"]); + }); + }); + describe("temp flag", () => { beforeEach(() => { getFeatureFlag.mockImplementation((key) => { diff --git a/libs/angular/src/vault/guards/new-device-verification-notice.guard.ts b/libs/angular/src/vault/guards/new-device-verification-notice.guard.ts index 09d6b3313c4..8d4a7742bc5 100644 --- a/libs/angular/src/vault/guards/new-device-verification-notice.guard.ts +++ b/libs/angular/src/vault/guards/new-device-verification-notice.guard.ts @@ -2,9 +2,8 @@ import { inject } from "@angular/core"; import { ActivatedRouteSnapshot, CanActivateFn, Router } from "@angular/router"; import { firstValueFrom, Observable } from "rxjs"; -import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -20,8 +19,8 @@ export const NewDeviceVerificationNoticeGuard: CanActivateFn = async ( const newDeviceVerificationNoticeService = inject(NewDeviceVerificationNoticeService); const accountService = inject(AccountService); const platformUtilsService = inject(PlatformUtilsService); - const policyService = inject(PolicyService); const vaultProfileService = inject(VaultProfileService); + const userVerificationService = inject(UserVerificationService); if (route.queryParams["fromNewDeviceVerification"]) { return true; @@ -47,7 +46,11 @@ export const NewDeviceVerificationNoticeGuard: CanActivateFn = async ( try { const isSelfHosted = platformUtilsService.isSelfHost(); - const requiresSSO = await isSSORequired(policyService); + const userIsSSOUser = await ssoAppliesToUser( + userVerificationService, + vaultProfileService, + currentAcct.id, + ); const has2FAEnabled = await hasATwoFactorProviderEnabled(vaultProfileService, currentAcct.id); const isProfileLessThanWeekOld = await profileIsLessThanWeekOld( vaultProfileService, @@ -55,8 +58,9 @@ export const NewDeviceVerificationNoticeGuard: CanActivateFn = async ( ); // When any of the following are true, the device verification notice is - // not applicable for the user. - if (has2FAEnabled || isSelfHosted || requiresSSO || isProfileLessThanWeekOld) { + // not applicable for the user. When the user has *not* logged in with their + // master password, assume they logged in with SSO. + if (has2FAEnabled || isSelfHosted || userIsSSOUser || isProfileLessThanWeekOld) { return true; } } catch { @@ -105,9 +109,39 @@ async function profileIsLessThanWeekOld( return !isMoreThan7DaysAgo(creationDate); } -/** Returns true when the user is required to login via SSO */ -async function isSSORequired(policyService: PolicyService) { - return firstValueFrom(policyService.policyAppliesToActiveUser$(PolicyType.RequireSso)); +/** + * Returns true when either: + * - The user is SSO bound to an organization and is not an Admin or Owner + * - The user is an Admin or Owner of an organization with SSO bound and has not logged in with their master password + * + * NOTE: There are edge cases where this does not satisfy the original requirement of showing the notice to + * users who are subject to the SSO required policy. When Owners and Admins log in with their MP they will see the notice + * when they log in with SSO they will not. This is a concession made because the original logic references policies would not work for TDE users. + * When this guard is run for those users a sync hasn't occurred and thus the policies are not available. + */ +async function ssoAppliesToUser( + userVerificationService: UserVerificationService, + vaultProfileService: VaultProfileService, + userId: string, +) { + const userSSOBound = await vaultProfileService.getUserSSOBound(userId); + const userSSOBoundAdminOwner = await vaultProfileService.getUserSSOBoundAdminOwner(userId); + const userLoggedInWithMP = await userLoggedInWithMasterPassword(userVerificationService, userId); + + const nonOwnerAdminSsoUser = userSSOBound && !userSSOBoundAdminOwner; + const ssoAdminOwnerLoggedInWithMP = userSSOBoundAdminOwner && !userLoggedInWithMP; + + return nonOwnerAdminSsoUser || ssoAdminOwnerLoggedInWithMP; +} + +/** + * Returns true when the user logged in with their master password. + */ +async function userLoggedInWithMasterPassword( + userVerificationService: UserVerificationService, + userId: string, +) { + return userVerificationService.hasMasterPasswordAndMasterKeyHash(userId); } /** Returns the true when the date given is older than 7 days */ diff --git a/libs/angular/src/vault/services/vault-profile.service.spec.ts b/libs/angular/src/vault/services/vault-profile.service.spec.ts index 7761503253a..ade34da39a6 100644 --- a/libs/angular/src/vault/services/vault-profile.service.spec.ts +++ b/libs/angular/src/vault/services/vault-profile.service.spec.ts @@ -1,6 +1,7 @@ import { TestBed } from "@angular/core/testing"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { OrganizationUserType } from "@bitwarden/common/admin-console/enums"; import { VaultProfileService } from "./vault-profile.service"; @@ -13,6 +14,12 @@ describe("VaultProfileService", () => { creationDate: hardcodedDateString, twoFactorEnabled: true, id: "new-user-id", + organizations: [ + { + ssoBound: true, + type: OrganizationUserType.Admin, + }, + ], }); beforeEach(() => { @@ -91,4 +98,64 @@ describe("VaultProfileService", () => { expect(getProfile).not.toHaveBeenCalled(); }); }); + + describe("getUserSSOBound", () => { + it("calls `getProfile` when stored ssoBound property is not stored", async () => { + expect(service["userIsSsoBound"]).toBeNull(); + + const userIsSsoBound = await service.getUserSSOBound(userId); + + expect(userIsSsoBound).toBe(true); + expect(getProfile).toHaveBeenCalled(); + }); + + it("calls `getProfile` when stored profile id does not match", async () => { + service["userIsSsoBound"] = false; + service["userId"] = "old-user-id"; + + const userIsSsoBound = await service.getUserSSOBound(userId); + + expect(userIsSsoBound).toBe(true); + expect(getProfile).toHaveBeenCalled(); + }); + + it("does not call `getProfile` when ssoBound property is already stored", async () => { + service["userIsSsoBound"] = false; + + const userIsSsoBound = await service.getUserSSOBound(userId); + + expect(userIsSsoBound).toBe(false); + expect(getProfile).not.toHaveBeenCalled(); + }); + }); + + describe("getUserSSOBoundAdminOwner", () => { + it("calls `getProfile` when stored userIsSsoBoundAdminOwner property is not stored", async () => { + expect(service["userIsSsoBoundAdminOwner"]).toBeNull(); + + const userIsSsoBoundAdminOwner = await service.getUserSSOBoundAdminOwner(userId); + + expect(userIsSsoBoundAdminOwner).toBe(true); + expect(getProfile).toHaveBeenCalled(); + }); + + it("calls `getProfile` when stored profile id does not match", async () => { + service["userIsSsoBoundAdminOwner"] = false; + service["userId"] = "old-user-id"; + + const userIsSsoBoundAdminOwner = await service.getUserSSOBoundAdminOwner(userId); + + expect(userIsSsoBoundAdminOwner).toBe(true); + expect(getProfile).toHaveBeenCalled(); + }); + + it("does not call `getProfile` when userIsSsoBoundAdminOwner property is already stored", async () => { + service["userIsSsoBoundAdminOwner"] = false; + + const userIsSsoBoundAdminOwner = await service.getUserSSOBoundAdminOwner(userId); + + expect(userIsSsoBoundAdminOwner).toBe(false); + expect(getProfile).not.toHaveBeenCalled(); + }); + }); }); diff --git a/libs/angular/src/vault/services/vault-profile.service.ts b/libs/angular/src/vault/services/vault-profile.service.ts index b368a973781..21f4ecc2285 100644 --- a/libs/angular/src/vault/services/vault-profile.service.ts +++ b/libs/angular/src/vault/services/vault-profile.service.ts @@ -1,6 +1,7 @@ import { Injectable, inject } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { OrganizationUserType } from "@bitwarden/common/admin-console/enums"; import { ProfileResponse } from "@bitwarden/common/models/response/profile.response"; @Injectable({ @@ -24,6 +25,12 @@ export class VaultProfileService { /** True when 2FA is enabled on the profile. */ private profile2FAEnabled: boolean | null = null; + /** True when ssoBound is true for any of the users organizations */ + private userIsSsoBound: boolean | null = null; + + /** True when the user is an admin or owner of the ssoBound organization */ + private userIsSsoBoundAdminOwner: boolean | null = null; + /** * Returns the creation date of the profile. * Note: `Date`s are mutable in JS, creating a new @@ -52,12 +59,43 @@ export class VaultProfileService { return profile.twoFactorEnabled; } + /** + * Returns whether the user logs in with SSO for any organization. + */ + async getUserSSOBound(userId: string): Promise { + if (this.userIsSsoBound !== null && userId === this.userId) { + return Promise.resolve(this.userIsSsoBound); + } + + await this.fetchAndCacheProfile(); + + return !!this.userIsSsoBound; + } + + /** + * Returns true when the user is an Admin or Owner of an organization with `ssoBound` true. + */ + async getUserSSOBoundAdminOwner(userId: string): Promise { + if (this.userIsSsoBoundAdminOwner !== null && userId === this.userId) { + return Promise.resolve(this.userIsSsoBoundAdminOwner); + } + + await this.fetchAndCacheProfile(); + + return !!this.userIsSsoBoundAdminOwner; + } + private async fetchAndCacheProfile(): Promise { const profile = await this.apiService.getProfile(); this.userId = profile.id; this.profileCreatedDate = profile.creationDate; this.profile2FAEnabled = profile.twoFactorEnabled; + const ssoBoundOrg = profile.organizations.find((org) => org.ssoBound); + this.userIsSsoBound = !!ssoBoundOrg; + this.userIsSsoBoundAdminOwner = + ssoBoundOrg?.type === OrganizationUserType.Admin || + ssoBoundOrg?.type === OrganizationUserType.Owner; return profile; } diff --git a/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.spec.ts b/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.spec.ts index 7a2b334eb42..726110663fc 100644 --- a/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.spec.ts +++ b/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.spec.ts @@ -11,8 +11,8 @@ import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-conso import { OrganizationKeysResponse } from "@bitwarden/common/admin-console/models/response/organization-keys.response"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SetPasswordRequest } from "@bitwarden/common/auth/models/request/set-password.request"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.ts b/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.ts index 84c580662be..6c9ce8f9267 100644 --- a/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.ts +++ b/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.ts @@ -12,8 +12,8 @@ import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-conso import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { SetPasswordRequest } from "@bitwarden/common/auth/models/request/set-password.request"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/libs/auth/src/angular/sso/sso.component.ts b/libs/auth/src/angular/sso/sso.component.ts index b4373bfe96e..b3f0d7d6a66 100644 --- a/libs/auth/src/angular/sso/sso.component.ts +++ b/libs/auth/src/angular/sso/sso.component.ts @@ -36,7 +36,6 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { UserId } from "@bitwarden/common/types/guid"; import { AsyncActionsModule, ButtonModule, @@ -90,7 +89,6 @@ export class SsoComponent implements OnInit { protected state: string | undefined; protected codeChallenge: string | undefined; protected clientId: SsoClientType | undefined; - protected activeUserId: UserId | undefined; formPromise: Promise | undefined; initiateSsoFormPromise: Promise | undefined; @@ -132,8 +130,6 @@ export class SsoComponent implements OnInit { } async ngOnInit() { - this.activeUserId = (await firstValueFrom(this.accountService.activeAccount$))?.id; - const qParams: QueryParams = await firstValueFrom(this.route.queryParams); // This if statement will pass on the second portion of the SSO flow @@ -371,7 +367,7 @@ export class SsoComponent implements OnInit { codeVerifier, redirectUri, orgSsoIdentifier, - email, + email ?? undefined, ); this.formPromise = this.loginStrategyService.logIn(credentials); const authResult = await this.formPromise; @@ -388,10 +384,10 @@ export class SsoComponent implements OnInit { // - TDE login decryption options component // - Browser SSO on extension open // Note: you cannot set this in state before 2FA b/c there won't be an account in state. - await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier( - orgSsoIdentifier, - this.activeUserId, - ); + + // 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) 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 cec4481cd8d..7c56e2a58c8 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 @@ -9,8 +9,8 @@ import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/id 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 { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; 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 a8208a1e0ad..fbd6b79f19d 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.spec.ts @@ -21,8 +21,8 @@ import { IUserDecryptionOptionsServerResponse } from "@bitwarden/common/auth/mod 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 { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; diff --git a/libs/auth/src/common/login-strategies/login.strategy.ts b/libs/auth/src/common/login-strategies/login.strategy.ts index 6b1dcfb155c..b4eef1a0276 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.ts @@ -22,9 +22,9 @@ import { IdentityTwoFactorResponse } from "@bitwarden/common/auth/models/respons 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 { KeysRequest } from "@bitwarden/common/models/request/keys.request"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; 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 d572710a2fd..1b0613d4da3 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 @@ -13,8 +13,8 @@ import { MasterPasswordPolicyResponse } from "@bitwarden/common/auth/models/resp 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 { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; 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 ec3ec43134f..96b08e98e37 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 @@ -13,9 +13,9 @@ import { IUserDecryptionOptionsServerResponse } from "@bitwarden/common/auth/mod 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 { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; 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 2bb41faa0e1..dd3e7f0134d 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 @@ -8,8 +8,8 @@ import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor 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 { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Environment, EnvironmentService, 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 9dacce2cf00..fd8817a8c21 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 @@ -11,8 +11,8 @@ import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/maste 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 { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; diff --git a/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts b/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts index 86b2a1dd3b6..2ea6d427641 100644 --- a/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts +++ b/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts @@ -3,9 +3,9 @@ import { mock } from "jest-mock-extended"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; 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 { AuthRequestPushNotification } from "@bitwarden/common/models/response/notification.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; diff --git a/libs/auth/src/common/services/auth-request/auth-request.service.ts b/libs/auth/src/common/services/auth-request/auth-request.service.ts index 4bc0397b43a..5bc200ae1e8 100644 --- a/libs/auth/src/common/services/auth-request/auth-request.service.ts +++ b/libs/auth/src/common/services/auth-request/auth-request.service.ts @@ -9,9 +9,9 @@ import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth import { AdminAuthRequestStorable } from "@bitwarden/common/auth/models/domain/admin-auth-req-storable"; import { PasswordlessAuthRequest } from "@bitwarden/common/auth/models/request/passwordless-auth.request"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { AuthRequestPushNotification } from "@bitwarden/common/models/response/notification.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; 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 3b03e8754bc..117e5c1f864 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 @@ -17,8 +17,8 @@ import { PreloginResponse } from "@bitwarden/common/auth/models/response/prelogi 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 { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; 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 e3a20fcfe72..849b8e5eba1 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 @@ -22,10 +22,10 @@ import { AuthenticationType } from "@bitwarden/common/auth/enums/authentication- 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 { 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"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; diff --git a/libs/auth/src/common/services/pin/pin.service.implementation.ts b/libs/auth/src/common/services/pin/pin.service.implementation.ts index 01fc77e4a03..9b86440b364 100644 --- a/libs/auth/src/common/services/pin/pin.service.implementation.ts +++ b/libs/auth/src/common/services/pin/pin.service.implementation.ts @@ -4,8 +4,8 @@ import { firstValueFrom, map } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { MasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; diff --git a/libs/auth/src/common/services/pin/pin.service.spec.ts b/libs/auth/src/common/services/pin/pin.service.spec.ts index d254be4e875..1d6443535bc 100644 --- a/libs/auth/src/common/services/pin/pin.service.spec.ts +++ b/libs/auth/src/common/services/pin/pin.service.spec.ts @@ -1,8 +1,8 @@ import { mock } from "jest-mock-extended"; 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 { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; diff --git a/libs/common/spec/fake-account-service.ts b/libs/common/spec/fake-account-service.ts index d45448ce698..ba48181faa2 100644 --- a/libs/common/spec/fake-account-service.ts +++ b/libs/common/spec/fake-account-service.ts @@ -1,7 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { mock } from "jest-mock-extended"; -import { ReplaySubject, combineLatest, map } from "rxjs"; +import { ReplaySubject, combineLatest, map, Observable } from "rxjs"; import { Account, AccountInfo, AccountService } from "../src/auth/abstractions/account.service"; import { UserId } from "../src/types/guid"; @@ -55,7 +55,7 @@ export class FakeAccountService implements AccountService { }), ); } - get nextUpAccount$() { + get nextUpAccount$(): Observable { return combineLatest([this.accounts$, this.activeAccount$, this.sortedUserIds$]).pipe( map(([accounts, activeAccount, sortedUserIds]) => { const nextId = sortedUserIds.find((id) => id !== activeAccount?.id && accounts[id] != null); diff --git a/libs/common/spec/fake-state-provider.ts b/libs/common/spec/fake-state-provider.ts index b5105bb24ba..9f72ccada55 100644 --- a/libs/common/spec/fake-state-provider.ts +++ b/libs/common/spec/fake-state-provider.ts @@ -225,9 +225,9 @@ export class FakeStateProvider implements StateProvider { async setUserState( userKeyDefinition: UserKeyDefinition, - value: T, + value: T | null, userId?: UserId, - ): Promise<[UserId, T]> { + ): Promise<[UserId, T | null]> { await this.mock.setUserState(userKeyDefinition, value, userId); if (userId) { return [userId, await this.getUser(userId, userKeyDefinition).update(() => value)]; diff --git a/libs/common/spec/fake-state.ts b/libs/common/spec/fake-state.ts index e4b42e357b6..00b12de2eb1 100644 --- a/libs/common/spec/fake-state.ts +++ b/libs/common/spec/fake-state.ts @@ -131,9 +131,9 @@ export class FakeSingleUserState implements SingleUserState { } async update( - configureState: (state: T, dependency: TCombine) => T, + configureState: (state: T | null, dependency: TCombine) => T | null, options?: StateUpdateOptions, - ): Promise { + ): Promise { options = populateOptionsWithDefault(options); const current = await firstValueFrom(this.state$.pipe(timeout(options.msTimeout))); const combinedDependencies = @@ -206,9 +206,9 @@ export class FakeActiveUserState implements ActiveUserState { } async update( - configureState: (state: T, dependency: TCombine) => T, + configureState: (state: T | null, dependency: TCombine) => T | null, options?: StateUpdateOptions, - ): Promise<[UserId, T]> { + ): Promise<[UserId, T | null]> { options = populateOptionsWithDefault(options); const current = await firstValueFrom(this.state$.pipe(timeout(options.msTimeout))); const combinedDependencies = diff --git a/libs/common/src/admin-console/models/domain/encrypted-organization-key.ts b/libs/common/src/admin-console/models/domain/encrypted-organization-key.ts index 1f8c4e8c42d..5f8fe3349b6 100644 --- a/libs/common/src/admin-console/models/domain/encrypted-organization-key.ts +++ b/libs/common/src/admin-console/models/domain/encrypted-organization-key.ts @@ -1,4 +1,4 @@ -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { EncString } from "../../../platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; import { OrgKey, UserPrivateKey } from "../../../types/key"; diff --git a/libs/common/src/auth/abstractions/sso-login.service.abstraction.ts b/libs/common/src/auth/abstractions/sso-login.service.abstraction.ts index bf64dcafd69..b30739d94a8 100644 --- a/libs/common/src/auth/abstractions/sso-login.service.abstraction.ts +++ b/libs/common/src/auth/abstractions/sso-login.service.abstraction.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { UserId } from "@bitwarden/common/types/guid"; export abstract class SsoLoginServiceAbstraction { @@ -13,7 +11,7 @@ export abstract class SsoLoginServiceAbstraction { * @see https://datatracker.ietf.org/doc/html/rfc7636 * @returns The code verifier used for SSO. */ - getCodeVerifier: () => Promise; + abstract getCodeVerifier: () => Promise; /** * Sets the code verifier used for SSO. * @@ -23,7 +21,7 @@ export abstract class SsoLoginServiceAbstraction { * and verify it matches the one sent in the request for the `authorization_code`. * @see https://datatracker.ietf.org/doc/html/rfc7636 */ - setCodeVerifier: (codeVerifier: string) => Promise; + abstract setCodeVerifier: (codeVerifier: string) => Promise; /** * Gets the value of the SSO state. * @@ -33,7 +31,7 @@ export abstract class SsoLoginServiceAbstraction { * @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1 * @returns The SSO state. */ - getSsoState: () => Promise; + abstract getSsoState: () => Promise; /** * Sets the value of the SSO state. * @@ -42,7 +40,7 @@ export abstract class SsoLoginServiceAbstraction { * returns the `state` in the callback and the client verifies that the value returned matches the value sent. * @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1 */ - setSsoState: (ssoState: string) => Promise; + abstract setSsoState: (ssoState: string) => Promise; /** * Gets the value of the user's organization sso identifier. * @@ -50,20 +48,20 @@ export abstract class SsoLoginServiceAbstraction { * Do not use this value outside of the SSO login flow. * @returns The user's organization identifier. */ - getOrganizationSsoIdentifier: () => Promise; + abstract getOrganizationSsoIdentifier: () => Promise; /** * Sets the value of the user's organization sso identifier. * * This should only be used during the SSO flow to identify the organization that the user is attempting to log in to. * Do not use this value outside of the SSO login flow. */ - setOrganizationSsoIdentifier: (organizationIdentifier: string) => Promise; + abstract setOrganizationSsoIdentifier: (organizationIdentifier: string) => Promise; /** * Gets the user's email. * Note: This should only be used during the SSO flow to identify the user that is attempting to log in. * @returns The user's email. */ - getSsoEmail: () => Promise; + abstract getSsoEmail: () => Promise; /** * Sets the user's email. * Note: This should only be used during the SSO flow to identify the user that is attempting to log in. @@ -71,20 +69,20 @@ export abstract class SsoLoginServiceAbstraction { * @returns A promise that resolves when the email has been set. * */ - setSsoEmail: (email: string) => Promise; + abstract setSsoEmail: (email: string) => Promise; /** * Gets the value of the active user's organization sso identifier. * * This should only be used post successful SSO login once the user is initialized. * @param userId The user id for retrieving the org identifier state. */ - getActiveUserOrganizationSsoIdentifier: (userId: UserId) => Promise; + abstract getActiveUserOrganizationSsoIdentifier: (userId: UserId) => Promise; /** * Sets the value of the active user's organization sso identifier. * * This should only be used post successful SSO login once the user is initialized. */ - setActiveUserOrganizationSsoIdentifier: ( + abstract setActiveUserOrganizationSsoIdentifier: ( organizationIdentifier: string, userId: UserId | undefined, ) => Promise; diff --git a/libs/common/src/auth/services/device-trust.service.implementation.ts b/libs/common/src/auth/services/device-trust.service.implementation.ts index 15c12b7a39a..903c72d4211 100644 --- a/libs/common/src/auth/services/device-trust.service.implementation.ts +++ b/libs/common/src/auth/services/device-trust.service.implementation.ts @@ -7,10 +7,10 @@ import { UserDecryptionOptionsServiceAbstraction } from "@bitwarden/auth/common" // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports import { KeyService } from "../../../../key-management/src/abstractions/key.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { AppIdService } from "../../platform/abstractions/app-id.service"; import { ConfigService } from "../../platform/abstractions/config/config.service"; import { CryptoFunctionService } from "../../platform/abstractions/crypto-function.service"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; import { LogService } from "../../platform/abstractions/log.service"; diff --git a/libs/common/src/auth/services/device-trust.service.spec.ts b/libs/common/src/auth/services/device-trust.service.spec.ts index 9f344e203c9..06da1396074 100644 --- a/libs/common/src/auth/services/device-trust.service.spec.ts +++ b/libs/common/src/auth/services/device-trust.service.spec.ts @@ -15,10 +15,10 @@ import { FakeAccountService, mockAccountServiceWith } from "../../../spec/fake-a import { FakeActiveUserState } from "../../../spec/fake-state"; import { FakeStateProvider } from "../../../spec/fake-state-provider"; import { DeviceType } from "../../enums"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { AppIdService } from "../../platform/abstractions/app-id.service"; import { ConfigService } from "../../platform/abstractions/config/config.service"; import { CryptoFunctionService } from "../../platform/abstractions/crypto-function.service"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; import { LogService } from "../../platform/abstractions/log.service"; diff --git a/libs/common/src/auth/services/master-password/master-password.service.ts b/libs/common/src/auth/services/master-password/master-password.service.ts index 14e7522a836..9b5ce588bd3 100644 --- a/libs/common/src/auth/services/master-password/master-password.service.ts +++ b/libs/common/src/auth/services/master-password/master-password.service.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { firstValueFrom, map, Observable } from "rxjs"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { KeyGenerationService } from "../../../platform/abstractions/key-generation.service"; import { LogService } from "../../../platform/abstractions/log.service"; import { StateService } from "../../../platform/abstractions/state.service"; diff --git a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts index ddd24ae7907..8953d14c8e6 100644 --- a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts +++ b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts @@ -8,7 +8,7 @@ import { OrganizationUserApiService } from "@bitwarden/admin-console/common"; import { KeyService } from "../../../../key-management/src/abstractions/key.service"; import { OrganizationApiServiceAbstraction } from "../../admin-console/abstractions/organization/organization-api.service.abstraction"; import { OrganizationAutoEnrollStatusResponse } from "../../admin-console/models/response/organization-auto-enroll-status.response"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { UserId } from "../../types/guid"; import { Account, AccountInfo, AccountService } from "../abstractions/account.service"; diff --git a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts index 22d5384e6ac..c0a961d5bbb 100644 --- a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts +++ b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts @@ -11,7 +11,7 @@ import { // eslint-disable-next-line no-restricted-imports import { KeyService } from "../../../../key-management/src/abstractions/key.service"; import { OrganizationApiServiceAbstraction } from "../../admin-console/abstractions/organization/organization-api.service.abstraction"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { Utils } from "../../platform/misc/utils"; import { UserKey } from "../../types/key"; diff --git a/libs/common/src/auth/services/sso-login.service.spec.ts b/libs/common/src/auth/services/sso-login.service.spec.ts index 9cf49a07834..6764755e6ca 100644 --- a/libs/common/src/auth/services/sso-login.service.spec.ts +++ b/libs/common/src/auth/services/sso-login.service.spec.ts @@ -87,7 +87,7 @@ describe("SSOLoginService ", () => { const orgIdentifier = "test-active-org-identifier"; await sut.setActiveUserOrganizationSsoIdentifier(orgIdentifier, undefined); - expect(mockLogService.warning).toHaveBeenCalledWith( + expect(mockLogService.error).toHaveBeenCalledWith( "Tried to set a user organization sso identifier with an undefined user id.", ); }); diff --git a/libs/common/src/auth/services/sso-login.service.ts b/libs/common/src/auth/services/sso-login.service.ts index c73be3630be..9b4b8656782 100644 --- a/libs/common/src/auth/services/sso-login.service.ts +++ b/libs/common/src/auth/services/sso-login.service.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { firstValueFrom } from "rxjs"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -75,7 +73,7 @@ export class SsoLoginService implements SsoLoginServiceAbstraction { this.ssoEmailState = this.stateProvider.getGlobal(SSO_EMAIL); } - getCodeVerifier(): Promise { + getCodeVerifier(): Promise { return firstValueFrom(this.codeVerifierState.state$); } @@ -83,7 +81,7 @@ export class SsoLoginService implements SsoLoginServiceAbstraction { await this.codeVerifierState.update((_) => codeVerifier); } - getSsoState(): Promise { + getSsoState(): Promise { return firstValueFrom(this.ssoState.state$); } @@ -91,7 +89,7 @@ export class SsoLoginService implements SsoLoginServiceAbstraction { await this.ssoState.update((_) => ssoState); } - getOrganizationSsoIdentifier(): Promise { + getOrganizationSsoIdentifier(): Promise { return firstValueFrom(this.orgSsoIdentifierState.state$); } @@ -99,7 +97,7 @@ export class SsoLoginService implements SsoLoginServiceAbstraction { await this.orgSsoIdentifierState.update((_) => organizationIdentifier); } - getSsoEmail(): Promise { + getSsoEmail(): Promise { return firstValueFrom(this.ssoEmailState.state$); } @@ -107,7 +105,7 @@ export class SsoLoginService implements SsoLoginServiceAbstraction { await this.ssoEmailState.update((_) => email); } - getActiveUserOrganizationSsoIdentifier(userId: UserId): Promise { + getActiveUserOrganizationSsoIdentifier(userId: UserId): Promise { return firstValueFrom(this.userOrgSsoIdentifierState(userId).state$); } @@ -116,7 +114,7 @@ export class SsoLoginService implements SsoLoginServiceAbstraction { userId: UserId | undefined, ): Promise { if (userId === undefined) { - this.logService.warning( + this.logService.error( "Tried to set a user organization sso identifier with an undefined user id.", ); return; diff --git a/libs/common/src/auth/services/token.service.spec.ts b/libs/common/src/auth/services/token.service.spec.ts index f8882e1b118..339f570a003 100644 --- a/libs/common/src/auth/services/token.service.spec.ts +++ b/libs/common/src/auth/services/token.service.spec.ts @@ -5,7 +5,7 @@ import { LogoutReason } from "@bitwarden/auth/common"; import { FakeSingleUserStateProvider, FakeGlobalStateProvider } from "../../../spec"; import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; import { LogService } from "../../platform/abstractions/log.service"; import { AbstractStorageService } from "../../platform/abstractions/storage.service"; diff --git a/libs/common/src/auth/services/token.service.ts b/libs/common/src/auth/services/token.service.ts index 4b7cc2cab01..72e082f2002 100644 --- a/libs/common/src/auth/services/token.service.ts +++ b/libs/common/src/auth/services/token.service.ts @@ -6,7 +6,7 @@ import { Opaque } from "type-fest"; import { LogoutReason, decodeJwtTokenToJson } from "@bitwarden/auth/common"; import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; import { LogService } from "../../platform/abstractions/log.service"; import { AbstractStorageService } from "../../platform/abstractions/storage.service"; diff --git a/libs/common/src/billing/services/organization-billing.service.ts b/libs/common/src/billing/services/organization-billing.service.ts index e61b092d677..83efbf0a30c 100644 --- a/libs/common/src/billing/services/organization-billing.service.ts +++ b/libs/common/src/billing/services/organization-billing.service.ts @@ -7,7 +7,7 @@ import { OrganizationApiServiceAbstraction as OrganizationApiService } from "../ import { OrganizationCreateRequest } from "../../admin-console/models/request/organization-create.request"; import { OrganizationKeysRequest } from "../../admin-console/models/request/organization-keys.request"; import { OrganizationResponse } from "../../admin-console/models/response/organization.response"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { EncString } from "../../platform/models/domain/enc-string"; import { SyncService } from "../../platform/sync"; diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index 292aecc096b..a8e036c82d6 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -26,7 +26,6 @@ export enum FeatureFlag { /* Tools */ ItemShare = "item-share", - GeneratorToolsModernization = "generator-tools-modernization", CriticalApps = "pm-14466-risk-insights-critical-application", EnableRiskInsightsNotifications = "enable-risk-insights-notifications", @@ -49,6 +48,7 @@ export enum FeatureFlag { PM9111ExtensionPersistAddEditForm = "pm-9111-extension-persist-add-edit-form", 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", } @@ -87,7 +87,6 @@ export const DefaultFeatureFlagValue = { /* Tools */ [FeatureFlag.ItemShare]: FALSE, - [FeatureFlag.GeneratorToolsModernization]: FALSE, [FeatureFlag.CriticalApps]: FALSE, [FeatureFlag.EnableRiskInsightsNotifications]: FALSE, @@ -110,6 +109,7 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.PM9111ExtensionPersistAddEditForm]: FALSE, [FeatureFlag.PrivateKeyRegeneration]: FALSE, [FeatureFlag.ResellerManagedOrgAlert]: FALSE, + [FeatureFlag.AccountDeprovisioningBanner]: FALSE, [FeatureFlag.NewDeviceVerification]: FALSE, [FeatureFlag.PM15179_AddExistingOrgsFromProviderPortal]: FALSE, } satisfies Record; diff --git a/libs/common/src/key-management/crypto/abstractions/bulk-encrypt.service.ts b/libs/common/src/key-management/crypto/abstractions/bulk-encrypt.service.ts new file mode 100644 index 00000000000..3e47ccdb5f2 --- /dev/null +++ b/libs/common/src/key-management/crypto/abstractions/bulk-encrypt.service.ts @@ -0,0 +1,10 @@ +import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; +import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; + +export abstract class BulkEncryptService { + abstract decryptItems( + items: Decryptable[], + key: SymmetricCryptoKey, + ): Promise; +} diff --git a/libs/common/src/platform/abstractions/encrypt.service.ts b/libs/common/src/key-management/crypto/abstractions/encrypt.service.ts similarity index 82% rename from libs/common/src/platform/abstractions/encrypt.service.ts rename to libs/common/src/key-management/crypto/abstractions/encrypt.service.ts index a660524699d..e00d053ce7b 100644 --- a/libs/common/src/platform/abstractions/encrypt.service.ts +++ b/libs/common/src/key-management/crypto/abstractions/encrypt.service.ts @@ -1,9 +1,9 @@ -import { Decryptable } from "../interfaces/decryptable.interface"; -import { Encrypted } from "../interfaces/encrypted"; -import { InitializerMetadata } from "../interfaces/initializer-metadata.interface"; -import { EncArrayBuffer } from "../models/domain/enc-array-buffer"; -import { EncString } from "../models/domain/enc-string"; -import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; +import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; +import { Encrypted } from "@bitwarden/common/platform/interfaces/encrypted"; +import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; +import { EncArrayBuffer } from "@bitwarden/common/platform/models/domain/enc-array-buffer"; +import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; export abstract class EncryptService { abstract encrypt(plainValue: string | Uint8Array, key: SymmetricCryptoKey): Promise; diff --git a/libs/common/src/platform/services/cryptography/bulk-encrypt.service.implementation.ts b/libs/common/src/key-management/crypto/services/bulk-encrypt.service.implementation.ts similarity index 84% rename from libs/common/src/platform/services/cryptography/bulk-encrypt.service.implementation.ts rename to libs/common/src/key-management/crypto/services/bulk-encrypt.service.implementation.ts index 1320fbae0e0..1d1e0f52279 100644 --- a/libs/common/src/platform/services/cryptography/bulk-encrypt.service.implementation.ts +++ b/libs/common/src/key-management/crypto/services/bulk-encrypt.service.implementation.ts @@ -3,15 +3,14 @@ import { firstValueFrom, fromEvent, filter, map, takeUntil, defaultIfEmpty, Subject } from "rxjs"; import { Jsonify } from "type-fest"; -import { BulkEncryptService } from "../../abstractions/bulk-encrypt.service"; -import { CryptoFunctionService } from "../../abstractions/crypto-function.service"; -import { LogService } from "../../abstractions/log.service"; -import { Decryptable } from "../../interfaces/decryptable.interface"; -import { InitializerMetadata } from "../../interfaces/initializer-metadata.interface"; -import { Utils } from "../../misc/utils"; -import { SymmetricCryptoKey } from "../../models/domain/symmetric-crypto-key"; - -import { getClassInitializer } from "./get-class-initializer"; +import { BulkEncryptService } from "@bitwarden/common/key-management/crypto/abstractions/bulk-encrypt.service"; +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; +import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { getClassInitializer } from "@bitwarden/common/platform/services/cryptography/get-class-initializer"; // TTL (time to live) is not strictly required but avoids tying up memory resources if inactive const workerTTL = 60000; // 1 minute @@ -88,7 +87,7 @@ export class BulkEncryptServiceImplementation implements BulkEncryptService { new Worker( new URL( /* webpackChunkName: 'encrypt-worker' */ - "@bitwarden/common/platform/services/cryptography/encrypt.worker.ts", + "@bitwarden/common/key-management/crypto/services/encrypt.worker.ts", import.meta.url, ), ), diff --git a/libs/common/src/platform/services/cryptography/encrypt.service.implementation.ts b/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts similarity index 90% rename from libs/common/src/platform/services/cryptography/encrypt.service.implementation.ts rename to libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts index 68263cadf27..075b9da4964 100644 --- a/libs/common/src/platform/services/cryptography/encrypt.service.implementation.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts @@ -1,17 +1,21 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Utils } from "../../../platform/misc/utils"; -import { CryptoFunctionService } from "../../abstractions/crypto-function.service"; -import { EncryptService } from "../../abstractions/encrypt.service"; -import { LogService } from "../../abstractions/log.service"; -import { EncryptionType, encryptionTypeToString as encryptionTypeName } from "../../enums"; -import { Decryptable } from "../../interfaces/decryptable.interface"; -import { Encrypted } from "../../interfaces/encrypted"; -import { InitializerMetadata } from "../../interfaces/initializer-metadata.interface"; -import { EncArrayBuffer } from "../../models/domain/enc-array-buffer"; -import { EncString } from "../../models/domain/enc-string"; -import { EncryptedObject } from "../../models/domain/encrypted-object"; -import { SymmetricCryptoKey } from "../../models/domain/symmetric-crypto-key"; +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { + EncryptionType, + encryptionTypeToString as encryptionTypeName, +} from "@bitwarden/common/platform/enums"; +import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; +import { Encrypted } from "@bitwarden/common/platform/interfaces/encrypted"; +import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { EncArrayBuffer } from "@bitwarden/common/platform/models/domain/enc-array-buffer"; +import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { EncryptedObject } from "@bitwarden/common/platform/models/domain/encrypted-object"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; + +import { EncryptService } from "../abstractions/encrypt.service"; export class EncryptServiceImplementation implements EncryptService { constructor( diff --git a/libs/common/src/platform/services/encrypt.service.spec.ts b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts similarity index 91% rename from libs/common/src/platform/services/encrypt.service.spec.ts rename to libs/common/src/key-management/crypto/services/encrypt.service.spec.ts index 609b5100a10..8d75b528596 100644 --- a/libs/common/src/platform/services/encrypt.service.spec.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts @@ -1,15 +1,17 @@ import { mockReset, mock } from "jest-mock-extended"; -import { makeStaticByteArray } from "../../../spec"; -import { CsprngArray } from "../../types/csprng"; -import { CryptoFunctionService } from "../abstractions/crypto-function.service"; -import { LogService } from "../abstractions/log.service"; -import { EncryptionType } from "../enums"; -import { Utils } from "../misc/utils"; -import { EncArrayBuffer } from "../models/domain/enc-array-buffer"; -import { EncString } from "../models/domain/enc-string"; -import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; -import { EncryptServiceImplementation } from "../services/cryptography/encrypt.service.implementation"; +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { EncryptionType } from "@bitwarden/common/platform/enums"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { EncArrayBuffer } from "@bitwarden/common/platform/models/domain/enc-array-buffer"; +import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { CsprngArray } from "@bitwarden/common/types/csprng"; + +import { makeStaticByteArray } from "../../../../spec"; + +import { EncryptServiceImplementation } from "./encrypt.service.implementation"; describe("EncryptService", () => { const cryptoFunctionService = mock(); diff --git a/libs/common/src/platform/services/cryptography/encrypt.worker.ts b/libs/common/src/key-management/crypto/services/encrypt.worker.ts similarity index 71% rename from libs/common/src/platform/services/cryptography/encrypt.worker.ts rename to libs/common/src/key-management/crypto/services/encrypt.worker.ts index a293e1c6bb0..84ffcf56934 100644 --- a/libs/common/src/platform/services/cryptography/encrypt.worker.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.worker.ts @@ -2,14 +2,14 @@ // @ts-strict-ignore import { Jsonify } from "type-fest"; -import { Decryptable } from "../../interfaces/decryptable.interface"; -import { SymmetricCryptoKey } from "../../models/domain/symmetric-crypto-key"; -import { ConsoleLogService } from "../console-log.service"; -import { ContainerService } from "../container.service"; -import { WebCryptoFunctionService } from "../web-crypto-function.service"; +import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; +import { ContainerService } from "@bitwarden/common/platform/services/container.service"; +import { getClassInitializer } from "@bitwarden/common/platform/services/cryptography/get-class-initializer"; +import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service"; import { EncryptServiceImplementation } from "./encrypt.service.implementation"; -import { getClassInitializer } from "./get-class-initializer"; const workerApi: Worker = self as any; diff --git a/libs/common/src/platform/services/cryptography/fallback-bulk-encrypt.service.ts b/libs/common/src/key-management/crypto/services/fallback-bulk-encrypt.service.ts similarity index 68% rename from libs/common/src/platform/services/cryptography/fallback-bulk-encrypt.service.ts rename to libs/common/src/key-management/crypto/services/fallback-bulk-encrypt.service.ts index 7a4fd8f3c1d..80fdd27895d 100644 --- a/libs/common/src/platform/services/cryptography/fallback-bulk-encrypt.service.ts +++ b/libs/common/src/key-management/crypto/services/fallback-bulk-encrypt.service.ts @@ -1,10 +1,11 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { BulkEncryptService } from "../../abstractions/bulk-encrypt.service"; -import { EncryptService } from "../../abstractions/encrypt.service"; -import { Decryptable } from "../../interfaces/decryptable.interface"; -import { InitializerMetadata } from "../../interfaces/initializer-metadata.interface"; -import { SymmetricCryptoKey } from "../../models/domain/symmetric-crypto-key"; +import { BulkEncryptService } from "@bitwarden/common/key-management/crypto/abstractions/bulk-encrypt.service"; +import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; +import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; + +import { EncryptService } from "../abstractions/encrypt.service"; /** * @deprecated For the feature flag from PM-4154, remove once feature is rolled out diff --git a/libs/common/src/platform/services/cryptography/multithread-encrypt.service.implementation.ts b/libs/common/src/key-management/crypto/services/multithread-encrypt.service.implementation.ts similarity index 81% rename from libs/common/src/platform/services/cryptography/multithread-encrypt.service.implementation.ts rename to libs/common/src/key-management/crypto/services/multithread-encrypt.service.implementation.ts index 100dcf152e6..0bf96851563 100644 --- a/libs/common/src/platform/services/cryptography/multithread-encrypt.service.implementation.ts +++ b/libs/common/src/key-management/crypto/services/multithread-encrypt.service.implementation.ts @@ -3,13 +3,13 @@ import { defaultIfEmpty, filter, firstValueFrom, fromEvent, map, Subject, takeUntil } from "rxjs"; import { Jsonify } from "type-fest"; -import { Utils } from "../../../platform/misc/utils"; -import { Decryptable } from "../../interfaces/decryptable.interface"; -import { InitializerMetadata } from "../../interfaces/initializer-metadata.interface"; -import { SymmetricCryptoKey } from "../../models/domain/symmetric-crypto-key"; +import { Decryptable } from "@bitwarden/common/platform/interfaces/decryptable.interface"; +import { InitializerMetadata } from "@bitwarden/common/platform/interfaces/initializer-metadata.interface"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { getClassInitializer } from "@bitwarden/common/platform/services/cryptography/get-class-initializer"; import { EncryptServiceImplementation } from "./encrypt.service.implementation"; -import { getClassInitializer } from "./get-class-initializer"; // TTL (time to live) is not strictly required but avoids tying up memory resources if inactive const workerTTL = 3 * 60000; // 3 minutes @@ -40,7 +40,7 @@ export class MultithreadEncryptServiceImplementation extends EncryptServiceImple this.worker ??= new Worker( new URL( /* webpackChunkName: 'encrypt-worker' */ - "@bitwarden/common/platform/services/cryptography/encrypt.worker.ts", + "@bitwarden/common/key-management/crypto/services/encrypt.worker.ts", import.meta.url, ), ); diff --git a/libs/common/src/platform/abstractions/bulk-encrypt.service.ts b/libs/common/src/platform/abstractions/bulk-encrypt.service.ts deleted file mode 100644 index 4cdff0c769a..00000000000 --- a/libs/common/src/platform/abstractions/bulk-encrypt.service.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Decryptable } from "../interfaces/decryptable.interface"; -import { InitializerMetadata } from "../interfaces/initializer-metadata.interface"; -import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; - -export abstract class BulkEncryptService { - abstract decryptItems( - items: Decryptable[], - key: SymmetricCryptoKey, - ): Promise; -} diff --git a/libs/common/src/platform/misc/utils.ts b/libs/common/src/platform/misc/utils.ts index f654897e9e2..eaa8f0a813a 100644 --- a/libs/common/src/platform/misc/utils.ts +++ b/libs/common/src/platform/misc/utils.ts @@ -11,7 +11,7 @@ import { Merge } from "type-fest"; // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports import { KeyService } from "../../../../key-management/src/abstractions/key.service"; -import { EncryptService } from "../abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../abstractions/i18n.service"; // FIXME: Remove when updating file. Eslint update diff --git a/libs/common/src/platform/models/domain/domain-base.spec.ts b/libs/common/src/platform/models/domain/domain-base.spec.ts index 80a4e5e8606..0c13f9a2119 100644 --- a/libs/common/src/platform/models/domain/domain-base.spec.ts +++ b/libs/common/src/platform/models/domain/domain-base.spec.ts @@ -1,7 +1,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { makeEncString, makeSymmetricCryptoKey } from "../../../../spec"; -import { EncryptService } from "../../abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { Utils } from "../../misc/utils"; import Domain from "./domain-base"; diff --git a/libs/common/src/platform/models/domain/domain-base.ts b/libs/common/src/platform/models/domain/domain-base.ts index 110a1dc7208..192034254b9 100644 --- a/libs/common/src/platform/models/domain/domain-base.ts +++ b/libs/common/src/platform/models/domain/domain-base.ts @@ -2,8 +2,8 @@ // @ts-strict-ignore import { ConditionalExcept, ConditionalKeys, Constructor } from "type-fest"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { View } from "../../../models/view/view"; -import { EncryptService } from "../../abstractions/encrypt.service"; import { EncString } from "./enc-string"; import { SymmetricCryptoKey } from "./symmetric-crypto-key"; diff --git a/libs/common/src/platform/models/domain/enc-string.spec.ts b/libs/common/src/platform/models/domain/enc-string.spec.ts index b4916b9f70a..9af19d36015 100644 --- a/libs/common/src/platform/models/domain/enc-string.spec.ts +++ b/libs/common/src/platform/models/domain/enc-string.spec.ts @@ -4,7 +4,7 @@ import { mock, MockProxy } from "jest-mock-extended"; // eslint-disable-next-line no-restricted-imports import { KeyService } from "../../../../../key-management/src/abstractions/key.service"; import { makeEncString, makeStaticByteArray } from "../../../../spec"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; import { UserKey, OrgKey } from "../../../types/key"; import { EncryptionType } from "../../enums"; diff --git a/libs/common/src/platform/models/domain/enc-string.ts b/libs/common/src/platform/models/domain/enc-string.ts index f148664a4f9..a8fee428b13 100644 --- a/libs/common/src/platform/models/domain/enc-string.ts +++ b/libs/common/src/platform/models/domain/enc-string.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { Jsonify, Opaque } from "type-fest"; -import { EncryptService } from "../../abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { EncryptionType, EXPECTED_NUM_PARTS_BY_ENCRYPTION_TYPE } from "../../enums"; import { Encrypted } from "../../interfaces/encrypted"; import { Utils } from "../../misc/utils"; diff --git a/libs/common/src/platform/services/container.service.ts b/libs/common/src/platform/services/container.service.ts index c3e727a2e1e..7421de8cc2c 100644 --- a/libs/common/src/platform/services/container.service.ts +++ b/libs/common/src/platform/services/container.service.ts @@ -1,7 +1,7 @@ // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports import { KeyService } from "../../../../key-management/src/abstractions/key.service"; -import { EncryptService } from "../abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; export class ContainerService { constructor( diff --git a/libs/common/src/platform/state/global-state.ts b/libs/common/src/platform/state/global-state.ts index 82a6e2b348c..b2ac634df24 100644 --- a/libs/common/src/platform/state/global-state.ts +++ b/libs/common/src/platform/state/global-state.ts @@ -18,13 +18,13 @@ export interface GlobalState { * Resolves to the new state. If `shouldUpdate` returns false, the promise will resolve to the current state. */ update: ( - configureState: (state: T, dependency: TCombine) => T, + configureState: (state: T | null, dependency: TCombine) => T | null, options?: StateUpdateOptions, - ) => Promise; + ) => Promise; /** * An observable stream of this state, the first emission of this will be the current state on disk * and subsequent updates will be from an update to that state. */ - state$: Observable; + state$: Observable; } diff --git a/libs/common/src/platform/state/implementations/default-single-user-state.ts b/libs/common/src/platform/state/implementations/default-single-user-state.ts index 4cfba1ffa95..1dafd3aecad 100644 --- a/libs/common/src/platform/state/implementations/default-single-user-state.ts +++ b/libs/common/src/platform/state/implementations/default-single-user-state.ts @@ -16,7 +16,7 @@ export class DefaultSingleUserState extends StateBase> implements SingleUserState { - readonly combinedState$: Observable>; + readonly combinedState$: Observable>; constructor( readonly userId: UserId, diff --git a/libs/common/src/platform/state/implementations/default-state.provider.ts b/libs/common/src/platform/state/implementations/default-state.provider.ts index f86ba11b268..31795767979 100644 --- a/libs/common/src/platform/state/implementations/default-state.provider.ts +++ b/libs/common/src/platform/state/implementations/default-state.provider.ts @@ -54,9 +54,9 @@ export class DefaultStateProvider implements StateProvider { async setUserState( userKeyDefinition: UserKeyDefinition, - value: T, + value: T | null, userId?: UserId, - ): Promise<[UserId, T]> { + ): Promise<[UserId, T | null]> { if (userId) { return [userId, await this.getUser(userId, userKeyDefinition).update(() => value)]; } else { diff --git a/libs/common/src/platform/state/implementations/state-base.ts b/libs/common/src/platform/state/implementations/state-base.ts index f285963d6e6..578720a2281 100644 --- a/libs/common/src/platform/state/implementations/state-base.ts +++ b/libs/common/src/platform/state/implementations/state-base.ts @@ -1,12 +1,12 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { - Observable, - ReplaySubject, defer, filter, firstValueFrom, merge, + Observable, + ReplaySubject, share, switchMap, tap, @@ -22,7 +22,7 @@ import { ObservableStorageService, } from "../../abstractions/storage.service"; import { DebugOptions } from "../key-definition"; -import { StateUpdateOptions, populateOptionsWithDefault } from "../state-update-options"; +import { populateOptionsWithDefault, StateUpdateOptions } from "../state-update-options"; import { getStoredValue } from "./util"; @@ -36,7 +36,7 @@ type KeyDefinitionRequirements = { export abstract class StateBase> { private updatePromise: Promise; - readonly state$: Observable; + readonly state$: Observable; constructor( protected readonly key: StorageKey, @@ -86,9 +86,9 @@ export abstract class StateBase> } async update( - configureState: (state: T, dependency: TCombine) => T, + configureState: (state: T | null, dependency: TCombine) => T | null, options: StateUpdateOptions = {}, - ): Promise { + ): Promise { options = populateOptionsWithDefault(options); if (this.updatePromise != null) { await this.updatePromise; @@ -96,17 +96,16 @@ export abstract class StateBase> try { this.updatePromise = this.internalUpdate(configureState, options); - const newState = await this.updatePromise; - return newState; + return await this.updatePromise; } finally { this.updatePromise = null; } } private async internalUpdate( - configureState: (state: T, dependency: TCombine) => T, + configureState: (state: T | null, dependency: TCombine) => T | null, options: StateUpdateOptions, - ): Promise { + ): Promise { const currentState = await this.getStateForUpdate(); const combinedDependencies = options.combineLatestWith != null @@ -122,7 +121,7 @@ export abstract class StateBase> return newState; } - protected async doStorageSave(newState: T, oldState: T) { + protected async doStorageSave(newState: T | null, oldState: T) { if (this.keyDefinition.debug.enableUpdateLogging) { this.logService.info( `Updating '${this.key}' from ${oldState == null ? "null" : "non-null"} to ${newState == null ? "null" : "non-null"}`, diff --git a/libs/common/src/platform/state/state-definitions.ts b/libs/common/src/platform/state/state-definitions.ts index c83119d9ad4..c7901bc34e2 100644 --- a/libs/common/src/platform/state/state-definitions.ts +++ b/libs/common/src/platform/state/state-definitions.ts @@ -29,9 +29,20 @@ export const ORGANIZATION_MANAGEMENT_PREFERENCES_DISK = new StateDefinition( web: "disk-local", }, ); -export const AC_BANNERS_DISMISSED_DISK = new StateDefinition("acBannersDismissed", "disk", { - web: "disk-local", -}); +export const ACCOUNT_DEPROVISIONING_BANNER_DISK = new StateDefinition( + "showAccountDeprovisioningBanner", + "disk", + { + web: "disk-local", + }, +); +export const DELETE_MANAGED_USER_WARNING = new StateDefinition( + "showDeleteManagedUserWarning", + "disk", + { + web: "disk-local", + }, +); // Billing export const BILLING_DISK = new StateDefinition("billing", "disk"); diff --git a/libs/common/src/platform/state/state.provider.ts b/libs/common/src/platform/state/state.provider.ts index 44736500afc..dc8cb3e9359 100644 --- a/libs/common/src/platform/state/state.provider.ts +++ b/libs/common/src/platform/state/state.provider.ts @@ -60,9 +60,9 @@ export abstract class StateProvider { */ abstract setUserState( keyDefinition: UserKeyDefinition, - value: T, + value: T | null, userId?: UserId, - ): Promise<[UserId, T]>; + ): Promise<[UserId, T | null]>; /** @see{@link ActiveUserStateProvider.get} */ abstract getActive(userKeyDefinition: UserKeyDefinition): ActiveUserState; diff --git a/libs/common/src/platform/state/user-state.ts b/libs/common/src/platform/state/user-state.ts index 22c255eb985..26fa6f83fa3 100644 --- a/libs/common/src/platform/state/user-state.ts +++ b/libs/common/src/platform/state/user-state.ts @@ -12,7 +12,7 @@ export interface UserState { readonly state$: Observable; /** Emits a stream of tuples, with the first element being a user id and the second element being the data for that user. */ - readonly combinedState$: Observable>; + readonly combinedState$: Observable>; } export const activeMarker: unique symbol = Symbol("active"); @@ -38,9 +38,9 @@ export interface ActiveUserState extends UserState { * Resolves to the new state. If `shouldUpdate` returns false, the promise will resolve to the current state. */ readonly update: ( - configureState: (state: T, dependencies: TCombine) => T, + configureState: (state: T | null, dependencies: TCombine) => T | null, options?: StateUpdateOptions, - ) => Promise<[UserId, T]>; + ) => Promise<[UserId, T | null]>; } export interface SingleUserState extends UserState { @@ -58,7 +58,7 @@ export interface SingleUserState extends UserState { * Resolves to the new state. If `shouldUpdate` returns false, the promise will resolve to the current state. */ readonly update: ( - configureState: (state: T, dependencies: TCombine) => T, + configureState: (state: T | null, dependencies: TCombine) => T | null, options?: StateUpdateOptions, - ) => Promise; + ) => Promise; } diff --git a/libs/common/src/platform/theming/theme-state.service.ts b/libs/common/src/platform/theming/theme-state.service.ts index bb146be4927..df2c96c49d0 100644 --- a/libs/common/src/platform/theming/theme-state.service.ts +++ b/libs/common/src/platform/theming/theme-state.service.ts @@ -32,7 +32,11 @@ export class DefaultThemeStateService implements ThemeStateService { map(([theme, isExtensionRefresh]) => { // The extension refresh should not allow for Nord or SolarizedDark // Default the user to their system theme - if (isExtensionRefresh && [ThemeType.Nord, ThemeType.SolarizedDark].includes(theme)) { + if ( + isExtensionRefresh && + theme != null && + [ThemeType.Nord, ThemeType.SolarizedDark].includes(theme) + ) { return ThemeType.System; } diff --git a/libs/common/src/state-migrations/migrate.ts b/libs/common/src/state-migrations/migrate.ts index 169de447f10..b409f52d936 100644 --- a/libs/common/src/state-migrations/migrate.ts +++ b/libs/common/src/state-migrations/migrate.ts @@ -68,12 +68,13 @@ import { RemoveUnassignedItemsBannerDismissed } from "./migrations/67-remove-una import { MoveLastSyncDate } from "./migrations/68-move-last-sync-date"; import { MigrateIncorrectFolderKey } from "./migrations/69-migrate-incorrect-folder-key"; import { MoveBiometricAutoPromptToAccount } from "./migrations/7-move-biometric-auto-prompt-to-account"; +import { RemoveAcBannersDismissed } from "./migrations/70-remove-ac-banner-dismissed"; import { MoveStateVersionMigrator } from "./migrations/8-move-state-version"; import { MoveBrowserSettingsToGlobal } from "./migrations/9-move-browser-settings-to-global"; import { MinVersionMigrator } from "./migrations/min-version"; export const MIN_VERSION = 3; -export const CURRENT_VERSION = 69; +export const CURRENT_VERSION = 70; export type MinVersion = typeof MIN_VERSION; export function createMigrationBuilder() { @@ -144,7 +145,8 @@ export function createMigrationBuilder() { .with(MoveFinalDesktopSettingsMigrator, 65, 66) .with(RemoveUnassignedItemsBannerDismissed, 66, 67) .with(MoveLastSyncDate, 67, 68) - .with(MigrateIncorrectFolderKey, 68, CURRENT_VERSION); + .with(MigrateIncorrectFolderKey, 68, 69) + .with(RemoveAcBannersDismissed, 69, CURRENT_VERSION); } export async function currentVersion( diff --git a/libs/common/src/state-migrations/migrations/70-remove-ac-banner-dismissed.spec.ts b/libs/common/src/state-migrations/migrations/70-remove-ac-banner-dismissed.spec.ts new file mode 100644 index 00000000000..59f39d195e9 --- /dev/null +++ b/libs/common/src/state-migrations/migrations/70-remove-ac-banner-dismissed.spec.ts @@ -0,0 +1,50 @@ +import { runMigrator } from "../migration-helper.spec"; +import { IRREVERSIBLE } from "../migrator"; + +import { RemoveAcBannersDismissed } from "./70-remove-ac-banner-dismissed"; + +describe("RemoveAcBannersDismissed", () => { + const sut = new RemoveAcBannersDismissed(69, 70); + + describe("migrate", () => { + it("deletes ac banner from all users", async () => { + const output = await runMigrator(sut, { + global_account_accounts: { + user1: { + email: "user1@email.com", + name: "User 1", + emailVerified: true, + }, + user2: { + email: "user2@email.com", + name: "User 2", + emailVerified: true, + }, + }, + user_user1_showProviderClientVaultPrivacyBanner_acBannersDismissed: true, + user_user2_showProviderClientVaultPrivacyBanner_acBannersDismissed: true, + }); + + expect(output).toEqual({ + global_account_accounts: { + user1: { + email: "user1@email.com", + name: "User 1", + emailVerified: true, + }, + user2: { + email: "user2@email.com", + name: "User 2", + emailVerified: true, + }, + }, + }); + }); + }); + + describe("rollback", () => { + it("is irreversible", async () => { + await expect(runMigrator(sut, {}, "rollback")).rejects.toThrow(IRREVERSIBLE); + }); + }); +}); diff --git a/libs/common/src/state-migrations/migrations/70-remove-ac-banner-dismissed.ts b/libs/common/src/state-migrations/migrations/70-remove-ac-banner-dismissed.ts new file mode 100644 index 00000000000..087994b508f --- /dev/null +++ b/libs/common/src/state-migrations/migrations/70-remove-ac-banner-dismissed.ts @@ -0,0 +1,23 @@ +import { KeyDefinitionLike, MigrationHelper } from "../migration-helper"; +import { IRREVERSIBLE, Migrator } from "../migrator"; + +export const SHOW_BANNER_KEY: KeyDefinitionLike = { + key: "acBannersDismissed", + stateDefinition: { name: "showProviderClientVaultPrivacyBanner" }, +}; + +export class RemoveAcBannersDismissed extends Migrator<69, 70> { + async migrate(helper: MigrationHelper): Promise { + await Promise.all( + (await helper.getAccounts()).map(async ({ userId }) => { + if (helper.getFromUser(userId, SHOW_BANNER_KEY) != null) { + await helper.removeFromUser(userId, SHOW_BANNER_KEY); + } + }), + ); + } + + async rollback(helper: MigrationHelper): Promise { + throw IRREVERSIBLE; + } +} diff --git a/libs/common/src/tools/cryptography/key-service-legacy-encryptor-provider.spec.ts b/libs/common/src/tools/cryptography/key-service-legacy-encryptor-provider.spec.ts index 0b60aef4917..66edc5a4838 100644 --- a/libs/common/src/tools/cryptography/key-service-legacy-encryptor-provider.spec.ts +++ b/libs/common/src/tools/cryptography/key-service-legacy-encryptor-provider.spec.ts @@ -3,7 +3,7 @@ import { BehaviorSubject, Subject } from "rxjs"; import { KeyService } from "@bitwarden/key-management"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; import { CsprngArray } from "../../types/csprng"; import { OrganizationId, UserId } from "../../types/guid"; diff --git a/libs/common/src/tools/cryptography/key-service-legacy-encryptor-provider.ts b/libs/common/src/tools/cryptography/key-service-legacy-encryptor-provider.ts index d4a8dec7dc3..c91181a004a 100644 --- a/libs/common/src/tools/cryptography/key-service-legacy-encryptor-provider.ts +++ b/libs/common/src/tools/cryptography/key-service-legacy-encryptor-provider.ts @@ -14,7 +14,7 @@ import { import { KeyService } from "@bitwarden/key-management"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { OrganizationId, UserId } from "../../types/guid"; import { OrganizationBound, diff --git a/libs/common/src/tools/cryptography/organization-key-encryptor.spec.ts b/libs/common/src/tools/cryptography/organization-key-encryptor.spec.ts index 62c8ea24ae6..3d93db81389 100644 --- a/libs/common/src/tools/cryptography/organization-key-encryptor.spec.ts +++ b/libs/common/src/tools/cryptography/organization-key-encryptor.spec.ts @@ -1,6 +1,6 @@ import { mock } from "jest-mock-extended"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { EncString } from "../../platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; import { CsprngArray } from "../../types/csprng"; diff --git a/libs/common/src/tools/cryptography/organization-key-encryptor.ts b/libs/common/src/tools/cryptography/organization-key-encryptor.ts index d3b7dae10f5..31f3db91232 100644 --- a/libs/common/src/tools/cryptography/organization-key-encryptor.ts +++ b/libs/common/src/tools/cryptography/organization-key-encryptor.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { Jsonify } from "type-fest"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { EncString } from "../../platform/models/domain/enc-string"; import { OrganizationId } from "../../types/guid"; import { OrgKey } from "../../types/key"; diff --git a/libs/common/src/tools/cryptography/user-key-encryptor.spec.ts b/libs/common/src/tools/cryptography/user-key-encryptor.spec.ts index 5b0ee5103cb..e52190500b0 100644 --- a/libs/common/src/tools/cryptography/user-key-encryptor.spec.ts +++ b/libs/common/src/tools/cryptography/user-key-encryptor.spec.ts @@ -1,6 +1,6 @@ import { mock } from "jest-mock-extended"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { EncString } from "../../platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; import { CsprngArray } from "../../types/csprng"; diff --git a/libs/common/src/tools/cryptography/user-key-encryptor.ts b/libs/common/src/tools/cryptography/user-key-encryptor.ts index 296c33ea1dc..4b7cd1516a0 100644 --- a/libs/common/src/tools/cryptography/user-key-encryptor.ts +++ b/libs/common/src/tools/cryptography/user-key-encryptor.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { Jsonify } from "type-fest"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { EncString } from "../../platform/models/domain/enc-string"; import { UserId } from "../../types/guid"; import { UserKey } from "../../types/key"; diff --git a/libs/common/src/tools/log/default-semantic-logger.spec.ts b/libs/common/src/tools/log/default-semantic-logger.spec.ts new file mode 100644 index 00000000000..8d1dadb66af --- /dev/null +++ b/libs/common/src/tools/log/default-semantic-logger.spec.ts @@ -0,0 +1,199 @@ +import { mock } from "jest-mock-extended"; + +import { LogService } from "../../platform/abstractions/log.service"; +import { LogLevelType } from "../../platform/enums"; + +import { DefaultSemanticLogger } from "./default-semantic-logger"; + +const logger = mock(); + +describe("DefaultSemanticLogger", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe("debug", () => { + it("writes structural log messages to console.log", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.debug("this is a debug message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Debug, { + message: "this is a debug message", + level: LogLevelType.Debug, + }); + }); + + it("writes structural content to console.log", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.debug({ example: "this is content" }); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Debug, { + content: { example: "this is content" }, + level: LogLevelType.Debug, + }); + }); + + it("writes structural content to console.log with a message", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.info({ example: "this is content" }, "this is a message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Info, { + content: { example: "this is content" }, + message: "this is a message", + level: LogLevelType.Info, + }); + }); + }); + + describe("info", () => { + it("writes structural log messages to console.log", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.info("this is an info message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Info, { + message: "this is an info message", + level: LogLevelType.Info, + }); + }); + + it("writes structural content to console.log", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.info({ example: "this is content" }); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Info, { + content: { example: "this is content" }, + level: LogLevelType.Info, + }); + }); + + it("writes structural content to console.log with a message", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.info({ example: "this is content" }, "this is a message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Info, { + content: { example: "this is content" }, + message: "this is a message", + level: LogLevelType.Info, + }); + }); + }); + + describe("warn", () => { + it("writes structural log messages to console.warn", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.warn("this is a warning message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Warning, { + message: "this is a warning message", + level: LogLevelType.Warning, + }); + }); + + it("writes structural content to console.warn", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.warn({ example: "this is content" }); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Warning, { + content: { example: "this is content" }, + level: LogLevelType.Warning, + }); + }); + + it("writes structural content to console.warn with a message", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.warn({ example: "this is content" }, "this is a message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Warning, { + content: { example: "this is content" }, + message: "this is a message", + level: LogLevelType.Warning, + }); + }); + }); + + describe("error", () => { + it("writes structural log messages to console.error", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.error("this is an error message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + message: "this is an error message", + level: LogLevelType.Error, + }); + }); + + it("writes structural content to console.error", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.error({ example: "this is content" }); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + content: { example: "this is content" }, + level: LogLevelType.Error, + }); + }); + + it("writes structural content to console.error with a message", () => { + const log = new DefaultSemanticLogger(logger, {}); + + log.error({ example: "this is content" }, "this is a message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + content: { example: "this is content" }, + message: "this is a message", + level: LogLevelType.Error, + }); + }); + }); + + describe("panic", () => { + it("writes structural log messages to console.error before throwing the message", () => { + const log = new DefaultSemanticLogger(logger, {}); + + expect(() => log.panic("this is an error message")).toThrow("this is an error message"); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + message: "this is an error message", + level: LogLevelType.Error, + }); + }); + + it("writes structural log messages to console.error with a message before throwing the message", () => { + const log = new DefaultSemanticLogger(logger, {}); + + expect(() => log.panic({ example: "this is content" }, "this is an error message")).toThrow( + "this is an error message", + ); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + content: { example: "this is content" }, + message: "this is an error message", + level: LogLevelType.Error, + }); + }); + + it("writes structural log messages to console.error with a content before throwing the message", () => { + const log = new DefaultSemanticLogger(logger, {}); + + expect(() => log.panic("this is content", "this is an error message")).toThrow( + "this is an error message", + ); + + expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + content: "this is content", + message: "this is an error message", + level: LogLevelType.Error, + }); + }); + }); +}); diff --git a/libs/common/src/tools/log/default-semantic-logger.ts b/libs/common/src/tools/log/default-semantic-logger.ts new file mode 100644 index 00000000000..1bd62baf126 --- /dev/null +++ b/libs/common/src/tools/log/default-semantic-logger.ts @@ -0,0 +1,65 @@ +import { Jsonify } from "type-fest"; + +import { LogService } from "../../platform/abstractions/log.service"; +import { LogLevelType } from "../../platform/enums"; + +import { SemanticLogger } from "./semantic-logger.abstraction"; + +/** Sends semantic logs to the console. + * @remarks the behavior of this logger is based on `LogService`; it + * replaces dynamic messages (`%s`) with a JSON-formatted semantic log. + */ +export class DefaultSemanticLogger implements SemanticLogger { + /** Instantiates a console semantic logger + * @param context a static payload that is cloned when the logger + * logs a message. The `messages`, `level`, and `content` fields + * are reserved for use by loggers. + */ + constructor( + private logger: LogService, + context: Jsonify, + ) { + this.context = context && typeof context === "object" ? context : {}; + } + + readonly context: object; + + debug(content: Jsonify, message?: string): void { + this.log(content, LogLevelType.Debug, message); + } + + info(content: Jsonify, message?: string): void { + this.log(content, LogLevelType.Info, message); + } + + warn(content: Jsonify, message?: string): void { + this.log(content, LogLevelType.Warning, message); + } + + error(content: Jsonify, message?: string): void { + this.log(content, LogLevelType.Error, message); + } + + panic(content: Jsonify, message?: string): never { + this.log(content, LogLevelType.Error, message); + const panicMessage = + message ?? (typeof content === "string" ? content : "a fatal error occurred"); + throw new Error(panicMessage); + } + + private log(content: Jsonify, level: LogLevelType, message?: string) { + const log = { + ...this.context, + message, + content: content ?? undefined, + level, + }; + + if (typeof content === "string" && !message) { + log.message = content; + delete log.content; + } + + this.logger.write(level, log); + } +} diff --git a/libs/common/src/tools/log/disabled-semantic-logger.ts b/libs/common/src/tools/log/disabled-semantic-logger.ts new file mode 100644 index 00000000000..054c3ed390b --- /dev/null +++ b/libs/common/src/tools/log/disabled-semantic-logger.ts @@ -0,0 +1,18 @@ +import { Jsonify } from "type-fest"; + +import { SemanticLogger } from "./semantic-logger.abstraction"; + +/** Disables semantic logs. Still panics. */ +export class DisabledSemanticLogger implements SemanticLogger { + debug(_content: Jsonify, _message?: string): void {} + + info(_content: Jsonify, _message?: string): void {} + + warn(_content: Jsonify, _message?: string): void {} + + error(_content: Jsonify, _message?: string): void {} + + panic(_content: Jsonify, message?: string): never { + throw new Error(message); + } +} diff --git a/libs/common/src/tools/log/factory.ts b/libs/common/src/tools/log/factory.ts new file mode 100644 index 00000000000..d887c4e310a --- /dev/null +++ b/libs/common/src/tools/log/factory.ts @@ -0,0 +1,30 @@ +import { Jsonify } from "type-fest"; + +import { LogService } from "../../platform/abstractions/log.service"; + +import { DefaultSemanticLogger } from "./default-semantic-logger"; +import { DisabledSemanticLogger } from "./disabled-semantic-logger"; +import { SemanticLogger } from "./semantic-logger.abstraction"; + +/** Instantiates a semantic logger that emits nothing when a message + * is logged. + * @param _context a static payload that is cloned when the logger + * logs a message. The `messages`, `level`, and `content` fields + * are reserved for use by loggers. + */ +export function disabledSemanticLoggerProvider( + _context: Jsonify, +): SemanticLogger { + return new DisabledSemanticLogger(); +} + +/** Instantiates a semantic logger that emits logs to the console. + * @param context a static payload that is cloned when the logger + * logs a message. The `messages`, `level`, and `content` fields + * are reserved for use by loggers. + * @param settings specializes how the semantic logger functions. + * If this is omitted, the logger suppresses debug messages. + */ +export function consoleSemanticLoggerProvider(logger: LogService): SemanticLogger { + return new DefaultSemanticLogger(logger, {}); +} diff --git a/libs/common/src/tools/log/index.ts b/libs/common/src/tools/log/index.ts new file mode 100644 index 00000000000..1f86ca4e4d7 --- /dev/null +++ b/libs/common/src/tools/log/index.ts @@ -0,0 +1,2 @@ +export { disabledSemanticLoggerProvider, consoleSemanticLoggerProvider } from "./factory"; +export { SemanticLogger } from "./semantic-logger.abstraction"; diff --git a/libs/common/src/tools/log/semantic-logger.abstraction.ts b/libs/common/src/tools/log/semantic-logger.abstraction.ts new file mode 100644 index 00000000000..196d1f3f12c --- /dev/null +++ b/libs/common/src/tools/log/semantic-logger.abstraction.ts @@ -0,0 +1,94 @@ +import { Jsonify } from "type-fest"; + +/** Semantic/structural logging component */ +export interface SemanticLogger { + /** Logs a message at debug priority. + * Debug messages are used for diagnostics, and are typically disabled + * in production builds. + * @param message - a message to record in the log's `message` field. + */ + debug(message: string): void; + + /** Logs the content at debug priority. + * Debug messages are used for diagnostics, and are typically disabled + * in production builds. + * @param content - JSON content included in the log's `content` field. + * @param message - a message to record in the log's `message` field. + */ + debug(content: Jsonify, message?: string): void; + + /** combined signature for overloaded methods */ + debug(content: Jsonify | string, message?: string): void; + + /** Logs a message at informational priority. + * Information messages are used for status reports. + * @param message - a message to record in the log's `message` field. + */ + info(message: string): void; + + /** Logs the content at informational priority. + * Information messages are used for status reports. + * @param content - JSON content included in the log's `content` field. + * @param message - a message to record in the log's `message` field. + */ + info(content: Jsonify, message?: string): void; + + /** combined signature for overloaded methods */ + info(content: Jsonify | string, message?: string): void; + + /** Logs a message at warn priority. + * Warn messages are used to indicate a operation that may affect system + * stability occurred. + * @param message - a message to record in the log's `message` field. + */ + warn(message: string): void; + + /** Logs the content at warn priority. + * Warn messages are used to indicate a operation that may affect system + * stability occurred. + * @param content - JSON content included in the log's `content` field. + * @param message - a message to record in the log's `message` field. + */ + warn(content: Jsonify, message?: string): void; + + /** combined signature for overloaded methods */ + warn(content: Jsonify | string, message?: string): void; + + /** Logs a message at error priority. + * Error messages are used to indicate a operation that affects system + * stability occurred and the system was able to recover. + * @param message - a message to record in the log's `message` field. + */ + error(message: string): void; + + /** Logs the content at debug priority. + * Error messages are used to indicate a operation that affects system + * stability occurred and the system was able to recover. + * @param content - JSON content included in the log's `content` field. + * @param message - a message to record in the log's `message` field. + */ + error(content: Jsonify, message?: string): void; + + /** combined signature for overloaded methods */ + error(content: Jsonify | string, message?: string): void; + + /** Logs a message at panic priority and throws an error. + * Panic messages are used to indicate a operation that affects system + * stability occurred and the system cannot recover. Panic messages + * log an error and throw an `Error`. + * @param message - a message to record in the log's `message` field. + */ + panic(message: string): never; + + /** Logs the content at debug priority and throws an error. + * Panic messages are used to indicate a operation that affects system + * stability occurred and the system cannot recover. Panic messages + * log an error and throw an `Error`. + * @param content - JSON content included in the log's `content` field. + * @param message - a message to record in the log's `message` field. + */ + panic(content: Jsonify, message?: string): never; + + /** combined signature for overloaded methods */ + panic(content: Jsonify | string, message?: string): never; +} diff --git a/libs/common/src/tools/send/models/domain/send.spec.ts b/libs/common/src/tools/send/models/domain/send.spec.ts index fcc273d41bb..79f6c03adc8 100644 --- a/libs/common/src/tools/send/models/domain/send.spec.ts +++ b/libs/common/src/tools/send/models/domain/send.spec.ts @@ -3,7 +3,7 @@ import { mock } from "jest-mock-extended"; import { KeyService } from "@bitwarden/key-management"; import { makeStaticByteArray, mockEnc } from "../../../../../spec"; -import { EncryptService } from "../../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../../key-management/crypto/abstractions/encrypt.service"; import { SymmetricCryptoKey } from "../../../../platform/models/domain/symmetric-crypto-key"; import { ContainerService } from "../../../../platform/services/container.service"; import { UserKey } from "../../../../types/key"; diff --git a/libs/common/src/tools/send/services/send.service.spec.ts b/libs/common/src/tools/send/services/send.service.spec.ts index 662fee02bbf..26cc0a46708 100644 --- a/libs/common/src/tools/send/services/send.service.spec.ts +++ b/libs/common/src/tools/send/services/send.service.spec.ts @@ -10,7 +10,7 @@ import { awaitAsync, mockAccountServiceWith, } from "../../../../spec"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { EnvironmentService } from "../../../platform/abstractions/environment.service"; import { I18nService } from "../../../platform/abstractions/i18n.service"; import { KeyGenerationService } from "../../../platform/abstractions/key-generation.service"; diff --git a/libs/common/src/tools/send/services/send.service.ts b/libs/common/src/tools/send/services/send.service.ts index 7021c942d44..1b5e5f6aa31 100644 --- a/libs/common/src/tools/send/services/send.service.ts +++ b/libs/common/src/tools/send/services/send.service.ts @@ -4,7 +4,7 @@ import { Observable, concatMap, distinctUntilChanged, firstValueFrom, map } from import { PBKDF2KdfConfig, KeyService } from "@bitwarden/key-management"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../../../platform/abstractions/i18n.service"; import { KeyGenerationService } from "../../../platform/abstractions/key-generation.service"; import { Utils } from "../../../platform/misc/utils"; diff --git a/libs/common/src/vault/models/domain/attachment.spec.ts b/libs/common/src/vault/models/domain/attachment.spec.ts index d6588d9acb1..d1ee1dcc1ef 100644 --- a/libs/common/src/vault/models/domain/attachment.spec.ts +++ b/libs/common/src/vault/models/domain/attachment.spec.ts @@ -3,7 +3,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { KeyService } from "@bitwarden/key-management"; import { makeStaticByteArray, mockEnc, mockFromJson } from "../../../../spec"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { EncryptedString, EncString } from "../../../platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; import { ContainerService } from "../../../platform/services/container.service"; diff --git a/libs/common/src/vault/models/domain/cipher.spec.ts b/libs/common/src/vault/models/domain/cipher.spec.ts index 65d7a24f9c4..9eadd20f543 100644 --- a/libs/common/src/vault/models/domain/cipher.spec.ts +++ b/libs/common/src/vault/models/domain/cipher.spec.ts @@ -4,8 +4,8 @@ import { Jsonify } from "type-fest"; import { KeyService } from "@bitwarden/key-management"; import { makeStaticByteArray, mockEnc, mockFromJson } from "../../../../spec/utils"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { UriMatchStrategy } from "../../../models/domain/domain-service"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; import { EncString } from "../../../platform/models/domain/enc-string"; import { ContainerService } from "../../../platform/services/container.service"; import { InitializerKey } from "../../../platform/services/cryptography/initializer-key"; diff --git a/libs/common/src/vault/models/domain/folder.spec.ts b/libs/common/src/vault/models/domain/folder.spec.ts index 785852b884e..ff1c38bdd45 100644 --- a/libs/common/src/vault/models/domain/folder.spec.ts +++ b/libs/common/src/vault/models/domain/folder.spec.ts @@ -1,7 +1,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { makeEncString, makeSymmetricCryptoKey, mockEnc, mockFromJson } from "../../../../spec"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { EncryptedString, EncString } from "../../../platform/models/domain/enc-string"; import { FolderData } from "../../models/data/folder.data"; import { Folder } from "../../models/domain/folder"; diff --git a/libs/common/src/vault/models/domain/folder.ts b/libs/common/src/vault/models/domain/folder.ts index 93d04607af5..65018e3cf08 100644 --- a/libs/common/src/vault/models/domain/folder.ts +++ b/libs/common/src/vault/models/domain/folder.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { Jsonify } from "type-fest"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import Domain from "../../../platform/models/domain/domain-base"; import { EncString } from "../../../platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; diff --git a/libs/common/src/vault/models/domain/login-uri.spec.ts b/libs/common/src/vault/models/domain/login-uri.spec.ts index a1ecb473597..6346f38f0de 100644 --- a/libs/common/src/vault/models/domain/login-uri.spec.ts +++ b/libs/common/src/vault/models/domain/login-uri.spec.ts @@ -2,8 +2,8 @@ import { MockProxy, mock } from "jest-mock-extended"; import { Jsonify } from "type-fest"; import { mockEnc, mockFromJson } from "../../../../spec"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { UriMatchStrategy } from "../../../models/domain/domain-service"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; import { EncString } from "../../../platform/models/domain/enc-string"; import { LoginUriData } from "../data/login-uri.data"; diff --git a/libs/common/src/vault/services/cipher.service.spec.ts b/libs/common/src/vault/services/cipher.service.spec.ts index 770c3660c07..c59f6672985 100644 --- a/libs/common/src/vault/services/cipher.service.spec.ts +++ b/libs/common/src/vault/services/cipher.service.spec.ts @@ -10,10 +10,10 @@ import { ApiService } from "../../abstractions/api.service"; import { SearchService } from "../../abstractions/search.service"; import { AutofillSettingsService } from "../../autofill/services/autofill-settings.service"; import { DomainSettingsService } from "../../autofill/services/domain-settings.service"; +import { BulkEncryptService } from "../../key-management/crypto/abstractions/bulk-encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { UriMatchStrategy } from "../../models/domain/domain-service"; -import { BulkEncryptService } from "../../platform/abstractions/bulk-encrypt.service"; import { ConfigService } from "../../platform/abstractions/config/config.service"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { StateService } from "../../platform/abstractions/state.service"; import { Utils } from "../../platform/misc/utils"; diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index da205cb2b0e..9e06d3335c3 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -22,13 +22,13 @@ import { AccountService } from "../../auth/abstractions/account.service"; import { AutofillSettingsServiceAbstraction } from "../../autofill/services/autofill-settings.service"; import { DomainSettingsService } from "../../autofill/services/domain-settings.service"; import { FeatureFlag } from "../../enums/feature-flag.enum"; +import { BulkEncryptService } from "../../key-management/crypto/abstractions/bulk-encrypt.service"; +import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { UriMatchStrategySetting } from "../../models/domain/domain-service"; import { ErrorResponse } from "../../models/response/error.response"; import { ListResponse } from "../../models/response/list.response"; import { View } from "../../models/view/view"; -import { BulkEncryptService } from "../../platform/abstractions/bulk-encrypt.service"; import { ConfigService } from "../../platform/abstractions/config/config.service"; -import { EncryptService } from "../../platform/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { StateService } from "../../platform/abstractions/state.service"; import { sequentialize } from "../../platform/misc/sequentialize"; diff --git a/libs/common/src/vault/services/folder/folder.service.spec.ts b/libs/common/src/vault/services/folder/folder.service.spec.ts index bd79d3abd1e..ced4e2dceb7 100644 --- a/libs/common/src/vault/services/folder/folder.service.spec.ts +++ b/libs/common/src/vault/services/folder/folder.service.spec.ts @@ -7,7 +7,7 @@ import { makeEncString } from "../../../../spec"; import { FakeAccountService, mockAccountServiceWith } from "../../../../spec/fake-account-service"; import { FakeSingleUserState } from "../../../../spec/fake-state"; import { FakeStateProvider } from "../../../../spec/fake-state-provider"; -import { EncryptService } from "../../../platform/abstractions/encrypt.service"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../../../platform/abstractions/i18n.service"; import { Utils } from "../../../platform/misc/utils"; import { EncString } from "../../../platform/models/domain/enc-string"; diff --git a/libs/common/src/vault/services/folder/folder.service.ts b/libs/common/src/vault/services/folder/folder.service.ts index 37dafc3e710..3d272416fbe 100644 --- a/libs/common/src/vault/services/folder/folder.service.ts +++ b/libs/common/src/vault/services/folder/folder.service.ts @@ -4,9 +4,9 @@ import { Observable, Subject, firstValueFrom, map, shareReplay, switchMap, merge import { KeyService } from "@bitwarden/key-management"; -import { EncryptService } from ".././../../platform/abstractions/encrypt.service"; -import { Utils } from ".././../../platform/misc/utils"; +import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../../../platform/abstractions/i18n.service"; +import { Utils } from "../../../platform/misc/utils"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; import { StateProvider } from "../../../platform/state"; import { UserId } from "../../../types/guid"; diff --git a/libs/components/src/async-actions/in-forms.stories.ts b/libs/components/src/async-actions/in-forms.stories.ts index 7ddb32da281..b45f750084c 100644 --- a/libs/components/src/async-actions/in-forms.stories.ts +++ b/libs/components/src/async-actions/in-forms.stories.ts @@ -4,10 +4,8 @@ import { action } from "@storybook/addon-actions"; import { Meta, moduleMetadata, StoryObj } from "@storybook/angular"; import { delay, of } from "rxjs"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { I18nService } from "@bitwarden/common/src/platform/abstractions/i18n.service"; import { ButtonModule } from "../button"; import { FormFieldModule } from "../form-field"; diff --git a/libs/components/src/checkbox/checkbox.stories.ts b/libs/components/src/checkbox/checkbox.stories.ts index 908085bb6df..9a59897e009 100644 --- a/libs/components/src/checkbox/checkbox.stories.ts +++ b/libs/components/src/checkbox/checkbox.stories.ts @@ -9,9 +9,7 @@ import { } from "@angular/forms"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { I18nService } from "@bitwarden/common/src/platform/abstractions/i18n.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { BadgeModule } from "../badge"; import { FormControlModule } from "../form-control"; diff --git a/libs/components/src/chip-select/chip-select.component.ts b/libs/components/src/chip-select/chip-select.component.ts index 39543db5ed5..e9be66da7d4 100644 --- a/libs/components/src/chip-select/chip-select.component.ts +++ b/libs/components/src/chip-select/chip-select.component.ts @@ -18,9 +18,8 @@ import { import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { compareValues } from "../../../common/src/platform/misc/compare-values"; +import { compareValues } from "@bitwarden/common/platform/misc/compare-values"; + import { ButtonModule } from "../button"; import { IconButtonModule } from "../icon-button"; import { MenuComponent, MenuItemDirective, MenuModule } from "../menu"; diff --git a/libs/components/src/dialog/dialog/dialog.component.ts b/libs/components/src/dialog/dialog/dialog.component.ts index e9e3e898257..504dbd3a1ea 100644 --- a/libs/components/src/dialog/dialog/dialog.component.ts +++ b/libs/components/src/dialog/dialog/dialog.component.ts @@ -63,7 +63,8 @@ export class DialogComponent { @Input() loading = false; @HostBinding("class") get classes() { - return ["tw-flex", "tw-flex-col", "tw-max-h-screen", "tw-w-screen", "tw-p-4"].concat( + // `tw-max-h-[90vh]` is needed to prevent dialogs from overlapping the desktop header + return ["tw-flex", "tw-flex-col", "tw-w-screen", "tw-p-4", "tw-max-h-[90vh]"].concat( this.width, ); } diff --git a/libs/components/src/dialog/simple-dialog/types.ts b/libs/components/src/dialog/simple-dialog/types.ts index 4032b499cbe..9724111b4c2 100644 --- a/libs/components/src/dialog/simple-dialog/types.ts +++ b/libs/components/src/dialog/simple-dialog/types.ts @@ -46,7 +46,7 @@ export type SimpleDialogOptions = { * If null is provided, the cancel button will be removed. * * If not localized, pass in a `Translation` */ - cancelButtonText?: string | Translation; + cancelButtonText?: string | Translation | null; /** Whether or not the user can use escape or clicking the backdrop to close the dialog */ disableClose?: boolean; diff --git a/libs/importer/src/components/import.component.html b/libs/importer/src/components/import.component.html index c53a1d3f522..072271f8205 100644 --- a/libs/importer/src/components/import.component.html +++ b/libs/importer/src/components/import.component.html @@ -94,6 +94,8 @@

{{ "seeDetailedInstructions" | i18n }} See detailed instructions on our help site at - + https://bitwarden.com/help/import-from-chrome/ See detailed instructions on our help site at See detailed instructions on our help site at - + https://bitwarden.com/help/import-from-safari/. @@ -199,6 +215,8 @@ > See detailed instructions on our help site at Make sure you have python-keyring and python-gnomekeyring installed. Save the - GNOME Keyring Import/Export python script to your desktop as pw_helper.py. Open terminal and run diff --git a/libs/importer/src/components/import.component.ts b/libs/importer/src/components/import.component.ts index d574a6fc094..5b59055bc4e 100644 --- a/libs/importer/src/components/import.component.ts +++ b/libs/importer/src/components/import.component.ts @@ -33,7 +33,7 @@ import { Organization } from "@bitwarden/common/admin-console/models/domain/orga import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { ClientType } from "@bitwarden/common/enums"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; diff --git a/libs/importer/spec/base-importer.spec.ts b/libs/importer/src/importers/base-importer.spec.ts similarity index 98% rename from libs/importer/spec/base-importer.spec.ts rename to libs/importer/src/importers/base-importer.spec.ts index f72ceccb538..309bb7ca8c4 100644 --- a/libs/importer/spec/base-importer.spec.ts +++ b/libs/importer/src/importers/base-importer.spec.ts @@ -2,7 +2,7 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { BaseImporter } from "../src/importers/base-importer"; +import { BaseImporter } from "./base-importer"; class FakeBaseImporter extends BaseImporter { initLoginCipher(): CipherView { diff --git a/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts b/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts index ebf297cd0e6..f01e6571439 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts @@ -5,12 +5,12 @@ import { firstValueFrom, map } from "rxjs"; import { CollectionView } from "@bitwarden/admin-console/common"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherWithIdExport, CollectionWithIdExport, FolderWithIdExport, } from "@bitwarden/common/models/export"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; diff --git a/libs/importer/spec/bitwarden-password-protected-importer.spec.ts b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts similarity index 91% rename from libs/importer/spec/bitwarden-password-protected-importer.spec.ts rename to libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts index 008d6e25f92..66deabf0634 100644 --- a/libs/importer/spec/bitwarden-password-protected-importer.spec.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts @@ -2,19 +2,17 @@ import { mock, MockProxy } from "jest-mock-extended"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { KdfType, KeyService } from "@bitwarden/key-management"; -import { - BitwardenPasswordProtectedImporter, - BitwardenJsonImporter, -} from "../src/importers/bitwarden"; +import { emptyAccountEncrypted } from "../spec-data/bitwarden-json/account-encrypted.json"; +import { emptyUnencryptedExport } from "../spec-data/bitwarden-json/unencrypted.json"; -import { emptyAccountEncrypted } from "./test-data/bitwarden-json/account-encrypted.json"; -import { emptyUnencryptedExport } from "./test-data/bitwarden-json/unencrypted.json"; +import { BitwardenJsonImporter } from "./bitwarden-json-importer"; +import { BitwardenPasswordProtectedImporter } from "./bitwarden-password-protected-importer"; describe("BitwardenPasswordProtectedImporter", () => { let importer: BitwardenPasswordProtectedImporter; diff --git a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts index 10b02426af0..02a417c2169 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; diff --git a/libs/importer/spec/chrome-csv-importer.spec.ts b/libs/importer/src/importers/chrome-csv-importer.spec.ts similarity index 92% rename from libs/importer/spec/chrome-csv-importer.spec.ts rename to libs/importer/src/importers/chrome-csv-importer.spec.ts index dcb39b657d5..d0e82cf44ac 100644 --- a/libs/importer/spec/chrome-csv-importer.spec.ts +++ b/libs/importer/src/importers/chrome-csv-importer.spec.ts @@ -2,10 +2,9 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; -import { ChromeCsvImporter } from "../src/importers"; - -import { data as androidData } from "./test-data/chrome-csv/android-data.csv"; -import { data as simplePasswordData } from "./test-data/chrome-csv/simple-password-data.csv"; +import { ChromeCsvImporter } from "./chrome-csv-importer"; +import { data as androidData } from "./spec-data/chrome-csv/android-data.csv"; +import { data as simplePasswordData } from "./spec-data/chrome-csv/simple-password-data.csv"; const CipherData = [ { diff --git a/libs/importer/spec/dashlane-csv-importer.spec.ts b/libs/importer/src/importers/dashlane/dashlane-csv-importer.spec.ts similarity index 96% rename from libs/importer/spec/dashlane-csv-importer.spec.ts rename to libs/importer/src/importers/dashlane/dashlane-csv-importer.spec.ts index 1d76396022c..b8d84a9378a 100644 --- a/libs/importer/spec/dashlane-csv-importer.spec.ts +++ b/libs/importer/src/importers/dashlane/dashlane-csv-importer.spec.ts @@ -1,14 +1,13 @@ import { CipherType } from "@bitwarden/common/vault/enums"; -import { DashlaneCsvImporter } from "../src/importers"; - -import { credentialsData_otpUrl } from "./test-data/dashlane-csv/credentials-otpurl.csv"; -import { credentialsData } from "./test-data/dashlane-csv/credentials.csv"; -import { identityData } from "./test-data/dashlane-csv/id.csv"; -import { multiplePersonalInfoData } from "./test-data/dashlane-csv/multiple-personal-info.csv"; -import { paymentsData } from "./test-data/dashlane-csv/payments.csv"; -import { personalInfoData } from "./test-data/dashlane-csv/personal-info.csv"; -import { secureNoteData } from "./test-data/dashlane-csv/securenotes.csv"; +import { DashlaneCsvImporter } from ".."; +import { credentialsData_otpUrl } from "../spec-data/dashlane-csv/credentials-otpurl.csv"; +import { credentialsData } from "../spec-data/dashlane-csv/credentials.csv"; +import { identityData } from "../spec-data/dashlane-csv/id.csv"; +import { multiplePersonalInfoData } from "../spec-data/dashlane-csv/multiple-personal-info.csv"; +import { paymentsData } from "../spec-data/dashlane-csv/payments.csv"; +import { personalInfoData } from "../spec-data/dashlane-csv/personal-info.csv"; +import { secureNoteData } from "../spec-data/dashlane-csv/securenotes.csv"; describe("Dashlane CSV Importer", () => { let importer: DashlaneCsvImporter; diff --git a/libs/importer/spec/enpass-json-importer.spec.ts b/libs/importer/src/importers/enpass/enpass-json-importer.spec.ts similarity index 93% rename from libs/importer/spec/enpass-json-importer.spec.ts rename to libs/importer/src/importers/enpass/enpass-json-importer.spec.ts index 75e668f28be..b0cb5f71524 100644 --- a/libs/importer/spec/enpass-json-importer.spec.ts +++ b/libs/importer/src/importers/enpass/enpass-json-importer.spec.ts @@ -1,13 +1,13 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { EnpassJsonImporter } from "../src/importers"; +import { creditCard } from "../spec-data/enpass-json/credit-card"; +import { folders } from "../spec-data/enpass-json/folders"; +import { login } from "../spec-data/enpass-json/login"; +import { loginAndroidUrl } from "../spec-data/enpass-json/login-android-url"; +import { note } from "../spec-data/enpass-json/note"; -import { creditCard } from "./test-data/enpass-json/credit-card"; -import { folders } from "./test-data/enpass-json/folders"; -import { login } from "./test-data/enpass-json/login"; -import { loginAndroidUrl } from "./test-data/enpass-json/login-android-url"; -import { note } from "./test-data/enpass-json/note"; +import { EnpassJsonImporter } from "./enpass-json-importer"; function validateCustomField(fields: FieldView[], fieldName: string, expectedValue: any) { expect(fields).toBeDefined(); diff --git a/libs/importer/spec/firefox-csv-importer.spec.ts b/libs/importer/src/importers/firefox-csv-importer.spec.ts similarity index 91% rename from libs/importer/spec/firefox-csv-importer.spec.ts rename to libs/importer/src/importers/firefox-csv-importer.spec.ts index 0add655a684..78bca0599b5 100644 --- a/libs/importer/spec/firefox-csv-importer.spec.ts +++ b/libs/importer/src/importers/firefox-csv-importer.spec.ts @@ -2,10 +2,9 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; -import { FirefoxCsvImporter } from "../src/importers"; - -import { data as firefoxAccountsData } from "./test-data/firefox-csv/firefox-accounts-data.csv"; -import { data as simplePasswordData } from "./test-data/firefox-csv/simple-password-data.csv"; +import { FirefoxCsvImporter } from "./firefox-csv-importer"; +import { data as firefoxAccountsData } from "./spec-data/firefox-csv/firefox-accounts-data.csv"; +import { data as simplePasswordData } from "./spec-data/firefox-csv/simple-password-data.csv"; const CipherData = [ { diff --git a/libs/importer/src/importers/index.ts b/libs/importer/src/importers/index.ts index 1ba3a0d9eb8..c9b4c4c9c19 100644 --- a/libs/importer/src/importers/index.ts +++ b/libs/importer/src/importers/index.ts @@ -22,7 +22,7 @@ export { KasperskyTxtImporter } from "./kaspersky-txt-importer"; export { KeePass2XmlImporter } from "./keepass2-xml-importer"; export { KeePassXCsvImporter } from "./keepassx-csv-importer"; export { KeeperCsvImporter, KeeperJsonImporter } from "./keeper"; -export { LastPassCsvImporter } from "./lastpass-csv-importer"; +export { LastPassCsvImporter } from "./lastpass"; export { LogMeOnceCsvImporter } from "./logmeonce-csv-importer"; export { MeldiumCsvImporter } from "./meldium-csv-importer"; export { MSecureCsvImporter } from "./msecure-csv-importer"; diff --git a/libs/importer/spec/keepass2-xml-importer.spec.ts b/libs/importer/src/importers/keepass2-xml-importer.spec.ts similarity index 92% rename from libs/importer/spec/keepass2-xml-importer.spec.ts rename to libs/importer/src/importers/keepass2-xml-importer.spec.ts index 4f02bf9260b..8fbb021883c 100644 --- a/libs/importer/spec/keepass2-xml-importer.spec.ts +++ b/libs/importer/src/importers/keepass2-xml-importer.spec.ts @@ -1,12 +1,11 @@ import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; -import { KeePass2XmlImporter } from "../src/importers"; - +import { KeePass2XmlImporter } from "./keepass2-xml-importer"; import { TestData, TestData1, TestData2, -} from "./test-data/keepass2-xml/keepass2-xml-importer-testdata"; +} from "./spec-data/keepass2-xml/keepass2-xml-importer-testdata"; describe("KeePass2 Xml Importer", () => { it("should parse XML data", async () => { diff --git a/libs/importer/spec/keepassx-csv-importer.spec.ts b/libs/importer/src/importers/keepassx-csv-importer.spec.ts similarity index 92% rename from libs/importer/spec/keepassx-csv-importer.spec.ts rename to libs/importer/src/importers/keepassx-csv-importer.spec.ts index 0b3d729d9de..e0b8a6cff5d 100644 --- a/libs/importer/spec/keepassx-csv-importer.spec.ts +++ b/libs/importer/src/importers/keepassx-csv-importer.spec.ts @@ -1,6 +1,5 @@ -import { KeePassXCsvImporter } from "../src/importers"; - -import { keepassxTestData } from "./test-data/keepassx-csv/testdata.csv"; +import { KeePassXCsvImporter } from "./keepassx-csv-importer"; +import { keepassxTestData } from "./spec-data/keepassx-csv/testdata.csv"; describe("KeePassX CSV Importer", () => { let importer: KeePassXCsvImporter; diff --git a/libs/importer/spec/keeper-csv-importer.spec.ts b/libs/importer/src/importers/keeper/keeper-csv-importer.spec.ts similarity index 97% rename from libs/importer/spec/keeper-csv-importer.spec.ts rename to libs/importer/src/importers/keeper/keeper-csv-importer.spec.ts index f466a766ccb..69655eb9177 100644 --- a/libs/importer/spec/keeper-csv-importer.spec.ts +++ b/libs/importer/src/importers/keeper/keeper-csv-importer.spec.ts @@ -1,8 +1,8 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { KeeperCsvImporter } from "../src/importers"; +import { testData as TestData } from "../spec-data/keeper-csv/testdata.csv"; -import { testData as TestData } from "./test-data/keeper-csv/testdata.csv"; +import { KeeperCsvImporter } from "./keeper-csv-importer"; describe("Keeper CSV Importer", () => { let importer: KeeperCsvImporter; diff --git a/libs/importer/spec/keeper-json-importer.spec.ts b/libs/importer/src/importers/keeper/keeper-json-importer.spec.ts similarity index 96% rename from libs/importer/spec/keeper-json-importer.spec.ts rename to libs/importer/src/importers/keeper/keeper-json-importer.spec.ts index 37dfadc304b..31169021e0c 100644 --- a/libs/importer/spec/keeper-json-importer.spec.ts +++ b/libs/importer/src/importers/keeper/keeper-json-importer.spec.ts @@ -1,8 +1,8 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { KeeperJsonImporter } from "../src/importers"; +import { testData as TestData } from "../spec-data/keeper-json/testdata.json"; -import { testData as TestData } from "./test-data/keeper-json/testdata.json"; +import { KeeperJsonImporter } from "./keeper-json-importer"; describe("Keeper Json Importer", () => { const testDataJson = JSON.stringify(TestData); diff --git a/libs/importer/src/importers/lastpass/index.ts b/libs/importer/src/importers/lastpass/index.ts new file mode 100644 index 00000000000..0949fdea1b6 --- /dev/null +++ b/libs/importer/src/importers/lastpass/index.ts @@ -0,0 +1 @@ +export { LastPassCsvImporter } from "./lastpass-csv-importer"; diff --git a/libs/importer/spec/lastpass-csv-importer.spec.ts b/libs/importer/src/importers/lastpass/lastpass-csv-importer.spec.ts similarity index 97% rename from libs/importer/spec/lastpass-csv-importer.spec.ts rename to libs/importer/src/importers/lastpass/lastpass-csv-importer.spec.ts index de43c4aa473..cabd246fa7e 100644 --- a/libs/importer/spec/lastpass-csv-importer.spec.ts +++ b/libs/importer/src/importers/lastpass/lastpass-csv-importer.spec.ts @@ -2,8 +2,9 @@ import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { LastPassCsvImporter } from "../src/importers"; -import { ImportResult } from "../src/models/import-result"; +import { ImportResult } from "../../models/import-result"; + +import { LastPassCsvImporter } from "./lastpass-csv-importer"; function baseExcept(result: ImportResult) { expect(result).not.toBeNull(); diff --git a/libs/importer/src/importers/lastpass-csv-importer.ts b/libs/importer/src/importers/lastpass/lastpass-csv-importer.ts similarity index 98% rename from libs/importer/src/importers/lastpass-csv-importer.ts rename to libs/importer/src/importers/lastpass/lastpass-csv-importer.ts index 50a5b46239d..8f239ec6830 100644 --- a/libs/importer/src/importers/lastpass-csv-importer.ts +++ b/libs/importer/src/importers/lastpass/lastpass-csv-importer.ts @@ -8,10 +8,9 @@ import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view" import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; import { SecureNoteView } from "@bitwarden/common/vault/models/view/secure-note.view"; -import { ImportResult } from "../models/import-result"; - -import { BaseImporter } from "./base-importer"; -import { Importer } from "./importer"; +import { ImportResult } from "../../models/import-result"; +import { BaseImporter } from "../base-importer"; +import { Importer } from "../importer"; export class LastPassCsvImporter extends BaseImporter implements Importer { parse(data: string): Promise { diff --git a/libs/importer/spec/msecure-csv-importer.spec.ts b/libs/importer/src/importers/msecure-csv-importer.spec.ts similarity index 98% rename from libs/importer/spec/msecure-csv-importer.spec.ts rename to libs/importer/src/importers/msecure-csv-importer.spec.ts index 903be3bcb18..83e35802fac 100644 --- a/libs/importer/spec/msecure-csv-importer.spec.ts +++ b/libs/importer/src/importers/msecure-csv-importer.spec.ts @@ -1,6 +1,6 @@ import { CipherType } from "@bitwarden/common/vault/enums"; -import { MSecureCsvImporter } from "../src/importers/msecure-csv-importer"; +import { MSecureCsvImporter } from "./msecure-csv-importer"; describe("MSecureCsvImporter.parse", () => { let importer: MSecureCsvImporter; diff --git a/libs/importer/spec/myki-csv-importer.spec.ts b/libs/importer/src/importers/myki-csv-importer.spec.ts similarity index 98% rename from libs/importer/spec/myki-csv-importer.spec.ts rename to libs/importer/src/importers/myki-csv-importer.spec.ts index e1e36478a6a..6f804523ef0 100644 --- a/libs/importer/spec/myki-csv-importer.spec.ts +++ b/libs/importer/src/importers/myki-csv-importer.spec.ts @@ -1,14 +1,13 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { MykiCsvImporter } from "../src/importers"; - -import { userAccountData } from "./test-data/myki-csv/user-account.csv"; -import { userCreditCardData } from "./test-data/myki-csv/user-credit-card.csv"; -import { userIdCardData } from "./test-data/myki-csv/user-id-card.csv"; -import { userIdentityData } from "./test-data/myki-csv/user-identity.csv"; -import { userNoteData } from "./test-data/myki-csv/user-note.csv"; -import { userTwoFaData } from "./test-data/myki-csv/user-twofa.csv"; +import { MykiCsvImporter } from "./myki-csv-importer"; +import { userAccountData } from "./spec-data/myki-csv/user-account.csv"; +import { userCreditCardData } from "./spec-data/myki-csv/user-credit-card.csv"; +import { userIdCardData } from "./spec-data/myki-csv/user-id-card.csv"; +import { userIdentityData } from "./spec-data/myki-csv/user-identity.csv"; +import { userNoteData } from "./spec-data/myki-csv/user-note.csv"; +import { userTwoFaData } from "./spec-data/myki-csv/user-twofa.csv"; function expectDriversLicense(cipher: CipherView) { expect(cipher.type).toBe(CipherType.Identity); diff --git a/libs/importer/spec/netwrix-passwordsecure-csv-importer.spec.ts b/libs/importer/src/importers/netwrix/netwrix-passwordsecure-csv-importer.spec.ts similarity index 95% rename from libs/importer/spec/netwrix-passwordsecure-csv-importer.spec.ts rename to libs/importer/src/importers/netwrix/netwrix-passwordsecure-csv-importer.spec.ts index ab893dbc56c..ff327daf04d 100644 --- a/libs/importer/spec/netwrix-passwordsecure-csv-importer.spec.ts +++ b/libs/importer/src/importers/netwrix/netwrix-passwordsecure-csv-importer.spec.ts @@ -1,8 +1,8 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { NetwrixPasswordSecureCsvImporter } from "../src/importers"; +import { credentialsData } from "../spec-data/netwrix-csv/login-export.csv"; -import { credentialsData } from "./test-data/netwrix-csv/login-export.csv"; +import { NetwrixPasswordSecureCsvImporter } from "./netwrix-passwordsecure-csv-importer"; describe("Netwrix Password Secure CSV Importer", () => { let importer: NetwrixPasswordSecureCsvImporter; diff --git a/libs/importer/spec/nordpass-csv-importer.spec.ts b/libs/importer/src/importers/nordpass-csv-importer.spec.ts similarity index 95% rename from libs/importer/spec/nordpass-csv-importer.spec.ts rename to libs/importer/src/importers/nordpass-csv-importer.spec.ts index a7bbf0fc79c..cadc7bca28c 100644 --- a/libs/importer/spec/nordpass-csv-importer.spec.ts +++ b/libs/importer/src/importers/nordpass-csv-importer.spec.ts @@ -3,13 +3,12 @@ import { SecureNoteType, CipherType, FieldType } from "@bitwarden/common/vault/e import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view"; -import { NordPassCsvImporter } from "../src/importers"; - -import { data as creditCardData } from "./test-data/nordpass-csv/nordpass.card.csv"; -import { data as identityData } from "./test-data/nordpass-csv/nordpass.identity.csv"; -import { data as loginDataWithAdditionalUrls } from "./test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv"; -import { data as loginData } from "./test-data/nordpass-csv/nordpass.login.csv"; -import { data as secureNoteData } from "./test-data/nordpass-csv/nordpass.secure-note.csv"; +import { NordPassCsvImporter } from "./nordpass-csv-importer"; +import { data as creditCardData } from "./spec-data/nordpass-csv/nordpass.card.csv"; +import { data as identityData } from "./spec-data/nordpass-csv/nordpass.identity.csv"; +import { data as loginDataWithAdditionalUrls } from "./spec-data/nordpass-csv/nordpass.login-with-additinal-urls.csv"; +import { data as loginData } from "./spec-data/nordpass-csv/nordpass.login.csv"; +import { data as secureNoteData } from "./spec-data/nordpass-csv/nordpass.secure-note.csv"; const namesTestData = [ { diff --git a/libs/importer/spec/onepassword-1pif-importer.spec.ts b/libs/importer/src/importers/onepassword/onepassword-1pif-importer.spec.ts similarity index 99% rename from libs/importer/spec/onepassword-1pif-importer.spec.ts rename to libs/importer/src/importers/onepassword/onepassword-1pif-importer.spec.ts index fbf79ec8e0b..deaf2c904b2 100644 --- a/libs/importer/spec/onepassword-1pif-importer.spec.ts +++ b/libs/importer/src/importers/onepassword/onepassword-1pif-importer.spec.ts @@ -1,6 +1,6 @@ import { FieldType } from "@bitwarden/common/vault/enums"; -import { OnePassword1PifImporter } from "../src/importers"; +import { OnePassword1PifImporter } from "./onepassword-1pif-importer"; const TestData: string = "***aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee***\n" + diff --git a/libs/importer/spec/onepassword-1pux-importer.spec.ts b/libs/importer/src/importers/onepassword/onepassword-1pux-importer.spec.ts similarity index 93% rename from libs/importer/spec/onepassword-1pux-importer.spec.ts rename to libs/importer/src/importers/onepassword/onepassword-1pux-importer.spec.ts index 93de4be606b..d4976f7a198 100644 --- a/libs/importer/spec/onepassword-1pux-importer.spec.ts +++ b/libs/importer/src/importers/onepassword/onepassword-1pux-importer.spec.ts @@ -2,32 +2,32 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { FieldType, SecureNoteType, CipherType } from "@bitwarden/common/vault/enums"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { OnePassword1PuxImporter } from "../src/importers"; +import { APICredentialsData } from "../spec-data/onepassword-1pux/api-credentials"; +import { BankAccountData } from "../spec-data/onepassword-1pux/bank-account"; +import { CreditCardData } from "../spec-data/onepassword-1pux/credit-card"; +import { DatabaseData } from "../spec-data/onepassword-1pux/database"; +import { DriversLicenseData } from "../spec-data/onepassword-1pux/drivers-license"; +import { EmailAccountData } from "../spec-data/onepassword-1pux/email-account"; +import { EmailFieldData } from "../spec-data/onepassword-1pux/email-field"; +import { EmailFieldOnIdentityData } from "../spec-data/onepassword-1pux/email-field-on-identity"; +import { EmailFieldOnIdentityPrefilledData } from "../spec-data/onepassword-1pux/email-field-on-identity_prefilled"; +import { IdentityData } from "../spec-data/onepassword-1pux/identity-data"; +import { LoginData } from "../spec-data/onepassword-1pux/login-data"; +import { MedicalRecordData } from "../spec-data/onepassword-1pux/medical-record"; +import { MembershipData } from "../spec-data/onepassword-1pux/membership"; +import { OnePuxExampleFile } from "../spec-data/onepassword-1pux/onepux_example"; +import { OutdoorLicenseData } from "../spec-data/onepassword-1pux/outdoor-license"; +import { PassportData } from "../spec-data/onepassword-1pux/passport"; +import { PasswordData } from "../spec-data/onepassword-1pux/password"; +import { RewardsProgramData } from "../spec-data/onepassword-1pux/rewards-program"; +import { SanitizedExport } from "../spec-data/onepassword-1pux/sanitized-export"; +import { SecureNoteData } from "../spec-data/onepassword-1pux/secure-note"; +import { ServerData } from "../spec-data/onepassword-1pux/server"; +import { SoftwareLicenseData } from "../spec-data/onepassword-1pux/software-license"; +import { SSNData } from "../spec-data/onepassword-1pux/ssn"; +import { WirelessRouterData } from "../spec-data/onepassword-1pux/wireless-router"; -import { APICredentialsData } from "./test-data/onepassword-1pux/api-credentials"; -import { BankAccountData } from "./test-data/onepassword-1pux/bank-account"; -import { CreditCardData } from "./test-data/onepassword-1pux/credit-card"; -import { DatabaseData } from "./test-data/onepassword-1pux/database"; -import { DriversLicenseData } from "./test-data/onepassword-1pux/drivers-license"; -import { EmailAccountData } from "./test-data/onepassword-1pux/email-account"; -import { EmailFieldData } from "./test-data/onepassword-1pux/email-field"; -import { EmailFieldOnIdentityData } from "./test-data/onepassword-1pux/email-field-on-identity"; -import { EmailFieldOnIdentityPrefilledData } from "./test-data/onepassword-1pux/email-field-on-identity_prefilled"; -import { IdentityData } from "./test-data/onepassword-1pux/identity-data"; -import { LoginData } from "./test-data/onepassword-1pux/login-data"; -import { MedicalRecordData } from "./test-data/onepassword-1pux/medical-record"; -import { MembershipData } from "./test-data/onepassword-1pux/membership"; -import { OnePuxExampleFile } from "./test-data/onepassword-1pux/onepux_example"; -import { OutdoorLicenseData } from "./test-data/onepassword-1pux/outdoor-license"; -import { PassportData } from "./test-data/onepassword-1pux/passport"; -import { PasswordData } from "./test-data/onepassword-1pux/password"; -import { RewardsProgramData } from "./test-data/onepassword-1pux/rewards-program"; -import { SanitizedExport } from "./test-data/onepassword-1pux/sanitized-export"; -import { SecureNoteData } from "./test-data/onepassword-1pux/secure-note"; -import { ServerData } from "./test-data/onepassword-1pux/server"; -import { SoftwareLicenseData } from "./test-data/onepassword-1pux/software-license"; -import { SSNData } from "./test-data/onepassword-1pux/ssn"; -import { WirelessRouterData } from "./test-data/onepassword-1pux/wireless-router"; +import { OnePassword1PuxImporter } from "./onepassword-1pux-importer"; function validateCustomField(fields: FieldView[], fieldName: string, expectedValue: any) { expect(fields).toBeDefined(); diff --git a/libs/importer/spec/onepassword-mac-csv-importer.spec.ts b/libs/importer/src/importers/onepassword/onepassword-mac-csv-importer.spec.ts similarity index 85% rename from libs/importer/spec/onepassword-mac-csv-importer.spec.ts rename to libs/importer/src/importers/onepassword/onepassword-mac-csv-importer.spec.ts index f96d254f4b9..8a4eeae158a 100644 --- a/libs/importer/spec/onepassword-mac-csv-importer.spec.ts +++ b/libs/importer/src/importers/onepassword/onepassword-mac-csv-importer.spec.ts @@ -1,11 +1,11 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { OnePasswordMacCsvImporter } from "../src/importers"; +import { data as creditCardData } from "../spec-data/onepassword-csv/credit-card.mac.csv"; +import { data as identityData } from "../spec-data/onepassword-csv/identity.mac.csv"; +import { data as multiTypeData } from "../spec-data/onepassword-csv/multiple-items.mac.csv"; -import { data as creditCardData } from "./test-data/onepassword-csv/credit-card.mac.csv"; -import { data as identityData } from "./test-data/onepassword-csv/identity.mac.csv"; -import { data as multiTypeData } from "./test-data/onepassword-csv/multiple-items.mac.csv"; +import { OnePasswordMacCsvImporter } from "./onepassword-mac-csv-importer"; function expectIdentity(cipher: CipherView) { expect(cipher.type).toBe(CipherType.Identity); diff --git a/libs/importer/spec/onepassword-win-csv-importer.spec.ts b/libs/importer/src/importers/onepassword/onepassword-win-csv-importer.spec.ts similarity index 86% rename from libs/importer/spec/onepassword-win-csv-importer.spec.ts rename to libs/importer/src/importers/onepassword/onepassword-win-csv-importer.spec.ts index 0e7fac351e7..0e63fe69831 100644 --- a/libs/importer/spec/onepassword-win-csv-importer.spec.ts +++ b/libs/importer/src/importers/onepassword/onepassword-win-csv-importer.spec.ts @@ -2,11 +2,11 @@ import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { OnePasswordWinCsvImporter } from "../src/importers"; +import { data as creditCardData } from "../spec-data/onepassword-csv/credit-card.windows.csv"; +import { data as identityData } from "../spec-data/onepassword-csv/identity.windows.csv"; +import { data as multiTypeData } from "../spec-data/onepassword-csv/multiple-items.windows.csv"; -import { data as creditCardData } from "./test-data/onepassword-csv/credit-card.windows.csv"; -import { data as identityData } from "./test-data/onepassword-csv/identity.windows.csv"; -import { data as multiTypeData } from "./test-data/onepassword-csv/multiple-items.windows.csv"; +import { OnePasswordWinCsvImporter } from "./onepassword-win-csv-importer"; function expectIdentity(cipher: CipherView) { expect(cipher.type).toBe(CipherType.Identity); diff --git a/libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts b/libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts index 353fcf1337e..63a0427b2c7 100644 --- a/libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts +++ b/libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts @@ -120,7 +120,7 @@ export interface Value { export interface Email { email_address: string; - provider: string; + provider: string | null; } export interface Address { diff --git a/libs/importer/spec/passky-json-importer.spec.ts b/libs/importer/src/importers/passky/passky-json-importer.spec.ts similarity index 81% rename from libs/importer/spec/passky-json-importer.spec.ts rename to libs/importer/src/importers/passky/passky-json-importer.spec.ts index ddec76876d8..33be2dfac87 100644 --- a/libs/importer/spec/passky-json-importer.spec.ts +++ b/libs/importer/src/importers/passky/passky-json-importer.spec.ts @@ -1,7 +1,7 @@ -import { PasskyJsonImporter } from "../src/importers"; +import { testData as EncryptedData } from "../spec-data/passky-json/passky-encrypted.json"; +import { testData as UnencryptedData } from "../spec-data/passky-json/passky-unencrypted.json"; -import { testData as EncryptedData } from "./test-data/passky-json/passky-encrypted.json"; -import { testData as UnencryptedData } from "./test-data/passky-json/passky-unencrypted.json"; +import { PasskyJsonImporter } from "./passky-json-importer"; describe("Passky Json Importer", () => { let importer: PasskyJsonImporter; diff --git a/libs/importer/spec/passwordxp-csv-importer.spec.ts b/libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts similarity index 92% rename from libs/importer/spec/passwordxp-csv-importer.spec.ts rename to libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts index fda323450c6..1bcc79723ab 100644 --- a/libs/importer/spec/passwordxp-csv-importer.spec.ts +++ b/libs/importer/src/importers/passsordxp/passwordxp-csv-importer.spec.ts @@ -1,13 +1,13 @@ import { CipherType } from "@bitwarden/common/vault/enums"; -import { PasswordXPCsvImporter } from "../src/importers"; -import { ImportResult } from "../src/models/import-result"; +import { ImportResult } from "../../models/import-result"; +import { dutchHeaders } from "../spec-data/passwordxp-csv/dutch-headers"; +import { germanHeaders } from "../spec-data/passwordxp-csv/german-headers"; +import { noFolder } from "../spec-data/passwordxp-csv/no-folder.csv"; +import { withFolders } from "../spec-data/passwordxp-csv/passwordxp-with-folders.csv"; +import { withoutFolders } from "../spec-data/passwordxp-csv/passwordxp-without-folders.csv"; -import { dutchHeaders } from "./test-data/passwordxp-csv/dutch-headers"; -import { germanHeaders } from "./test-data/passwordxp-csv/german-headers"; -import { noFolder } from "./test-data/passwordxp-csv/no-folder.csv"; -import { withFolders } from "./test-data/passwordxp-csv/passwordxp-with-folders.csv"; -import { withoutFolders } from "./test-data/passwordxp-csv/passwordxp-without-folders.csv"; +import { PasswordXPCsvImporter } from "./passwordxp-csv-importer"; async function importLoginWithCustomFields(importer: PasswordXPCsvImporter, csvData: string) { const result: ImportResult = await importer.parse(csvData); diff --git a/libs/importer/spec/protonpass-json-importer.spec.ts b/libs/importer/src/importers/protonpass/protonpass-json-importer.spec.ts similarity index 98% rename from libs/importer/spec/protonpass-json-importer.spec.ts rename to libs/importer/src/importers/protonpass/protonpass-json-importer.spec.ts index 39a09127c27..b8550bcb191 100644 --- a/libs/importer/spec/protonpass-json-importer.spec.ts +++ b/libs/importer/src/importers/protonpass/protonpass-json-importer.spec.ts @@ -4,9 +4,9 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { Utils } from "@bitwarden/common/platform/misc/utils"; import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; -import { ProtonPassJsonImporter } from "../src/importers"; +import { testData } from "../spec-data/protonpass-json/protonpass.json"; -import { testData } from "./test-data/protonpass-json/protonpass.json"; +import { ProtonPassJsonImporter } from "./protonpass-json-importer"; describe("Protonpass Json Importer", () => { let importer: ProtonPassJsonImporter; diff --git a/libs/importer/spec/psono-json-importer.spec.ts b/libs/importer/src/importers/psono/psono-json-importer.spec.ts similarity index 96% rename from libs/importer/spec/psono-json-importer.spec.ts rename to libs/importer/src/importers/psono/psono-json-importer.spec.ts index 82795e5ea5d..3b4fcf67a30 100644 --- a/libs/importer/spec/psono-json-importer.spec.ts +++ b/libs/importer/src/importers/psono/psono-json-importer.spec.ts @@ -1,19 +1,19 @@ import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; -import { PsonoJsonImporter } from "../src/importers"; +import { ApplicationPasswordsData } from "../spec-data/psono-json/application-passwords"; +import { BookmarkData } from "../spec-data/psono-json/bookmark.json"; +import { EmptyTestFolderData } from "../spec-data/psono-json/empty-folders"; +import { EnvVariablesData } from "../spec-data/psono-json/environment-variables"; +import { FoldersTestData } from "../spec-data/psono-json/folders"; +import { GPGData } from "../spec-data/psono-json/gpg"; +import { NotesData } from "../spec-data/psono-json/notes"; +import { ReducedWebsiteLoginsData } from "../spec-data/psono-json/reduced-website-logins"; +import { SubFoldersTestData } from "../spec-data/psono-json/subfolders"; +import { TOTPData } from "../spec-data/psono-json/totp"; +import { WebsiteLoginsData } from "../spec-data/psono-json/website-logins"; -import { ApplicationPasswordsData } from "./test-data/psono-json/application-passwords"; -import { BookmarkData } from "./test-data/psono-json/bookmark.json"; -import { EmptyTestFolderData } from "./test-data/psono-json/empty-folders"; -import { EnvVariablesData } from "./test-data/psono-json/environment-variables"; -import { FoldersTestData } from "./test-data/psono-json/folders"; -import { GPGData } from "./test-data/psono-json/gpg"; -import { NotesData } from "./test-data/psono-json/notes"; -import { ReducedWebsiteLoginsData } from "./test-data/psono-json/reduced-website-logins"; -import { SubFoldersTestData } from "./test-data/psono-json/subfolders"; -import { TOTPData } from "./test-data/psono-json/totp"; -import { WebsiteLoginsData } from "./test-data/psono-json/website-logins"; +import { PsonoJsonImporter } from "./psono-json-importer"; function validateCustomField( fields: FieldView[], diff --git a/libs/importer/spec/roboform-csv-importer.spec.ts b/libs/importer/src/importers/roboform-csv-importer.spec.ts similarity index 82% rename from libs/importer/spec/roboform-csv-importer.spec.ts rename to libs/importer/src/importers/roboform-csv-importer.spec.ts index 9ec63aadfbc..2779a9ddb64 100644 --- a/libs/importer/spec/roboform-csv-importer.spec.ts +++ b/libs/importer/src/importers/roboform-csv-importer.spec.ts @@ -1,8 +1,8 @@ -import { CipherType } from "../../common/src/vault/enums/cipher-type"; -import { RoboFormCsvImporter } from "../src/importers"; +import { CipherType } from "@bitwarden/common/vault/enums"; -import { data as dataNoFolder } from "./test-data/roboform-csv/empty-folders"; -import { data as dataFolder } from "./test-data/roboform-csv/with-folders"; +import { RoboFormCsvImporter } from "./roboform-csv-importer"; +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", () => { it("should parse CSV data", async () => { diff --git a/libs/importer/spec/safari-csv-importer.spec.ts b/libs/importer/src/importers/safari-csv-importer.spec.ts similarity index 92% rename from libs/importer/spec/safari-csv-importer.spec.ts rename to libs/importer/src/importers/safari-csv-importer.spec.ts index 4a22eb0bdc4..4ca8df23f34 100644 --- a/libs/importer/spec/safari-csv-importer.spec.ts +++ b/libs/importer/src/importers/safari-csv-importer.spec.ts @@ -2,10 +2,9 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; -import { SafariCsvImporter } from "../src/importers"; - -import { data as oldSimplePasswordData } from "./test-data/safari-csv/old-simple-password-data.csv"; -import { data as simplePasswordData } from "./test-data/safari-csv/simple-password-data.csv"; +import { SafariCsvImporter } from "./safari-csv-importer"; +import { data as oldSimplePasswordData } from "./spec-data/safari-csv/old-simple-password-data.csv"; +import { data as simplePasswordData } from "./spec-data/safari-csv/simple-password-data.csv"; const CipherData = [ { diff --git a/libs/importer/spec/securesafe-csv-importer.spec.ts b/libs/importer/src/importers/securesafe-csv-importer.spec.ts similarity index 93% rename from libs/importer/spec/securesafe-csv-importer.spec.ts rename to libs/importer/src/importers/securesafe-csv-importer.spec.ts index 8d12ae12d94..799c3c6e9d5 100644 --- a/libs/importer/spec/securesafe-csv-importer.spec.ts +++ b/libs/importer/src/importers/securesafe-csv-importer.spec.ts @@ -2,9 +2,8 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; -import { SecureSafeCsvImporter } from "../src/importers"; - -import { data_upperUrl, data_lowerUrl } from "./test-data/securesafe-csv/securesafe-example.csv"; +import { SecureSafeCsvImporter } from "./securesafe-csv-importer"; +import { data_upperUrl, data_lowerUrl } from "./spec-data/securesafe-csv/securesafe-example.csv"; const CipherData = [ { diff --git a/libs/importer/spec/test-data/bitwarden-json/account-encrypted.json.ts b/libs/importer/src/importers/spec-data/bitwarden-json/account-encrypted.json.ts similarity index 100% rename from libs/importer/spec/test-data/bitwarden-json/account-encrypted.json.ts rename to libs/importer/src/importers/spec-data/bitwarden-json/account-encrypted.json.ts diff --git a/libs/importer/spec/test-data/bitwarden-json/cipher-with-collections.json.ts b/libs/importer/src/importers/spec-data/bitwarden-json/cipher-with-collections.json.ts similarity index 100% rename from libs/importer/spec/test-data/bitwarden-json/cipher-with-collections.json.ts rename to libs/importer/src/importers/spec-data/bitwarden-json/cipher-with-collections.json.ts diff --git a/libs/importer/spec/test-data/bitwarden-json/password-protected.json.ts b/libs/importer/src/importers/spec-data/bitwarden-json/password-protected.json.ts similarity index 100% rename from libs/importer/spec/test-data/bitwarden-json/password-protected.json.ts rename to libs/importer/src/importers/spec-data/bitwarden-json/password-protected.json.ts diff --git a/libs/importer/spec/test-data/bitwarden-json/unencrypted.json.ts b/libs/importer/src/importers/spec-data/bitwarden-json/unencrypted.json.ts similarity index 100% rename from libs/importer/spec/test-data/bitwarden-json/unencrypted.json.ts rename to libs/importer/src/importers/spec-data/bitwarden-json/unencrypted.json.ts diff --git a/libs/importer/spec/test-data/chrome-csv/android-data.csv.ts b/libs/importer/src/importers/spec-data/chrome-csv/android-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/chrome-csv/android-data.csv.ts rename to libs/importer/src/importers/spec-data/chrome-csv/android-data.csv.ts diff --git a/libs/importer/spec/test-data/chrome-csv/simple-password-data.csv.ts b/libs/importer/src/importers/spec-data/chrome-csv/simple-password-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/chrome-csv/simple-password-data.csv.ts rename to libs/importer/src/importers/spec-data/chrome-csv/simple-password-data.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/credentials-otpurl.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/credentials-otpurl.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/credentials-otpurl.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/credentials-otpurl.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/credentials.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/credentials.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/credentials.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/credentials.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/id.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/id.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/id.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/id.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/multiple-personal-info.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/multiple-personal-info.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/multiple-personal-info.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/multiple-personal-info.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/payments.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/payments.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/payments.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/payments.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/personal-info.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/personal-info.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/personal-info.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/personal-info.csv.ts diff --git a/libs/importer/spec/test-data/dashlane-csv/securenotes.csv.ts b/libs/importer/src/importers/spec-data/dashlane-csv/securenotes.csv.ts similarity index 100% rename from libs/importer/spec/test-data/dashlane-csv/securenotes.csv.ts rename to libs/importer/src/importers/spec-data/dashlane-csv/securenotes.csv.ts diff --git a/libs/importer/spec/test-data/enpass-json/credit-card.ts b/libs/importer/src/importers/spec-data/enpass-json/credit-card.ts similarity index 98% rename from libs/importer/spec/test-data/enpass-json/credit-card.ts rename to libs/importer/src/importers/spec-data/enpass-json/credit-card.ts index 621190a735f..207e934903f 100644 --- a/libs/importer/spec/test-data/enpass-json/credit-card.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/credit-card.ts @@ -1,4 +1,4 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; export const creditCard: EnpassJsonFile = { folders: [], diff --git a/libs/importer/spec/test-data/enpass-json/folders.ts b/libs/importer/src/importers/spec-data/enpass-json/folders.ts similarity index 91% rename from libs/importer/spec/test-data/enpass-json/folders.ts rename to libs/importer/src/importers/spec-data/enpass-json/folders.ts index 22ab26524b0..9af44f057bf 100644 --- a/libs/importer/spec/test-data/enpass-json/folders.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/folders.ts @@ -1,4 +1,4 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; export const folders: EnpassJsonFile = { folders: [ diff --git a/libs/importer/spec/test-data/enpass-json/login-android-url.ts b/libs/importer/src/importers/spec-data/enpass-json/login-android-url.ts similarity index 95% rename from libs/importer/spec/test-data/enpass-json/login-android-url.ts rename to libs/importer/src/importers/spec-data/enpass-json/login-android-url.ts index 6b0ac41ccde..91dca5fe99a 100644 --- a/libs/importer/spec/test-data/enpass-json/login-android-url.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/login-android-url.ts @@ -1,4 +1,5 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +// @ts-strict-ignore +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; import { login } from "./login"; diff --git a/libs/importer/spec/test-data/enpass-json/login.ts b/libs/importer/src/importers/spec-data/enpass-json/login.ts similarity index 97% rename from libs/importer/spec/test-data/enpass-json/login.ts rename to libs/importer/src/importers/spec-data/enpass-json/login.ts index 07707f2ca3e..6626b8c9e4b 100644 --- a/libs/importer/spec/test-data/enpass-json/login.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/login.ts @@ -1,4 +1,4 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; export const login: EnpassJsonFile = { folders: [], diff --git a/libs/importer/spec/test-data/enpass-json/note.ts b/libs/importer/src/importers/spec-data/enpass-json/note.ts similarity index 86% rename from libs/importer/spec/test-data/enpass-json/note.ts rename to libs/importer/src/importers/spec-data/enpass-json/note.ts index 58f54371ad0..37c1658b517 100644 --- a/libs/importer/spec/test-data/enpass-json/note.ts +++ b/libs/importer/src/importers/spec-data/enpass-json/note.ts @@ -1,4 +1,4 @@ -import { EnpassJsonFile } from "../../../src/importers/enpass/types/enpass-json-type"; +import { EnpassJsonFile } from "../../enpass/types/enpass-json-type"; export const note: EnpassJsonFile = { folders: [], diff --git a/libs/importer/spec/test-data/firefox-csv/firefox-accounts-data.csv.ts b/libs/importer/src/importers/spec-data/firefox-csv/firefox-accounts-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/firefox-csv/firefox-accounts-data.csv.ts rename to libs/importer/src/importers/spec-data/firefox-csv/firefox-accounts-data.csv.ts diff --git a/libs/importer/spec/test-data/firefox-csv/simple-password-data.csv.ts b/libs/importer/src/importers/spec-data/firefox-csv/simple-password-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/firefox-csv/simple-password-data.csv.ts rename to libs/importer/src/importers/spec-data/firefox-csv/simple-password-data.csv.ts diff --git a/libs/importer/spec/test-data/keepass2-xml/keepass2-xml-importer-testdata.ts b/libs/importer/src/importers/spec-data/keepass2-xml/keepass2-xml-importer-testdata.ts similarity index 100% rename from libs/importer/spec/test-data/keepass2-xml/keepass2-xml-importer-testdata.ts rename to libs/importer/src/importers/spec-data/keepass2-xml/keepass2-xml-importer-testdata.ts diff --git a/libs/importer/spec/test-data/keepassx-csv/testdata.csv.ts b/libs/importer/src/importers/spec-data/keepassx-csv/testdata.csv.ts similarity index 100% rename from libs/importer/spec/test-data/keepassx-csv/testdata.csv.ts rename to libs/importer/src/importers/spec-data/keepassx-csv/testdata.csv.ts diff --git a/libs/importer/spec/test-data/keeper-csv/testdata.csv.ts b/libs/importer/src/importers/spec-data/keeper-csv/testdata.csv.ts similarity index 100% rename from libs/importer/spec/test-data/keeper-csv/testdata.csv.ts rename to libs/importer/src/importers/spec-data/keeper-csv/testdata.csv.ts diff --git a/libs/importer/spec/test-data/keeper-json/testdata.json.ts b/libs/importer/src/importers/spec-data/keeper-json/testdata.json.ts similarity index 95% rename from libs/importer/spec/test-data/keeper-json/testdata.json.ts rename to libs/importer/src/importers/spec-data/keeper-json/testdata.json.ts index 952ced5027f..e18789adcb5 100644 --- a/libs/importer/spec/test-data/keeper-json/testdata.json.ts +++ b/libs/importer/src/importers/spec-data/keeper-json/testdata.json.ts @@ -1,4 +1,4 @@ -import { KeeperJsonExport } from "../../../src/importers/keeper/types/keeper-json-types"; +import { KeeperJsonExport } from "../../keeper/types/keeper-json-types"; export const testData: KeeperJsonExport = { shared_folders: [ diff --git a/libs/importer/spec/test-data/myki-csv/user-account.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-account.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-account.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-account.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-credit-card.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-credit-card.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-credit-card.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-credit-card.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-id-card.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-id-card.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-id-card.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-id-card.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-identity.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-identity.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-identity.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-identity.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-note.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-note.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-note.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-note.csv.ts diff --git a/libs/importer/spec/test-data/myki-csv/user-twofa.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-twofa.csv.ts similarity index 100% rename from libs/importer/spec/test-data/myki-csv/user-twofa.csv.ts rename to libs/importer/src/importers/spec-data/myki-csv/user-twofa.csv.ts diff --git a/libs/importer/spec/test-data/netwrix-csv/login-export.csv.ts b/libs/importer/src/importers/spec-data/netwrix-csv/login-export.csv.ts similarity index 100% rename from libs/importer/spec/test-data/netwrix-csv/login-export.csv.ts rename to libs/importer/src/importers/spec-data/netwrix-csv/login-export.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.card.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.card.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.card.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.card.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.identity.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.identity.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.identity.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.identity.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.login-with-additinal-urls.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.login.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.login.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.login.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.login.csv.ts diff --git a/libs/importer/spec/test-data/nordpass-csv/nordpass.secure-note.csv.ts b/libs/importer/src/importers/spec-data/nordpass-csv/nordpass.secure-note.csv.ts similarity index 100% rename from libs/importer/spec/test-data/nordpass-csv/nordpass.secure-note.csv.ts rename to libs/importer/src/importers/spec-data/nordpass-csv/nordpass.secure-note.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-1pux/api-credentials.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/api-credentials.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/api-credentials.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/api-credentials.ts index 7a830194b8c..f8047ad8d84 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/api-credentials.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/api-credentials.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const APICredentialsData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/bank-account.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/bank-account.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/bank-account.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/bank-account.ts index 6ffccafe514..f98e205624b 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/bank-account.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/bank-account.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const BankAccountData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/credit-card.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/credit-card.ts similarity index 99% rename from libs/importer/spec/test-data/onepassword-1pux/credit-card.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/credit-card.ts index 74af97a4c2b..5ed4cd8ef1b 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/credit-card.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/credit-card.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const CreditCardData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/database.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/database.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/database.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/database.ts index 58631a2f98b..316107e54fc 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/database.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/database.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const DatabaseData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/drivers-license.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/drivers-license.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/drivers-license.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/drivers-license.ts index 54a52f36999..2c50cd2c42e 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/drivers-license.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/drivers-license.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const DriversLicenseData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/email-account.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/email-account.ts similarity index 99% rename from libs/importer/spec/test-data/onepassword-1pux/email-account.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/email-account.ts index 0d94973ec29..a164f4bc504 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/email-account.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/email-account.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const EmailAccountData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity.ts index 009743dfd08..8e72088e170 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const EmailFieldOnIdentityData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity_prefilled.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity_prefilled.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity_prefilled.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity_prefilled.ts index 591d27bd227..79a306faf2c 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/email-field-on-identity_prefilled.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field-on-identity_prefilled.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const EmailFieldOnIdentityPrefilledData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/email-field.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/email-field.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/email-field.ts index f6258bda7fa..5360c9484ee 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/email-field.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/email-field.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const EmailFieldData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/identity-data.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/identity-data.ts similarity index 99% rename from libs/importer/spec/test-data/onepassword-1pux/identity-data.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/identity-data.ts index c97a2bbaf45..eb0a5555201 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/identity-data.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/identity-data.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const IdentityData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/login-data.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/login-data.ts similarity index 97% rename from libs/importer/spec/test-data/onepassword-1pux/login-data.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/login-data.ts index dc6a026d835..6d0515cb8cb 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/login-data.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/login-data.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const LoginData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/medical-record.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/medical-record.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/medical-record.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/medical-record.ts index 67a929b13b1..5746ca99956 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/medical-record.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/medical-record.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const MedicalRecordData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/membership.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/membership.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/membership.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/membership.ts index 5e36e8e6c9f..1801f0a4f92 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/membership.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/membership.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const MembershipData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/onepux_example.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/onepux_example.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/onepux_example.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/onepux_example.ts index 38f81783671..dc7c59c589b 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/onepux_example.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/onepux_example.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const OnePuxExampleFile: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/outdoor-license.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/outdoor-license.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/outdoor-license.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/outdoor-license.ts index aa8df12948e..b31bc0300a1 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/outdoor-license.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/outdoor-license.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const OutdoorLicenseData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/passport.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/passport.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/passport.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/passport.ts index 00336aa70cd..1a22601a3c2 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/passport.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/passport.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const PassportData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/password.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/password.ts similarity index 93% rename from libs/importer/spec/test-data/onepassword-1pux/password.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/password.ts index e416ab9c715..d9169ab3cab 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/password.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/password.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const PasswordData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/rewards-program.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/rewards-program.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/rewards-program.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/rewards-program.ts index 75333086435..223bae6f39d 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/rewards-program.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/rewards-program.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const RewardsProgramData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/sanitized-export.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/sanitized-export.ts similarity index 99% rename from libs/importer/spec/test-data/onepassword-1pux/sanitized-export.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/sanitized-export.ts index 284921eb80e..bf1e87c9c1d 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/sanitized-export.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/sanitized-export.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const SanitizedExport: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/secure-note.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/secure-note.ts similarity index 93% rename from libs/importer/spec/test-data/onepassword-1pux/secure-note.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/secure-note.ts index d7f93c9895c..0e02b2533be 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/secure-note.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/secure-note.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const SecureNoteData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/server.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/server.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/server.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/server.ts index 59e7a841f9c..c74deceb6f9 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/server.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/server.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const ServerData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/software-license.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/software-license.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/software-license.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/software-license.ts index a6ccea53059..0fdf683a426 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/software-license.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/software-license.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const SoftwareLicenseData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/ssn.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/ssn.ts similarity index 96% rename from libs/importer/spec/test-data/onepassword-1pux/ssn.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/ssn.ts index 4b1c5e13739..1514094e095 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/ssn.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/ssn.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const SSNData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-1pux/wireless-router.ts b/libs/importer/src/importers/spec-data/onepassword-1pux/wireless-router.ts similarity index 98% rename from libs/importer/spec/test-data/onepassword-1pux/wireless-router.ts rename to libs/importer/src/importers/spec-data/onepassword-1pux/wireless-router.ts index cef06abe612..b3193484363 100644 --- a/libs/importer/spec/test-data/onepassword-1pux/wireless-router.ts +++ b/libs/importer/src/importers/spec-data/onepassword-1pux/wireless-router.ts @@ -1,4 +1,4 @@ -import { ExportData } from "../../../src/importers/onepassword/types/onepassword-1pux-importer-types"; +import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types"; export const WirelessRouterData: ExportData = { accounts: [ diff --git a/libs/importer/spec/test-data/onepassword-csv/credit-card.mac.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/credit-card.mac.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/credit-card.mac.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/credit-card.mac.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/credit-card.windows.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/credit-card.windows.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/credit-card.windows.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/credit-card.windows.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/identity.mac.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/identity.mac.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/identity.mac.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/identity.mac.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/identity.windows.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/identity.windows.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/identity.windows.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/identity.windows.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/multiple-items.mac.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/multiple-items.mac.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/multiple-items.mac.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/multiple-items.mac.csv.ts diff --git a/libs/importer/spec/test-data/onepassword-csv/multiple-items.windows.csv.ts b/libs/importer/src/importers/spec-data/onepassword-csv/multiple-items.windows.csv.ts similarity index 100% rename from libs/importer/spec/test-data/onepassword-csv/multiple-items.windows.csv.ts rename to libs/importer/src/importers/spec-data/onepassword-csv/multiple-items.windows.csv.ts diff --git a/libs/importer/spec/test-data/passky-json/passky-encrypted.json.ts b/libs/importer/src/importers/spec-data/passky-json/passky-encrypted.json.ts similarity index 85% rename from libs/importer/spec/test-data/passky-json/passky-encrypted.json.ts rename to libs/importer/src/importers/spec-data/passky-json/passky-encrypted.json.ts index 6b9743be343..a73894ce0c2 100644 --- a/libs/importer/spec/test-data/passky-json/passky-encrypted.json.ts +++ b/libs/importer/src/importers/spec-data/passky-json/passky-encrypted.json.ts @@ -1,4 +1,4 @@ -import { PasskyJsonExport } from "../../../src/importers/passky/passky-json-types"; +import { PasskyJsonExport } from "../../passky/passky-json-types"; export const testData: PasskyJsonExport = { encrypted: true, diff --git a/libs/importer/spec/test-data/passky-json/passky-unencrypted.json.ts b/libs/importer/src/importers/spec-data/passky-json/passky-unencrypted.json.ts similarity index 73% rename from libs/importer/spec/test-data/passky-json/passky-unencrypted.json.ts rename to libs/importer/src/importers/spec-data/passky-json/passky-unencrypted.json.ts index c382136648a..738595a6d25 100644 --- a/libs/importer/spec/test-data/passky-json/passky-unencrypted.json.ts +++ b/libs/importer/src/importers/spec-data/passky-json/passky-unencrypted.json.ts @@ -1,4 +1,4 @@ -import { PasskyJsonExport } from "../../../src/importers/passky/passky-json-types"; +import { PasskyJsonExport } from "../../passky/passky-json-types"; export const testData: PasskyJsonExport = { encrypted: false, diff --git a/libs/importer/spec/test-data/passwordxp-csv/dutch-headers.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/dutch-headers.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/dutch-headers.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/dutch-headers.ts diff --git a/libs/importer/spec/test-data/passwordxp-csv/german-headers.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/german-headers.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/german-headers.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/german-headers.ts diff --git a/libs/importer/spec/test-data/passwordxp-csv/no-folder.csv.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/no-folder.csv.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/no-folder.csv.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/no-folder.csv.ts diff --git a/libs/importer/spec/test-data/passwordxp-csv/passwordxp-with-folders.csv.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/passwordxp-with-folders.csv.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/passwordxp-with-folders.csv.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/passwordxp-with-folders.csv.ts diff --git a/libs/importer/spec/test-data/passwordxp-csv/passwordxp-without-folders.csv.ts b/libs/importer/src/importers/spec-data/passwordxp-csv/passwordxp-without-folders.csv.ts similarity index 100% rename from libs/importer/spec/test-data/passwordxp-csv/passwordxp-without-folders.csv.ts rename to libs/importer/src/importers/spec-data/passwordxp-csv/passwordxp-without-folders.csv.ts diff --git a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts b/libs/importer/src/importers/spec-data/protonpass-json/protonpass.json.ts similarity index 99% rename from libs/importer/spec/test-data/protonpass-json/protonpass.json.ts rename to libs/importer/src/importers/spec-data/protonpass-json/protonpass.json.ts index 367c2b37e14..d01cfa0d8f8 100644 --- a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts +++ b/libs/importer/src/importers/spec-data/protonpass-json/protonpass.json.ts @@ -1,4 +1,4 @@ -import { ProtonPassJsonFile } from "../../../src/importers/protonpass/types/protonpass-json-type"; +import { ProtonPassJsonFile } from "../../protonpass/types/protonpass-json-type"; export const testData: ProtonPassJsonFile = { version: "1.21.2", diff --git a/libs/importer/spec/test-data/psono-json/application-passwords.ts b/libs/importer/src/importers/spec-data/psono-json/application-passwords.ts similarity index 87% rename from libs/importer/spec/test-data/psono-json/application-passwords.ts rename to libs/importer/src/importers/spec-data/psono-json/application-passwords.ts index 29c4a44e0c9..c224c593d97 100644 --- a/libs/importer/spec/test-data/psono-json/application-passwords.ts +++ b/libs/importer/src/importers/spec-data/psono-json/application-passwords.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const ApplicationPasswordsData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/bookmark.json.ts b/libs/importer/src/importers/spec-data/psono-json/bookmark.json.ts similarity index 86% rename from libs/importer/spec/test-data/psono-json/bookmark.json.ts rename to libs/importer/src/importers/spec-data/psono-json/bookmark.json.ts index fe0726fbe40..b50928cfe7b 100644 --- a/libs/importer/spec/test-data/psono-json/bookmark.json.ts +++ b/libs/importer/src/importers/spec-data/psono-json/bookmark.json.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const BookmarkData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/empty-folders.ts b/libs/importer/src/importers/spec-data/psono-json/empty-folders.ts similarity index 62% rename from libs/importer/spec/test-data/psono-json/empty-folders.ts rename to libs/importer/src/importers/spec-data/psono-json/empty-folders.ts index 914cba585fe..28e1d697094 100644 --- a/libs/importer/spec/test-data/psono-json/empty-folders.ts +++ b/libs/importer/src/importers/spec-data/psono-json/empty-folders.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const EmptyTestFolderData: PsonoJsonExport = { folders: [ diff --git a/libs/importer/spec/test-data/psono-json/environment-variables.ts b/libs/importer/src/importers/spec-data/psono-json/environment-variables.ts similarity index 88% rename from libs/importer/spec/test-data/psono-json/environment-variables.ts rename to libs/importer/src/importers/spec-data/psono-json/environment-variables.ts index 9a26776ebc8..7ab411d2216 100644 --- a/libs/importer/spec/test-data/psono-json/environment-variables.ts +++ b/libs/importer/src/importers/spec-data/psono-json/environment-variables.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const EnvVariablesData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/folders.ts b/libs/importer/src/importers/spec-data/psono-json/folders.ts similarity index 96% rename from libs/importer/spec/test-data/psono-json/folders.ts rename to libs/importer/src/importers/spec-data/psono-json/folders.ts index d6e64b7cddb..5e2c9481515 100644 --- a/libs/importer/spec/test-data/psono-json/folders.ts +++ b/libs/importer/src/importers/spec-data/psono-json/folders.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const FoldersTestData: PsonoJsonExport = { folders: [ diff --git a/libs/importer/spec/test-data/psono-json/gpg.ts b/libs/importer/src/importers/spec-data/psono-json/gpg.ts similarity index 99% rename from libs/importer/spec/test-data/psono-json/gpg.ts rename to libs/importer/src/importers/spec-data/psono-json/gpg.ts index 4015b53aa4e..57494f4d761 100644 --- a/libs/importer/spec/test-data/psono-json/gpg.ts +++ b/libs/importer/src/importers/spec-data/psono-json/gpg.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const GPGData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/notes.ts b/libs/importer/src/importers/spec-data/psono-json/notes.ts similarity index 82% rename from libs/importer/spec/test-data/psono-json/notes.ts rename to libs/importer/src/importers/spec-data/psono-json/notes.ts index 0317371456d..0e9859ee1ed 100644 --- a/libs/importer/spec/test-data/psono-json/notes.ts +++ b/libs/importer/src/importers/spec-data/psono-json/notes.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const NotesData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/reduced-website-logins.ts b/libs/importer/src/importers/spec-data/psono-json/reduced-website-logins.ts similarity index 87% rename from libs/importer/spec/test-data/psono-json/reduced-website-logins.ts rename to libs/importer/src/importers/spec-data/psono-json/reduced-website-logins.ts index 4477c9d5240..9c286f59b52 100644 --- a/libs/importer/spec/test-data/psono-json/reduced-website-logins.ts +++ b/libs/importer/src/importers/spec-data/psono-json/reduced-website-logins.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const ReducedWebsiteLoginsData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/subfolders.ts b/libs/importer/src/importers/spec-data/psono-json/subfolders.ts similarity index 97% rename from libs/importer/spec/test-data/psono-json/subfolders.ts rename to libs/importer/src/importers/spec-data/psono-json/subfolders.ts index eff55581da7..2aff686aa17 100644 --- a/libs/importer/spec/test-data/psono-json/subfolders.ts +++ b/libs/importer/src/importers/spec-data/psono-json/subfolders.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const SubFoldersTestData: PsonoJsonExport = { folders: [ diff --git a/libs/importer/spec/test-data/psono-json/totp.ts b/libs/importer/src/importers/spec-data/psono-json/totp.ts similarity index 85% rename from libs/importer/spec/test-data/psono-json/totp.ts rename to libs/importer/src/importers/spec-data/psono-json/totp.ts index 62d3c43431c..ec7cabf7ec9 100644 --- a/libs/importer/spec/test-data/psono-json/totp.ts +++ b/libs/importer/src/importers/spec-data/psono-json/totp.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const TOTPData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/psono-json/website-logins.ts b/libs/importer/src/importers/spec-data/psono-json/website-logins.ts similarity index 90% rename from libs/importer/spec/test-data/psono-json/website-logins.ts rename to libs/importer/src/importers/spec-data/psono-json/website-logins.ts index 85154090492..28a2f35328e 100644 --- a/libs/importer/spec/test-data/psono-json/website-logins.ts +++ b/libs/importer/src/importers/spec-data/psono-json/website-logins.ts @@ -1,4 +1,4 @@ -import { PsonoJsonExport } from "../../../src/importers/psono/psono-json-types"; +import { PsonoJsonExport } from "../../psono/psono-json-types"; export const WebsiteLoginsData: PsonoJsonExport = { folders: [], diff --git a/libs/importer/spec/test-data/roboform-csv/empty-folders.ts b/libs/importer/src/importers/spec-data/roboform-csv/empty-folders.ts similarity index 100% rename from libs/importer/spec/test-data/roboform-csv/empty-folders.ts rename to libs/importer/src/importers/spec-data/roboform-csv/empty-folders.ts diff --git a/libs/importer/spec/test-data/roboform-csv/with-folders.ts b/libs/importer/src/importers/spec-data/roboform-csv/with-folders.ts similarity index 100% rename from libs/importer/spec/test-data/roboform-csv/with-folders.ts rename to libs/importer/src/importers/spec-data/roboform-csv/with-folders.ts diff --git a/libs/importer/spec/test-data/safari-csv/old-simple-password-data.csv.ts b/libs/importer/src/importers/spec-data/safari-csv/old-simple-password-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/safari-csv/old-simple-password-data.csv.ts rename to libs/importer/src/importers/spec-data/safari-csv/old-simple-password-data.csv.ts diff --git a/libs/importer/spec/test-data/safari-csv/simple-password-data.csv.ts b/libs/importer/src/importers/spec-data/safari-csv/simple-password-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/safari-csv/simple-password-data.csv.ts rename to libs/importer/src/importers/spec-data/safari-csv/simple-password-data.csv.ts diff --git a/libs/importer/spec/test-data/safeincloud/test-data.xml.ts b/libs/importer/src/importers/spec-data/safeincloud/test-data.xml.ts similarity index 100% rename from libs/importer/spec/test-data/safeincloud/test-data.xml.ts rename to libs/importer/src/importers/spec-data/safeincloud/test-data.xml.ts diff --git a/libs/importer/spec/test-data/securesafe-csv/securesafe-example.csv.ts b/libs/importer/src/importers/spec-data/securesafe-csv/securesafe-example.csv.ts similarity index 100% rename from libs/importer/spec/test-data/securesafe-csv/securesafe-example.csv.ts rename to libs/importer/src/importers/spec-data/securesafe-csv/securesafe-example.csv.ts diff --git a/libs/importer/spec/test-data/zohovault/sample-zohovault-data.csv.ts b/libs/importer/src/importers/spec-data/zohovault/sample-zohovault-data.csv.ts similarity index 100% rename from libs/importer/spec/test-data/zohovault/sample-zohovault-data.csv.ts rename to libs/importer/src/importers/spec-data/zohovault/sample-zohovault-data.csv.ts diff --git a/libs/importer/spec/zohovault-csv-importer.spec.ts b/libs/importer/src/importers/zohovault-csv-importer.spec.ts similarity index 95% rename from libs/importer/spec/zohovault-csv-importer.spec.ts rename to libs/importer/src/importers/zohovault-csv-importer.spec.ts index 28318945291..e49b527cbbf 100644 --- a/libs/importer/spec/zohovault-csv-importer.spec.ts +++ b/libs/importer/src/importers/zohovault-csv-importer.spec.ts @@ -2,9 +2,8 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; -import { ZohoVaultCsvImporter } from "../src/importers"; - -import { data as samplezohovaultcsvdata } from "./test-data/zohovault/sample-zohovault-data.csv"; +import { data as samplezohovaultcsvdata } from "./spec-data/zohovault/sample-zohovault-data.csv"; +import { ZohoVaultCsvImporter } from "./zohovault-csv-importer"; const CipherData = [ { diff --git a/libs/importer/src/services/import.service.spec.ts b/libs/importer/src/services/import.service.spec.ts index e8f63ef8705..4de0bf70b07 100644 --- a/libs/importer/src/services/import.service.spec.ts +++ b/libs/importer/src/services/import.service.spec.ts @@ -3,7 +3,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { CollectionService, CollectionView } from "@bitwarden/admin-console/common"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; diff --git a/libs/importer/src/services/import.service.ts b/libs/importer/src/services/import.service.ts index 493713b1d7a..781b4f75e56 100644 --- a/libs/importer/src/services/import.service.ts +++ b/libs/importer/src/services/import.service.ts @@ -9,11 +9,11 @@ import { } from "@bitwarden/admin-console/common"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ImportCiphersRequest } from "@bitwarden/common/models/request/import-ciphers.request"; import { ImportOrganizationCiphersRequest } from "@bitwarden/common/models/request/import-organization-ciphers.request"; import { KvpRequest } from "@bitwarden/common/models/request/kvp.request"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; diff --git a/libs/importer/tsconfig.json b/libs/importer/tsconfig.json index 09eb33e2884..e16a16a0337 100644 --- a/libs/importer/tsconfig.json +++ b/libs/importer/tsconfig.json @@ -17,6 +17,6 @@ "@bitwarden/vault-export-core": ["../tools/export/vault-export/vault-export-core/src"] } }, - "include": ["src", "spec"], + "include": ["src"], "exclude": ["node_modules", "dist"] } diff --git a/libs/key-management/src/biometrics/biometric-state.service.spec.ts b/libs/key-management/src/biometrics/biometric-state.service.spec.ts index 2f11537127b..338826dfcba 100644 --- a/libs/key-management/src/biometrics/biometric-state.service.spec.ts +++ b/libs/key-management/src/biometrics/biometric-state.service.spec.ts @@ -1,15 +1,16 @@ import { firstValueFrom } from "rxjs"; import { EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; -import { UserId } from "@bitwarden/common/types/guid"; - -import { makeEncString, trackEmissions } from "../../../common/spec"; import { + makeEncString, + trackEmissions, + FakeStateProvider, + FakeGlobalState, + FakeSingleUserState, FakeAccountService, mockAccountServiceWith, -} from "../../../common/spec/fake-account-service"; -import { FakeGlobalState, FakeSingleUserState } from "../../../common/spec/fake-state"; -import { FakeStateProvider } from "../../../common/spec/fake-state-provider"; +} from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; import { BiometricStateService, DefaultBiometricStateService } from "./biometric-state.service"; import { @@ -51,7 +52,7 @@ describe("BiometricStateService", () => { it("emits false when the require password on start state is undefined", async () => { const state = stateProvider.activeUser.getFake(REQUIRE_PASSWORD_ON_START); - state.nextState(undefined); + state.nextState(undefined as unknown as boolean); expect(await firstValueFrom(sut.requirePasswordOnStart$)).toBe(false); }); @@ -60,14 +61,14 @@ describe("BiometricStateService", () => { describe("encryptedClientKeyHalf$", () => { it("emits when the encryptedClientKeyHalf state changes", async () => { const state = stateProvider.activeUser.getFake(ENCRYPTED_CLIENT_KEY_HALF); - state.nextState(encryptedClientKeyHalf); + state.nextState(encryptedClientKeyHalf as unknown as EncryptedString); expect(await firstValueFrom(sut.encryptedClientKeyHalf$)).toEqual(encClientKeyHalf); }); it("emits false when the encryptedClientKeyHalf state is undefined", async () => { const state = stateProvider.activeUser.getFake(ENCRYPTED_CLIENT_KEY_HALF); - state.nextState(undefined); + state.nextState(undefined as unknown as EncryptedString); expect(await firstValueFrom(sut.encryptedClientKeyHalf$)).toBe(null); }); @@ -76,7 +77,7 @@ describe("BiometricStateService", () => { describe("fingerprintValidated$", () => { it("emits when the fingerprint validated state changes", async () => { const state = stateProvider.global.getFake(FINGERPRINT_VALIDATED); - state.stateSubject.next(undefined); + state.stateSubject.next(undefined as unknown as boolean); expect(await firstValueFrom(sut.fingerprintValidated$)).toBe(false); @@ -172,7 +173,7 @@ describe("BiometricStateService", () => { }); it("throws when called with no active user", async () => { - await accountService.switchAccount(null); + await accountService.switchAccount(null as unknown as UserId); await expect(sut.setUserPromptCancelled()).rejects.toThrow( "Cannot update biometric prompt cancelled state without an active user", ); @@ -261,7 +262,7 @@ describe("BiometricStateService", () => { it("emits false when biometricUnlockEnabled state is undefined", async () => { const state = stateProvider.activeUser.getFake(BIOMETRIC_UNLOCK_ENABLED); - state.nextState(undefined); + state.nextState(undefined as unknown as boolean); expect(await firstValueFrom(sut.biometricUnlockEnabled$)).toBe(false); }); @@ -291,7 +292,9 @@ describe("BiometricStateService", () => { }); it("returns false when the state is not set", async () => { - stateProvider.singleUser.getFake(userId, BIOMETRIC_UNLOCK_ENABLED).nextState(undefined); + stateProvider.singleUser + .getFake(userId, BIOMETRIC_UNLOCK_ENABLED) + .nextState(undefined as unknown as boolean); expect(await sut.getBiometricUnlockEnabled(userId)).toBe(false); }); diff --git a/libs/key-management/src/biometrics/biometric-state.service.ts b/libs/key-management/src/biometrics/biometric-state.service.ts index ae6e52ce632..837c266bee5 100644 --- a/libs/key-management/src/biometrics/biometric-state.service.ts +++ b/libs/key-management/src/biometrics/biometric-state.service.ts @@ -1,16 +1,8 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { Observable, firstValueFrom, map, combineLatest } from "rxjs"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EncryptedString, EncString } from "../../../common/src/platform/models/domain/enc-string"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { ActiveUserState, GlobalState, StateProvider } from "../../../common/src/platform/state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { UserId } from "../../../common/src/types/guid"; +import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { ActiveUserState, GlobalState, StateProvider } from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; import { BIOMETRIC_UNLOCK_ENABLED, @@ -34,7 +26,7 @@ export abstract class BiometricStateService { * * Tracks the currently active user */ - abstract encryptedClientKeyHalf$: Observable; + abstract encryptedClientKeyHalf$: Observable; /** * whether or not a password is required on first unlock after opening the application * @@ -71,42 +63,54 @@ export abstract class BiometricStateService { * @param value whether or not a password is required on first unlock after opening the application */ abstract setRequirePasswordOnStart(value: boolean): Promise; + /** * Updates the biometric unlock enabled state for the currently active user. * @param enabled whether or not to store a biometric key to unlock the vault */ abstract setBiometricUnlockEnabled(enabled: boolean): Promise; + /** * Gets the biometric unlock enabled state for the given user. * @param userId user Id to check */ abstract getBiometricUnlockEnabled(userId: UserId): Promise; + abstract setEncryptedClientKeyHalf(encryptedKeyHalf: EncString, userId?: UserId): Promise; - abstract getEncryptedClientKeyHalf(userId: UserId): Promise; + + abstract getEncryptedClientKeyHalf(userId: UserId): Promise; + abstract getRequirePasswordOnStart(userId: UserId): Promise; + abstract removeEncryptedClientKeyHalf(userId: UserId): Promise; + /** * Updates the active user's state to reflect that they've been warned about requiring password on start. */ abstract setDismissedRequirePasswordOnStartCallout(): Promise; + /** * Updates the active user's state to reflect that they've cancelled the biometric prompt. */ abstract setUserPromptCancelled(): Promise; + /** * Resets the given user's state to reflect that they haven't cancelled the biometric prompt. * @param userId the user to reset the prompt cancelled state for. If not provided, the currently active user will be used. */ abstract resetUserPromptCancelled(userId?: UserId): Promise; + /** * Resets all user's state to reflect that they haven't cancelled the biometric prompt. */ abstract resetAllPromptCancelled(): Promise; + /** * Updates the currently active user's setting for auto prompting for biometrics on application start and lock * @param prompt Whether or not to prompt for biometrics on application start. */ abstract setPromptAutomatically(prompt: boolean): Promise; + /** * Updates whether or not IPC has been validated by the user this session * @param validated the value to save @@ -115,7 +119,7 @@ export abstract class BiometricStateService { abstract updateLastProcessReload(): Promise; - abstract getLastProcessReload(): Promise; + abstract getLastProcessReload(): Promise; abstract logout(userId: UserId): Promise; } @@ -123,20 +127,20 @@ export abstract class BiometricStateService { export class DefaultBiometricStateService implements BiometricStateService { private biometricUnlockEnabledState: ActiveUserState; private requirePasswordOnStartState: ActiveUserState; - private encryptedClientKeyHalfState: ActiveUserState; + private encryptedClientKeyHalfState: ActiveUserState; private dismissedRequirePasswordOnStartCalloutState: ActiveUserState; private promptCancelledState: GlobalState>; private promptAutomaticallyState: ActiveUserState; private fingerprintValidatedState: GlobalState; private lastProcessReloadState: GlobalState; biometricUnlockEnabled$: Observable; - encryptedClientKeyHalf$: Observable; + encryptedClientKeyHalf$: Observable; requirePasswordOnStart$: Observable; dismissedRequirePasswordOnStartCallout$: Observable; promptCancelled$: Observable; promptAutomatically$: Observable; fingerprintValidated$: Observable; - lastProcessReload$: Observable; + lastProcessReload$: Observable; constructor(private stateProvider: StateProvider) { this.biometricUnlockEnabledState = this.stateProvider.getActive(BIOMETRIC_UNLOCK_ENABLED); @@ -164,7 +168,7 @@ export class DefaultBiometricStateService implements BiometricStateService { this.promptCancelledState.state$, ]).pipe( map(([userId, record]) => { - return record?.[userId] ?? false; + return userId != null ? (record?.[userId] ?? false) : false; }), ); this.promptAutomaticallyState = this.stateProvider.getActive(PROMPT_AUTOMATICALLY); @@ -188,7 +192,7 @@ export class DefaultBiometricStateService implements BiometricStateService { } async setRequirePasswordOnStart(value: boolean): Promise { - let currentActiveId: UserId; + let currentActiveId: UserId | undefined = undefined; await this.requirePasswordOnStartState.update( (_, [userId]) => { currentActiveId = userId; @@ -198,7 +202,7 @@ export class DefaultBiometricStateService implements BiometricStateService { combineLatestWith: this.requirePasswordOnStartState.combinedState$, }, ); - if (!value) { + if (!value && currentActiveId) { await this.removeEncryptedClientKeyHalf(currentActiveId); } } @@ -222,7 +226,7 @@ export class DefaultBiometricStateService implements BiometricStateService { )); } - async getEncryptedClientKeyHalf(userId: UserId): Promise { + async getEncryptedClientKeyHalf(userId: UserId): Promise { return await firstValueFrom( this.stateProvider .getUser(userId, ENCRYPTED_CLIENT_KEY_HALF) @@ -244,7 +248,9 @@ export class DefaultBiometricStateService implements BiometricStateService { async resetUserPromptCancelled(userId: UserId): Promise { await this.stateProvider.getGlobal(PROMPT_CANCELLED).update( (data, activeUserId) => { - delete data[userId ?? activeUserId]; + if (data != null) { + delete data[userId ?? activeUserId]; + } return data; }, { @@ -257,8 +263,10 @@ export class DefaultBiometricStateService implements BiometricStateService { async setUserPromptCancelled(): Promise { await this.promptCancelledState.update( (record, userId) => { - record ??= {}; - record[userId] = true; + if (userId != null) { + record ??= {}; + record[userId] = true; + } return record; }, { @@ -291,13 +299,13 @@ export class DefaultBiometricStateService implements BiometricStateService { await this.lastProcessReloadState.update(() => new Date()); } - async getLastProcessReload(): Promise { + async getLastProcessReload(): Promise { return await firstValueFrom(this.lastProcessReload$); } } function encryptedClientKeyHalfToEncString( - encryptedKeyHalf: EncryptedString | undefined, -): EncString { + encryptedKeyHalf: EncryptedString | null | undefined, +): EncString | null { return encryptedKeyHalf == null ? null : new EncString(encryptedKeyHalf); } diff --git a/libs/key-management/src/biometrics/biometric.state.spec.ts b/libs/key-management/src/biometrics/biometric.state.spec.ts index 94ae5217f47..b961808cea7 100644 --- a/libs/key-management/src/biometrics/biometric.state.spec.ts +++ b/libs/key-management/src/biometrics/biometric.state.spec.ts @@ -1,4 +1,3 @@ -import { EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; import { KeyDefinition, UserKeyDefinition } from "@bitwarden/common/platform/state"; import { @@ -21,12 +20,7 @@ describe.each([ [FINGERPRINT_VALIDATED, true], ])( "deserializes state %s", - ( - ...args: - | [UserKeyDefinition, EncryptedString] - | [UserKeyDefinition, boolean] - | [KeyDefinition, boolean] - ) => { + (...args: [UserKeyDefinition | KeyDefinition, unknown]) => { function testDeserialization( keyDefinition: UserKeyDefinition | KeyDefinition, state: T, diff --git a/libs/key-management/src/biometrics/biometric.state.ts b/libs/key-management/src/biometrics/biometric.state.ts index e5ea4fbae3b..277d35c176e 100644 --- a/libs/key-management/src/biometrics/biometric.state.ts +++ b/libs/key-management/src/biometrics/biometric.state.ts @@ -1,16 +1,10 @@ -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { EncryptedString } from "../../../common/src/platform/models/domain/enc-string"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports +import { EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; import { KeyDefinition, BIOMETRIC_SETTINGS_DISK, UserKeyDefinition, -} from "../../../common/src/platform/state"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { UserId } from "../../../common/src/types/guid"; +} from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; /** * Indicates whether the user elected to store a biometric key to unlock their vault. diff --git a/libs/key-management/src/key.service.spec.ts b/libs/key-management/src/key.service.spec.ts index 62cdce230ea..97ef878a446 100644 --- a/libs/key-management/src/key.service.spec.ts +++ b/libs/key-management/src/key.service.spec.ts @@ -2,6 +2,7 @@ import { mock } from "jest-mock-extended"; import { bufferCount, firstValueFrom, lastValueFrom, of, take, tap } from "rxjs"; import { EncryptedOrganizationKeyData } from "@bitwarden/common/admin-console/models/data/encrypted-organization-key.data"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports @@ -23,9 +24,6 @@ import { FakeMasterPasswordService } from "../../common/src/auth/services/master import { CryptoFunctionService } from "../../common/src/platform/abstractions/crypto-function.service"; // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports -import { EncryptService } from "../../common/src/platform/abstractions/encrypt.service"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports import { KeyGenerationService } from "../../common/src/platform/abstractions/key-generation.service"; // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports diff --git a/libs/key-management/src/key.service.ts b/libs/key-management/src/key.service.ts index 98474b4babf..a6656c81f2d 100644 --- a/libs/key-management/src/key.service.ts +++ b/libs/key-management/src/key.service.ts @@ -12,6 +12,8 @@ import { switchMap, } from "rxjs"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; + // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports import { PinServiceAbstraction } from "../../auth/src/common/abstractions"; @@ -41,7 +43,6 @@ import { InternalMasterPasswordServiceAbstraction } from "../../common/src/auth/ import { CryptoFunctionService } from "../../common/src/platform/abstractions/crypto-function.service"; // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports -import { EncryptService } from "../../common/src/platform/abstractions/encrypt.service"; // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports import { KeyGenerationService } from "../../common/src/platform/abstractions/key-generation.service"; diff --git a/libs/key-management/src/user-asymmetric-key-regeneration/services/default-user-asymmetric-key-regeneration.service.spec.ts b/libs/key-management/src/user-asymmetric-key-regeneration/services/default-user-asymmetric-key-regeneration.service.spec.ts index 5312113d760..af5828c5aed 100644 --- a/libs/key-management/src/user-asymmetric-key-regeneration/services/default-user-asymmetric-key-regeneration.service.spec.ts +++ b/libs/key-management/src/user-asymmetric-key-regeneration/services/default-user-asymmetric-key-regeneration.service.spec.ts @@ -2,8 +2,8 @@ import { MockProxy, mock } from "jest-mock-extended"; import { of, throwError } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; import { EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/libs/shared/tsconfig.spec.json b/libs/shared/tsconfig.spec.json index c0f082793e9..9c98378659e 100644 --- a/libs/shared/tsconfig.spec.json +++ b/libs/shared/tsconfig.spec.json @@ -16,7 +16,7 @@ "@bitwarden/generator-legacy": ["../tools/generator/extensions/legacy/src"], "@bitwarden/generator-navigation": ["../tools/generator/extensions/navigation/src"], "@bitwarden/importer-core": ["../importer/src"], - "@bitwarden/importer/ui": ["../importer/src/components"], + "@bitwarden/importer-ui": ["../importer/src/components"], "@bitwarden/key-management": ["../key-management/src"], "@bitwarden/key-management-ui": ["../key-management-ui/src/index.ts"], "@bitwarden/node/*": ["../node/src/*"], diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts index 277d8c3006d..719b78bf9e1 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts @@ -1,8 +1,8 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { PinServiceAbstraction } from "@bitwarden/auth/common"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts index 069df8606bf..32f441235b9 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts @@ -3,9 +3,9 @@ import { BehaviorSubject, of } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherWithIdExport } from "@bitwarden/common/models/export/cipher-with-ids.export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { UserId } from "@bitwarden/common/types/guid"; diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts index f9df9c7057f..d45c39eebbd 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts @@ -5,9 +5,9 @@ import { firstValueFrom, map } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherWithIdExport, FolderWithIdExport } from "@bitwarden/common/models/export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts index 0a4ef86de94..86c19950b7c 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts @@ -13,9 +13,9 @@ import { import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherWithIdExport, CollectionWithIdExport } from "@bitwarden/common/models/export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.spec.ts b/libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.spec.ts index 7e04972f8ab..fb44296f632 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.spec.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.spec.ts @@ -3,9 +3,9 @@ import { BehaviorSubject, of } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { CipherWithIdExport } from "@bitwarden/common/models/export/cipher-with-ids.export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { UserId } from "@bitwarden/common/types/guid"; diff --git a/libs/tools/generator/components/src/credential-generator-history-dialog.component.html b/libs/tools/generator/components/src/credential-generator-history-dialog.component.html index ad629601c34..b07eb62ae98 100644 --- a/libs/tools/generator/components/src/credential-generator-history-dialog.component.html +++ b/libs/tools/generator/components/src/credential-generator-history-dialog.component.html @@ -14,11 +14,5 @@ > {{ "clearHistory" | i18n }} - - diff --git a/libs/tools/generator/components/src/credential-generator-history-dialog.component.ts b/libs/tools/generator/components/src/credential-generator-history-dialog.component.ts index 7bcffd92399..58da1157f7c 100644 --- a/libs/tools/generator/components/src/credential-generator-history-dialog.component.ts +++ b/libs/tools/generator/components/src/credential-generator-history-dialog.component.ts @@ -1,6 +1,5 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { DialogRef } from "@angular/cdk/dialog"; import { CommonModule } from "@angular/common"; import { Component } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; @@ -35,7 +34,6 @@ export class CredentialGeneratorHistoryDialogComponent { private accountService: AccountService, private history: GeneratorHistoryService, private dialogService: DialogService, - private dialogRef: DialogRef, ) { this.accountService.activeAccount$ .pipe( @@ -54,11 +52,6 @@ export class CredentialGeneratorHistoryDialogComponent { .subscribe(this.hasHistory$); } - /** closes the dialog */ - protected close() { - this.dialogRef.close(); - } - /** Launches clear history flow */ protected async clear() { const confirmed = await this.dialogService.openSimpleDialog({ diff --git a/libs/tools/generator/components/src/generator-services.module.ts b/libs/tools/generator/components/src/generator-services.module.ts index a4e751095d4..f60f4c5b095 100644 --- a/libs/tools/generator/components/src/generator-services.module.ts +++ b/libs/tools/generator/components/src/generator-services.module.ts @@ -6,7 +6,7 @@ import { SafeInjectionToken } from "@bitwarden/angular/services/injection-tokens import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { StateProvider } from "@bitwarden/common/platform/state"; import { KeyServiceLegacyEncryptorProvider } from "@bitwarden/common/tools/cryptography/key-service-legacy-encryptor-provider"; diff --git a/libs/tools/generator/core/src/strategies/forwarder-generator-strategy.spec.ts b/libs/tools/generator/core/src/strategies/forwarder-generator-strategy.spec.ts index f57a1e5f2b6..99834a25417 100644 --- a/libs/tools/generator/core/src/strategies/forwarder-generator-strategy.spec.ts +++ b/libs/tools/generator/core/src/strategies/forwarder-generator-strategy.spec.ts @@ -5,7 +5,7 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; // FIXME: use index.ts imports once policy abstractions and models // implement ADR-0002 import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { RestClient } from "@bitwarden/common/tools/integration/rpc"; import { BufferedState } from "@bitwarden/common/tools/state/buffered-state"; diff --git a/libs/tools/generator/core/src/strategies/forwarder-generator-strategy.ts b/libs/tools/generator/core/src/strategies/forwarder-generator-strategy.ts index c4282173817..1914b27697b 100644 --- a/libs/tools/generator/core/src/strategies/forwarder-generator-strategy.ts +++ b/libs/tools/generator/core/src/strategies/forwarder-generator-strategy.ts @@ -4,7 +4,7 @@ import { filter, map } from "rxjs"; import { Jsonify } from "type-fest"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { SingleUserState, StateProvider } from "@bitwarden/common/platform/state"; import { UserKeyEncryptor } from "@bitwarden/common/tools/cryptography/user-key-encryptor"; diff --git a/libs/tools/generator/extensions/history/src/legacy-password-history-decryptor.ts b/libs/tools/generator/extensions/history/src/legacy-password-history-decryptor.ts index 6a27ad476ae..06113ee9b99 100644 --- a/libs/tools/generator/extensions/history/src/legacy-password-history-decryptor.ts +++ b/libs/tools/generator/extensions/history/src/legacy-password-history-decryptor.ts @@ -1,4 +1,4 @@ -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; diff --git a/libs/tools/generator/extensions/history/src/local-generator-history.service.spec.ts b/libs/tools/generator/extensions/history/src/local-generator-history.service.spec.ts index 3936b03acc9..b3dee69bdbf 100644 --- a/libs/tools/generator/extensions/history/src/local-generator-history.service.spec.ts +++ b/libs/tools/generator/extensions/history/src/local-generator-history.service.spec.ts @@ -1,7 +1,7 @@ import { mock } from "jest-mock-extended"; import { firstValueFrom, of } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { CsprngArray } from "@bitwarden/common/types/csprng"; diff --git a/libs/tools/generator/extensions/history/src/local-generator-history.service.ts b/libs/tools/generator/extensions/history/src/local-generator-history.service.ts index 149a83db42f..cbfa55a184f 100644 --- a/libs/tools/generator/extensions/history/src/local-generator-history.service.ts +++ b/libs/tools/generator/extensions/history/src/local-generator-history.service.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { filter, map } from "rxjs"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { SingleUserState, StateProvider } from "@bitwarden/common/platform/state"; import { UserKeyEncryptor } from "@bitwarden/common/tools/cryptography/user-key-encryptor"; import { BufferedState } from "@bitwarden/common/tools/state/buffered-state"; diff --git a/libs/tools/generator/extensions/legacy/src/create-legacy-password-generation-service.ts b/libs/tools/generator/extensions/legacy/src/create-legacy-password-generation-service.ts index ae6b74564e3..0df37617b88 100644 --- a/libs/tools/generator/extensions/legacy/src/create-legacy-password-generation-service.ts +++ b/libs/tools/generator/extensions/legacy/src/create-legacy-password-generation-service.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { StateProvider } from "@bitwarden/common/platform/state"; import { engine, services, strategies } from "@bitwarden/generator-core"; import { LocalGeneratorHistoryService } from "@bitwarden/generator-history"; diff --git a/libs/tools/generator/extensions/legacy/src/create-legacy-username-generation-service.ts b/libs/tools/generator/extensions/legacy/src/create-legacy-username-generation-service.ts index c995fb1bce1..36b4a20aec7 100644 --- a/libs/tools/generator/extensions/legacy/src/create-legacy-username-generation-service.ts +++ b/libs/tools/generator/extensions/legacy/src/create-legacy-username-generation-service.ts @@ -3,7 +3,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { StateProvider } from "@bitwarden/common/platform/state"; import { RestClient } from "@bitwarden/common/tools/integration/rpc"; diff --git a/libs/vault/src/cipher-form/cipher-form.stories.ts b/libs/vault/src/cipher-form/cipher-form.stories.ts index ff6401d62a5..1af73b5a8b8 100644 --- a/libs/vault/src/cipher-form/cipher-form.stories.ts +++ b/libs/vault/src/cipher-form/cipher-form.stories.ts @@ -1,8 +1,14 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { signal } from "@angular/core"; +import { importProvidersFrom, signal } from "@angular/core"; import { action } from "@storybook/addon-actions"; -import { componentWrapperDecorator, Meta, moduleMetadata, StoryObj } from "@storybook/angular"; +import { + applicationConfig, + componentWrapperDecorator, + Meta, + moduleMetadata, + StoryObj, +} from "@storybook/angular"; import { BehaviorSubject } from "rxjs"; import { CollectionView } from "@bitwarden/admin-console/common"; @@ -16,7 +22,6 @@ import { DomainSettingsService } from "@bitwarden/common/autofill/services/domai import { ClientType } from "@bitwarden/common/enums"; import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; @@ -29,6 +34,10 @@ import { CipherFormGenerationService, PasswordRepromptService, } from "@bitwarden/vault"; +// FIXME: remove `/apps` import from `/libs` +// FIXME: remove `src` and fix import +// eslint-disable-next-line import/no-restricted-paths, no-restricted-imports +import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/src/app/core/tests"; import { CipherFormService } from "./abstractions/cipher-form.service"; import { TotpCaptureService } from "./abstractions/totp-capture.service"; @@ -207,12 +216,14 @@ export default { getFeatureFlag: () => Promise.resolve(false), }, }, - { provide: I18nService, useValue: { t: (...keys: string[]) => keys.join(" ") } }, ], }), componentWrapperDecorator( (story) => `

${story}
`, ), + applicationConfig({ + providers: [importProvidersFrom(PreloadedEnglishI18nModule)], + }), ], args: { config: defaultConfig, diff --git a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.ts b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.ts index 1b3b9009946..bdb96f4327d 100644 --- a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.ts +++ b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.ts @@ -127,8 +127,9 @@ export class CustomFieldsComponent implements OnInit, AfterViewInit { this.destroyed$ = inject(DestroyRef); this.cipherFormContainer.registerChildForm("customFields", this.customFieldsForm); - this.customFieldsForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((values) => { - this.updateCipher(values.fields); + this.customFieldsForm.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => { + // getRawValue ensures disabled fields are included + this.updateCipher(this.fields.getRawValue()); }); } @@ -151,7 +152,7 @@ export class CustomFieldsComponent implements OnInit, AfterViewInit { const prefillCipher = this.cipherFormContainer.getInitialCipherView(); // When available, populate the form with the existing fields - prefillCipher.fields?.forEach((field) => { + prefillCipher?.fields?.forEach((field) => { let value: string | boolean = field.value; if (field.type === FieldType.Boolean) { diff --git a/libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts b/libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts index ca778efac4b..85cd85bbf03 100644 --- a/libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts +++ b/libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts @@ -158,7 +158,7 @@ export class ItemDetailsSectionComponent implements OnInit { get allowOwnershipChange() { // Do not allow ownership change in edit mode and the cipher is owned by an organization - if (this.config.mode === "edit" && this.originalCipherView.organizationId != null) { + if (this.config.mode === "edit" && this.originalCipherView?.organizationId != null) { return false; } diff --git a/libs/vault/src/cipher-view/item-history/item-history-v2.component.html b/libs/vault/src/cipher-view/item-history/item-history-v2.component.html index a207b8fa1ca..19d1cfe1744 100644 --- a/libs/vault/src/cipher-view/item-history/item-history-v2.component.html +++ b/libs/vault/src/cipher-view/item-history/item-history-v2.component.html @@ -10,15 +10,15 @@

{{ "dateCreated" | i18n }}: {{ cipher.creationDate | date: "medium" }}

@@ -26,7 +26,7 @@ {{ cipher.passwordRevisionDisplayDate | date: "medium" }}