diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index c6d51ff3f87..deef20f6a1f 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "مدير كلمات المرور Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "اتبع الخطوات أدناه لإنهاء تسجيل الدخول." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "إعادة التسجيل" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "حفظ" }, - "loginSaveSuccessDetails": { - "message": "حفظت في بيتواردن $USERNAME$.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "جددت في بيتواردن $USERNAME$.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "حفظ كتسجيل دخول جديد", @@ -1082,12 +1114,12 @@ "message": "تحديث تسجيل الدخول", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "حفظ تسجيل الدخول؟", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "تحديث تسجيل الدخول الحالي؟", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index ee32999daca..346653b1417 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden loqosu" + }, "extName": { "message": "Bitwarden Parol Meneceri", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Giriş prosesini tamamlamaq üçün aşağıdakı addımları izləyin." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Qeydiyyatı yenidən başlat" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Saxla" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ Bitwarden-də saxlanıldı.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ Bitwarden-də güncəlləndi.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Yeni giriş kimi saxla", @@ -1082,12 +1114,12 @@ "message": "Giriş məlumatlarını güncəllə", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Giriş məlumatları saxlanılsın?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Mövcud giriş məlumatları güncəllənsin?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -3259,7 +3291,7 @@ "message": "API açar" }, "ssoKeyConnectorError": { - "message": "Açar bağlayıcı xətası: Açar Bağlayıcının mövcud olduğuna və düzgün işlədiyinə əmin olun." + "message": "Key connector xətası: \"Key connector\"un mövcud olduğuna və düzgün işlədiyinə əmin olun." }, "premiumSubcriptionRequired": { "message": "Premium abunəlik tələb olunur" @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Bitwarden mobil, brauzer və masaüstü tətbiqləri ilə limitsiz cihaz arasında limitsiz parol saxlayın." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 9310d8830f4..132e1a75fe1 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Менеджар пароляў Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Захаваць" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 6908ee7564e..d54b9d710eb 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Битуорден (Bitwarden)" }, + "appLogoLabel": { + "message": "Лого на Битуорден" + }, "extName": { "message": "Bitwarden — управител на пароли", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Следвайте стъпките по-долу, за да завършите вписването." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Следвайте стъпките по-долу, за да завършите вписването си чрез устройството за удостоверяване." + }, "restartRegistration": { "message": "Рестартиране на регистрацията" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Да, нека се запише сега" }, - "loginSaveSuccessDetails": { - "message": "Запазено в Битуорден: $USERNAME$.", + "notificationViewAria": { + "message": "Преглед на $ITEMNAME$, отваря се в нов прозорец", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "Обновено в Битуорден: $USERNAME$.", + "notificationEditTooltip": { + "message": "Редактиране преди запазване", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Ново известие" + }, + "labelWithNotification": { + "message": "$LABEL$: Ново известие", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "Запазено в Битуорден: $ITEMNAME$.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "Обновено в Битуорден: $ITEMNAME$.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Запазване като нов елемент за вписване", @@ -1082,12 +1114,12 @@ "message": "Обновяване на данните за вписване", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Запазване на данните за вписване?", + "saveLogin": { + "message": "Запазване на данните за вписване", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Да се обновят ли текущите данни за вписване?", + "updateLogin": { + "message": "Обновяване на текущите данни за вписване", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Съхранявайте неограничен брой пароли на множество устройства – с приложенията на Битуорден за мобилни телефони, браузър и компютър." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index f4bf9cb9e27..90965cff8d6 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "হ্যাঁ, এখনই সংরক্ষণ করুন" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 6b6f86cda37..cb845575ae8 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index fbd752305a6..4394488f189 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden - Gestor de contrasenyes", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Reinicia el registre" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Guarda" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index f413fe30298..2e0d015387a 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Logo Bitwarden" + }, "extName": { "message": "Bitwarden - Správce hesel", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Postupujte podle kroků níže pro dokončení přihlášení." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Postupujte podle následujících kroků pro dokončení přihlášení Vaším bezpečnostním klíčem." + }, "restartRegistration": { "message": "Restartovat registraci" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Uložit" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ uloženo do Bitwardenu.", + "notificationViewAria": { + "message": "Zobrazit $ITEMNAME$, otevře se v novém okně", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ aktualizováno v Bitwardenu.", + "notificationEditTooltip": { + "message": "Upravit před uložením", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Nové oznámení" + }, + "labelWithNotification": { + "message": "$LABEL$: Nové oznámení", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ - uloženo do Bitwardenu.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ - aktualizováno v Bitwardenu.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Uložit jako nové přihlašovací údaje", @@ -1082,12 +1114,12 @@ "message": "Aktualizovat přihlašovací údaje", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Uložit přihlašovací údaje?", + "saveLogin": { + "message": "Uložit přihlašovací údaje", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Aktualizovat existující přihlašovací údaje?", + "updateLogin": { + "message": "Aktualizovat existující přihlašovací údaje", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Uložte neomezená hesla na neomezených zařízeních s Bitwardenem na mobilu, prohlížeči a desktopové aplikaci." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 592e0e38e73..fdde829ed61 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Rheolydd cyfrineiriau Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Cadw" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Cadw fel manylion mewngofnodi newydd", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 43cae7d9c50..afce44f6bc2 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Adgangskodehåndtering", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Genstart registrering" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Gem" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index dad00bce98d..00caa26fbec 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden-Logo" + }, "extName": { "message": "Bitwarden Passwortmanager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Folge den Schritten unten, um die Anmeldung abzuschließen." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Folge den Schritten unten, um die Anmeldung mit deinem Sicherheitsschlüssel abzuschließen." + }, "restartRegistration": { "message": "Registrierung neu starten" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Ja, jetzt speichern" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ in Bitwarden gespeichert.", + "notificationViewAria": { + "message": "$ITEMNAME$ anzeigen, öffnet sich in neuem Fenster", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ in Bitwarden aktualisiert.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Neue Benachrichtigung" + }, + "labelWithNotification": { + "message": "$LABEL$: Neue Benachrichtigung", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ in Bitwarden gespeichert.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ in Bitwarden aktualisiert.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Als neue Zugangsdaten speichern", @@ -1082,12 +1114,12 @@ "message": "Zugangsdaten aktualisieren", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Zugangsdaten speichern?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Bestehende Zugangsdaten aktualisieren?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -4929,7 +4961,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "In Bitwarden speichern", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Speicher eine unbegrenzte Anzahl von Passwörtern auf unbegrenzt vielen Geräten mit Bitwarden-Apps für Smartphones, Browser und Desktop." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 7cdb3f14ec3..d9a1e088b2d 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Διαχειριστής Κωδικών Πρόσβασης Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Επανεκκίνηση εγγραφής" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Ναι, Αποθήκευση Τώρα" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index d1d05a4e852..4f83b07506b 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -1071,6 +1071,10 @@ }, "description": "Aria label for the view button in notification bar confirmation message" }, + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, "newNotification": { "message": "New notification" }, @@ -1110,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -1128,24 +1132,24 @@ }, "loginUpdateTaskSuccess": { "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", - "placeholders": { - "organization": { - "content": "$1" - } - }, - "description": "Shown to user after login is updated." + "placeholders": { + "organization": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", - "placeholders": { - "organization": { - "content": "$1" - }, - "task_count": { - "content": "$2" - } + "placeholders": { + "organization": { + "content": "$1" }, - "description": "Shown to user after login is updated." + "task_count": { + "content": "$2" + } + }, + "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { "message": "Change next password", @@ -2518,8 +2522,8 @@ "example": "Acme Corp" }, "count": { - "content": "$2", - "example": "2" + "content": "$2", + "example": "2" } } }, @@ -5224,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 0be594e67ba..f96f1016975 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 94ec0753410..48c63c615f3 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Yes, save now" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 3ddea49820d..900c03d8963 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden - Administrador de contraseñas", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -81,7 +84,7 @@ "message": "Pista de contraseña maestra (opcional)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Puntuación de fuerza de contraseña $SCORE$", "placeholders": { "score": { "content": "$1", @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Reiniciar registro" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Guardar" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -1095,7 +1127,7 @@ "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Login updated", + "message": "Inicio de sesión actualizado", "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { @@ -1124,7 +1156,7 @@ "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { - "message": "Error saving", + "message": "Error al guardar", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { @@ -2526,10 +2558,10 @@ "message": "Review at-risk logins" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Revisar contraseñas de riesgo" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Las contraseñas de su organización están en riesgo porque son débiles, reutilizadas y/o expuestas.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { @@ -5137,7 +5169,7 @@ "message": "Introduce la contraseña para la clave SSH." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Introduzca la contraseña" }, "invalidSshKey": { "message": "The SSH key is invalid" @@ -5167,7 +5199,7 @@ "message": "Para utilizar el desbloqueo biométrico, por favor actualice su aplicación de escritorio o desactive el desbloqueo de huella dactilar en los ajustes del escritorio." }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "Cambiar contraseña de riesgo" }, "introCarouselLabel": { "message": "Welcome to Bitwarden" @@ -5188,12 +5220,12 @@ "message": "Level up your logins" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Utilice el generador para crear y guardar contraseñas fuertes y únicas para todas sus cuentas." }, "secureDevices": { "message": "Your data, when and where you need it" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Guarda contraseñas ilimitadas a través de dispositivos ilimitados con aplicaciones móviles, de navegador y de escritorio de Bitwarden." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 46731c85cfa..ff7b222202b 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwardeni paroolihaldur", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Alusta registreerimist uuesti" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Jah, salvesta see" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 687e6a52473..c87f87dbc22 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Gorde" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 8e94676b17e..656a3e6b609 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "مدیریت رمز عبور Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "ذخیره" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 5e9a14d6aaf..e0da64cd0b8 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden-logo" + }, "extName": { "message": "Bitwarden Salasanahallinta", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Viimeistele kirjautuminen seuraamalla seuraavia vaiheita." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Aloita rekisteröityminen alusta" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Tallenna" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ tallennettiin Bitwardeniin.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ päivitettiin Bitwardeniin.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Tallenna uutena kirjautumistietona", @@ -1082,12 +1114,12 @@ "message": "Päivitä kirjautumistieto", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Tallennetaanko kirjautumistieto?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Päivitetäänkö olemassaoleva kirjautumistieto?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Tallenna rajattomasti salasanoja, rajattomalla määrällä laitteita, Bitwardenin mobiili-, selain- ja työpöytäsovelluksilla." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 14820d62f45..2f1a6b3a9c9 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "I-save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index a41c958c6c6..696b9a75d05 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Gestionnaire de mots de passe Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Suivez les étapes ci-dessous afin de réussir à vous connecter." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Redémarrer l'inscription" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Enregistrer" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ enregistré dans Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ mis à jour dans Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Enregistrer en tant que nouvel identifiant", @@ -1082,12 +1114,12 @@ "message": "Mettre à jour l'identifiant", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Enregistrer l'identifiant ?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Mettre à jour de l'identifiant existant ?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index dc855d6e230..329de4ae2be 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Xestor de Contrasinais Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Reiniciar rexistro" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Gardar" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 1c5ece85f96..607875ae38e 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "מנהל הסיסמאות Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "עקוב אחר השלבים למטה כדי לסיים להיכנס." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "התחל הרשמה מחדש" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "שמור" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ נשמר אל Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ עודכן ב־Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "שמור ככניסה חדשה", @@ -1082,12 +1114,12 @@ "message": "עדכן כניסה", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "לשמור כניסה?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "לעדכן כניסה קיימת?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 368f1e7a828..39a3956654a 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "बिटवार्डन पासवर्ड मैनेजर", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Yes, Save Now" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ को बिटवार्डन में सहेजा गया।", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ को बिटवार्डन में अपडेट किया गया।", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 72f14216020..30d314d2cbd 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden upravitelj lozinki", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Prati korake za dovršetak prijave." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Ponovno pokreni registraciju" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Spremi" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ spremljeno u Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ ažurirano u Bitwardenu.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Spremi novu prijavu", @@ -1082,12 +1114,12 @@ "message": "Ažuriraj prijavu", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Spremiti prijavu?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Ažurirati postojeću prijavu?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index d4b86eca2ae..1fcedb0f9db 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logó" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Kövessük az alábbi lépéseket a bejelentkezés befejezéséhez." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Kövessük az alábbi lépéseket a biztonsági kulccsal bejelentkezés befejezéséhez." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Mentés" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ mentésre került a Bitwardenben.", + "notificationViewAria": { + "message": "$ITEMNAME$ megtekintése, megnyitás új ablakban", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ frissítésre került a Bitwardenben.", + "notificationEditTooltip": { + "message": "Szerkesztés mentés előtt", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Új értesítés" + }, + "labelWithNotification": { + "message": "$LABEL$: Új értesítés", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ mentésre került a Bitwardenben.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ frissítésre került a Bitwardenben.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Mentés új bejelentkezésként", @@ -1082,12 +1114,12 @@ "message": "Bejelentkezés frissítése", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Bejelentkezés mentése?", + "saveLogin": { + "message": "Bejelentkezés mentése", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Létező bejelentkezés frissítése?", + "updateLogin": { + "message": "Létező bejelentkezés frissítése", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Mentsünk el a korlátlan jelszót korlátlan számú eszközön a Bitwarden mobil, böngésző és asztali alkalmazásokkal." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 3efc404a9a0..2e8a19ce28e 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Pengelola Sandi Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Ikuti langkah-langkah di bawah untuk menyelesaikan log masuk." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Mulai ulang pendaftaran" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Iya, Simpan Sekarang" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ disimpan ke Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ diperbarui di Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Simpan sebagai log masuk baru", @@ -1082,12 +1114,12 @@ "message": "Perbarui log masuk", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Simpan log masuk?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Perbarui log masuk yang ada?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index fa8ed288cfc..498ba22cd26 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Segui i passaggi qui sotto per completare l'accesso." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Ricomincia la registrazione" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Salva" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ salvato in Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ aggiornato in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Salva come nuovo accesso", @@ -1082,12 +1114,12 @@ "message": "Aggiorna accesso", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Salvare l'accesso?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Aggiornare l'accesso esistente?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 1f6aa5e0045..00cd29e8830 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden パスワードマネージャー", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "以下の手順に従ってログインを完了してください。" }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "登録を再度始める" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "保存する" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ を Bitwarden に保存しました。", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ を Bitwarden 内で更新しました。", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "新規のログイン情報として保存", @@ -1082,12 +1114,12 @@ "message": "ログイン情報を更新", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "ログイン情報を保存しますか?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "既存のログイン情報を更新しますか?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Bitwarden のモバイル、ブラウザ、デスクトップアプリでは、保存できるパスワード数やデバイス数に制限はありません。" } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 613b876c67b..4c798e2b119 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "შენახვა" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 61d21cc2987..4f83b07506b 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 229842d993b..d12738ed231 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "ಬಿಟ್ವಾರ್ಡೆನ್" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "ಹೌದು, ಈಗ ಉಳಿಸಿ" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 5e8f2dec4c5..2d30255100e 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden 비밀번호 관리자", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "등록 재시작" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "예, 지금 저장하겠습니다." }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 88dbac2b1ab..465f0fdad38 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "„Bitwarden“ slaptažodžių tvarkyklė", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Išsaugoti" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index e1de9bd01b5..2d73bacc5c9 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logotips" + }, "extName": { "message": "Bitwarden paroļu pārvaldnieks", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Jāseko zemāk esošajām norādēm, lai pabeigtu pieteikšanos." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Jāizpilda zemāk esošās darbības, lai pabeigtu pieteikšanos ar savu drošības atslēgu." + }, "restartRegistration": { "message": "Sākt reģistrēšanos no jauna" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Jā, saglabāt" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saglabāts Bitwarden.", + "notificationViewAria": { + "message": "Apskatīt $ITEMNAME$, tiks atvērts jaunā logā", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ atjaunināts Bitwarden.", + "notificationEditTooltip": { + "message": "Labot pirms saglabāšanas", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Jauns paziņojums" + }, + "labelWithNotification": { + "message": "$LABEL$: jauns paziņojums", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saglabāts Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ atjaunināts Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Saglabāt kā jaunu pieteikšanās vienumu", @@ -1082,12 +1114,12 @@ "message": "Atjaunināt pieteikšanās vienumu", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Saglabāt pieteikšanās vienumu?", + "saveLogin": { + "message": "Saglabāt pieteikšanās vienumu", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Atjaunināt esošo pieteikšanās vienumu?", + "updateLogin": { + "message": "Atjaunināt esošo pieteikšanās vienumu", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Neierobežotu paroļu skaitu var saglabāt neierobežotā ierīdžu daudzumā ar Bitwarden viedtālruņa, pārlūka un darbvirsmas lietotni." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 478086b5f7d..e5b2e89cee6 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "ശരി, ഇപ്പോൾ സംരക്ഷിക്കുക" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 5bfc85f9828..221015a7b42 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 61d21cc2987..4f83b07506b 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 06ff737edf7..81c7682680c 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden passordbehandler", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Start registreringen på nytt" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Ja, lagre nå" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 61d21cc2987..4f83b07506b 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index e39405a8f73..afe7821e096 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden-logo" + }, "extName": { "message": "Bitwarden - wachtwoordbeheerder", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Volg de onderstaande stappen om het inloggen af te ronden." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Volg onderstaande stappen om in te loggen met je beveiligingssleutel." + }, "restartRegistration": { "message": "Registratie herstarten" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Ja, nu opslaan" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ opgeslagen in Bitwarden.", + "notificationViewAria": { + "message": "$ITEMNAME$ bekijken, opent in nieuw venster", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ bijgewerkt in Bitwarden.", + "notificationEditTooltip": { + "message": "Bewerken voor opslaan", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Nieuwe melding" + }, + "labelWithNotification": { + "message": "$LABEL$: Nieuwe melding", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ opgeslagen in Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ bijgewerkt in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Opslaan als nieuwe login", @@ -1082,12 +1114,12 @@ "message": "Login bijwerken", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Login opslaan?", + "saveLogin": { + "message": "Login opslaan", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Bestaande login bijwerken?", + "updateLogin": { + "message": "Bestaande login bijwerken", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Onbeperkt wachtwoorden opslaan op alle apparaten met Bitwarden-apps voor mobiel, browser en desktop." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 61d21cc2987..4f83b07506b 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 61d21cc2987..4f83b07506b 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index e0b66fc43f8..1cc26eb5ef1 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Menedżer Haseł Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Wykonaj poniższe kroki, by dokończyć logowanie" }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Wykonaj poniższe kroki, aby zakończyć logowanie za pomocą klucza bezpieczeństwa." + }, "restartRegistration": { "message": "Zrestartuj rejestrację" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Zapisz" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ został zapisany w Bitwarden.", + "notificationViewAria": { + "message": "Wyświetl $ITEMNAME$, otworzy się w nowym oknie", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ został zaktualizowany w Bitwarden.", + "notificationEditTooltip": { + "message": "Edytuj przed zapisaniem", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Nowe powiadomienie" + }, + "labelWithNotification": { + "message": "$LABEL$: Nowe powiadomienie", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ został zapisany w Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ został zaktualizowany w Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Zapisz jako nowy login", @@ -1082,11 +1114,11 @@ "message": "Zaktualizuj dane logowania", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Zapisać dane logowania?", + "saveLogin": { + "message": "Zapisz dane logowania", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { + "updateLogin": { "message": "Zaktualizować istniejące dane logowania?", "description": "Prompt asking the user if they want to update an existing login entry." }, @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Zapisuj nieograniczoną liczbę haseł na nieograniczonej liczbie urządzeń dzięki aplikacjom Bitwarden na urządzenia mobilne, przeglądarki i komputery stacjonarne." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index a6d224587f1..cd516ec83a6 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Gerenciador de senhas Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Siga os passos abaixo para finalizar o login." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Reiniciar registro" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Salvar" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ salvo no Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ atualizado no Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Salvar como nova sessão", @@ -1082,12 +1114,12 @@ "message": "Atualizar sessão", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Salvar sessão?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Atualizar a sessão atual?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Guarde quantas senhas quiser e acesse de qualquer lugar com o Bitwarden. No seu celular, navegador e computador." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 4c95f0d6533..16746dac172 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Logótipo do Bitwarden" + }, "extName": { "message": "Bitwarden - Gestor de Palavras-passe", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Siga os passos abaixo para concluir o início de sessão." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Siga os passos abaixo para concluir o início de sessão com a sua chave de segurança." + }, "restartRegistration": { "message": "Reiniciar registo" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Guardar" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ guardado no Bitwarden.", + "notificationViewAria": { + "message": "Ver $ITEMNAME$, abrir numa nova janela", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ atualizado no Bitwarden.", + "notificationEditTooltip": { + "message": "Editar antes de guardar", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Nova notificação" + }, + "labelWithNotification": { + "message": "$LABEL$: Nova notificação", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ guardado no Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ atualizado no Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Guardar como nova credencial", @@ -1082,12 +1114,12 @@ "message": "Atualizar credencial", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Guardar credencial?", + "saveLogin": { + "message": "Guardar credencial", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Atualizar credencial existente?", + "updateLogin": { + "message": "Atualizar credencial existente", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Guarde palavras-passe ilimitadas em dispositivos ilimitados com as apps Bitwarden para telemóvel, navegador e computador." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 6f870a7e775..ba3cbcf9469 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden - Manager Gratuit de Parole", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Reporniți înregistrarea" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Salvare" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 00657d94978..cd146190373 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Логотип Bitwarden" + }, "extName": { "message": "Bitwarden - Менеджер паролей", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Следуйте указаниям ниже, чтобы завершить авторизацию." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Выполните следующие шаги, чтобы завершить авторизацию с помощью ключа безопасности." + }, "restartRegistration": { "message": "Перезапустить регистрацию" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Сохранить" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ сохранен в Bitwarden.", + "notificationViewAria": { + "message": "Просмотр $ITEMNAME$, откроется в новом окне", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ обновлен в Bitwarden.", + "notificationEditTooltip": { + "message": "Изменить перед сохранением", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Новое уведомление" + }, + "labelWithNotification": { + "message": "$LABEL$: Новое уведомление", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ сохранен в Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ обновлен в Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Сохранить как новый логин", @@ -1082,12 +1114,12 @@ "message": "Обновить логин", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Сохранить логин?", + "saveLogin": { + "message": "Сохранить логин", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Обновить существующий логин?", + "updateLogin": { + "message": "Обновить существующий логин", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Сохраняйте неограниченное количество паролей на неограниченном количестве устройств с помощью мобильных, браузерных и десктопных приложений Bitwarden." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 4a99c185afa..166b5490003 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "බිට්වාඩන්" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "සුරකින්න" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index d00478ee69c..70ff5bbfc27 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Logo Bitwarden" + }, "extName": { "message": "Bitwarden – Bezplatný správca hesiel", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Na dokončenie prihlásenia postupujte podľa pokynov." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Podľa nasledujúcich krokov dokončite prihlásenie pomocou bezpečnostného kľúča." + }, "restartRegistration": { "message": "Zopakovať registráciu" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Uložiť" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ uložené do Bitwarden.", + "notificationViewAria": { + "message": "Zobraziť $ITEMNAME$, otvorí sa v novom okne", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ aktualizované v Bitwarden.", + "notificationEditTooltip": { + "message": "Upraviť pred uložením", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Nové upozornenie" + }, + "labelWithNotification": { + "message": "$LABEL$: Nové upozornenie", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ uložené do Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ aktualizované v Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Uložiť ako nové prihlasovacie údaje", @@ -1082,12 +1114,12 @@ "message": "Aktualizovať prihlasovacie údaje", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Uložiť prihlasovacie údaje?", + "saveLogin": { + "message": "Uložiť prihlasovacie údaje", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Aktualizovať existujúce prihlasovacie údaje?", + "updateLogin": { + "message": "Aktualizovať existujúce prihlasovacie údaje", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -4649,7 +4681,7 @@ "message": "Textové polia používajte pre také údaje, ako sú bezpečnostné otázky" }, "hiddenHelpText": { - "message": "Skryté polia požívajte pre citlivé údaje ako je heslo" + "message": "Skryté polia požívajte pre citlivé údaje, ako je heslo" }, "checkBoxHelpText": { "message": "Ak chcete automaticky vyplniť začiarkávacie políčko formulára, napríklad zapamätať e-mail, použite začiarkávacie políčka" @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Ukladajte neobmedzený počet hesiel na neobmedzenom počte zariadení pomocou mobilných aplikácií, prehliadačov a desktopových aplikácií Bitwardenu." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 1703fba36c5..b0c815f2089 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Da, shrani zdaj" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 8c36a163039..bc1304270f8 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden лого" + }, "extName": { "message": "Bitwarden Менаџер Лозинке", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Следите наведене кораке да бисте завршили пријављивање." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Поново покрените регистрацију" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Сачувај" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ сачуван и Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ ажурирано у Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Сачувати као нову пријаву", @@ -1082,12 +1114,12 @@ "message": "Ажурирати пријаву", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Сачувати пријаву?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Ажурирајте постојећу пријаву?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -1099,7 +1131,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Одличан посао! Узели сте кораке да ви и $ORGANIZATION$ будете сигурнији.", "placeholders": { "organization": { "content": "$1" @@ -1108,7 +1140,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "Хвала вам што сте осигурали $ORGANIZATION$. Имате још $TASK_COUNT$ лозинки за ажурирање.", "placeholders": { "organization": { "content": "$1" @@ -1120,7 +1152,7 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Променити следећу лозинку", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { @@ -2323,7 +2355,7 @@ "message": "Политика приватности" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Ваша нова лозинка не може бити иста као тренутна лозинка." }, "hintEqualsPassword": { "message": "Ваш савет за лозинку не може да буде исти као лозинка." @@ -4929,7 +4961,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Сачувај у Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5170,30 +5202,30 @@ "message": "Променити ризичну лозинку" }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Добродошли у Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Сигурност, приоритет" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "Сачувај пријаве, картице и идентитете у свом безбедном сефу. Bitwarden користи шифровање од почетка-до-краја да заштити оно што вам је важно." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Брза и лака пријава" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Подесите биометријско откључавање и аутоматско попуњавање да бисте се пријавили на своје налоге без уноса ниједног слова." }, "secureUser": { - "message": "Level up your logins" + "message": "Подигните ниво својих пријава" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Користите генератор да креирате и сачувате јаке, јединствене лозинке за све ваше налоге." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Ваши подаци, када и где су вам потребни" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Сачувајте неограничене лозинке на неограниченим уређајима помоћу Bitwarden мобилних апликација, претраживача и десктоп апликација." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 0796b67cf0f..edd000c97cf 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Lösenordshanterare", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Spara" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 61d21cc2987..4f83b07506b 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Save" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index e8e61d6bcb7..f9245cc7186 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Restart registration" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Yes, Save Now" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 8038d415b64..57707940772 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logosu" + }, "extName": { "message": "Bitwarden Parola Yöneticisi", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Girişi tamamlamak için aşağıdaki adımları izleyin." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Güvenlik anahtarınızla girişi tamamlamak için aşağıdaki adımları izleyin." + }, "restartRegistration": { "message": "Kaydı yeniden başlat" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Kaydet" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ Bitwarden'a kaydedildi.", + "notificationViewAria": { + "message": "$ITEMNAME$ kaydını görüntüle. Yeni pencerede açılır", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ Bitwarden'da güncellendi.", + "notificationEditTooltip": { + "message": "Kaydetmeden önce düzenle", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Yeni bildirim" + }, + "labelWithNotification": { + "message": "$LABEL$: Yeni bildirim", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ Bitwarden'a kaydedildi.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ Bitwarden'da güncellendi.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Yeni hesap olarak kaydet", @@ -1082,12 +1114,12 @@ "message": "Hesabı güncelle", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Hesap kaydedilsin mi?", + "saveLogin": { + "message": "Hesabı kaydet", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Mevcut hesap güncellensin mi?", + "updateLogin": { + "message": "Mevcut hesabı güncelle", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Bitwarden mobil, tarayıcı ve masaüstü uygulamalarıyla istediğiniz kadar cihaza istediğiniz kadar parola kaydedebilirsiniz." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 9b8974cdf6b..aebdce5b8f0 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Логотип Bitwarden" + }, "extName": { "message": "Bitwarden – менеджер паролів", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Виконайте наведені нижче кроки, щоб завершити вхід." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Виконайте наведені нижче кроки, щоб завершити вхід за допомогою ключа безпеки." + }, "restartRegistration": { "message": "Перезапустити реєстрацію" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Зберегти" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ збережено до Bitwarden.", + "notificationViewAria": { + "message": "Переглянути $ITEMNAME$, відкривається у новому вікні", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ оновлено у Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "Нове сповіщення" + }, + "labelWithNotification": { + "message": "$LABEL$: нове сповіщення", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ збережено до Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ оновлено в Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Зберегти як новий запис", @@ -1082,12 +1114,12 @@ "message": "Оновити запис", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Зберегти запис?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Оновити наявний запис?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -3006,7 +3038,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Будуть експортовані лише записи особистого сховища, включно з вкладеннями, пов'язані з $EMAIL$. Записи сховища організації не експортуватимуться.", + "message": "Будуть експортовані лише записи особистого сховища включно з вкладеннями, пов'язані з $EMAIL$. Записи сховища організації не експортуватимуться.", "placeholders": { "email": { "content": "$1", @@ -4929,7 +4961,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Зберегти в Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Зберігайте скільки завгодно паролів на необмеженій кількості пристроїв, використовуючи Bitwarden для мобільних пристроїв, браузерів та комп'ютерів." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 3a226681fb1..c2f46945323 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Trình quản lý mật khẩu Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "Tiến hành đăng ký lại" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "Lưu" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 633f65c6c72..05d0e0693b9 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden 密码管理器", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "按照以下步骤完成登录。" }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "请按照下面的步骤,使用您的安全密钥完成登录。" + }, "restartRegistration": { "message": "重启注册" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "保存" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ 已保存到 Bitwarden。", + "notificationViewAria": { + "message": "在新窗口中查看 $ITEMNAME$", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ 已在 Bitwarden 中更新。", + "notificationEditTooltip": { + "message": "保存前编辑", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "新通知" + }, + "labelWithNotification": { + "message": "$LABEL$:新通知", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ 已保存到 Bitwarden。", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ 已在 Bitwarden 中更新。", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "保存为新的登录", @@ -1082,12 +1114,12 @@ "message": "更新登录", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "保存登录吗?", + "saveLogin": { + "message": "保存登录", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "更新现有的登录吗?", + "updateLogin": { + "message": "更新现有的登录", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -4424,7 +4456,7 @@ "message": "所有者:您" }, "linked": { - "message": "链接型" + "message": "已链接" }, "copySuccessful": { "message": "复制成功" @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "使用 Bitwarden 移动端、浏览器和桌面 App 在无限制的设备上保存无限数量的密码。" } -} +} \ No newline at end of file diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 91797d314b2..dde0607ee18 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -2,6 +2,9 @@ "appName": { "message": "Bitwarden" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "extName": { "message": "Bitwarden - 免費密碼管理工具", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" @@ -883,6 +886,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "restartRegistration": { "message": "重新啟動註冊" }, @@ -1056,23 +1062,49 @@ "notificationAddSave": { "message": "儲存" }, - "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "notificationViewAria": { + "message": "View $ITEMNAME$, opens in new window", "placeholders": { - "username": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is saved." + "description": "Aria label for the view button in notification bar confirmation message" }, - "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "notificationEditTooltip": { + "message": "Edit before saving", + "description": "Tooltip and Aria label for edit button on cipher item" + }, + "newNotification": { + "message": "New notification" + }, + "labelWithNotification": { + "message": "$LABEL$: New notification", + "description": "Label for the notification with a new login suggestion.", "placeholders": { - "username": { + "label": { + "content": "$1", + "example": "Login" + } + } + }, + "loginSaveConfirmation": { + "message": "$ITEMNAME$ saved to Bitwarden.", + "placeholders": { + "itemName": { "content": "$1" } }, - "description": "Shown to user after login is updated." + "description": "Shown to user after item is saved." + }, + "loginUpdatedConfirmation": { + "message": "$ITEMNAME$ updated in Bitwarden.", + "placeholders": { + "itemName": { + "content": "$1" + } + }, + "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { "message": "Save as new login", @@ -1082,12 +1114,12 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, - "saveLoginPrompt": { - "message": "Save login?", + "saveLogin": { + "message": "Save login", "description": "Prompt asking the user if they want to save their login details." }, - "updateLoginPrompt": { - "message": "Update existing login?", + "updateLogin": { + "message": "Update existing login", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -5196,4 +5228,4 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." } -} +} \ No newline at end of file diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts index 223375fd903..01a0129d0e5 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts @@ -1,5 +1,6 @@ import { MockProxy, mock } from "jest-mock-extended"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { DialogService } from "@bitwarden/components"; // Must mock modules before importing @@ -26,22 +27,26 @@ describe("ExtensionTwoFactorAuthEmailComponentService", () => { let dialogService: MockProxy; let window: MockProxy; + let configService: MockProxy; beforeEach(() => { jest.clearAllMocks(); dialogService = mock(); window = mock(); + configService = mock(); extensionTwoFactorAuthEmailComponentService = new ExtensionTwoFactorAuthEmailComponentService( dialogService, window, + configService, ); }); describe("openPopoutIfApprovedForEmail2fa", () => { it("should open a popout if the user confirms the warning to popout the extension when in the popup", async () => { // Arrange + configService.getFeatureFlag.mockResolvedValue(false); dialogService.openSimpleDialog.mockResolvedValue(true); jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(true); @@ -61,6 +66,7 @@ describe("ExtensionTwoFactorAuthEmailComponentService", () => { it("should not open a popout if the user cancels the warning to popout the extension when in the popup", async () => { // Arrange + configService.getFeatureFlag.mockResolvedValue(false); dialogService.openSimpleDialog.mockResolvedValue(false); jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(true); @@ -80,6 +86,7 @@ describe("ExtensionTwoFactorAuthEmailComponentService", () => { it("should not open a popout if not in the popup", async () => { // Arrange + configService.getFeatureFlag.mockResolvedValue(false); jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(false); // Act @@ -89,5 +96,15 @@ describe("ExtensionTwoFactorAuthEmailComponentService", () => { expect(dialogService.openSimpleDialog).not.toHaveBeenCalled(); expect(openTwoFactorAuthEmailPopout).not.toHaveBeenCalled(); }); + + it("does not prompt or open a popout if the feature flag is enabled", async () => { + configService.getFeatureFlag.mockResolvedValue(true); + jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(true); + + await extensionTwoFactorAuthEmailComponentService.openPopoutIfApprovedForEmail2fa(); + + expect(dialogService.openSimpleDialog).not.toHaveBeenCalled(); + expect(openTwoFactorAuthEmailPopout).not.toHaveBeenCalled(); + }); }); }); diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts index 5d8d269412e..293d88c4e64 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts @@ -2,6 +2,8 @@ import { DefaultTwoFactorAuthEmailComponentService, TwoFactorAuthEmailComponentService, } from "@bitwarden/auth/angular"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { DialogService } from "@bitwarden/components"; import { openTwoFactorAuthEmailPopout } from "../../auth/popup/utils/auth-popout-window"; @@ -15,11 +17,21 @@ export class ExtensionTwoFactorAuthEmailComponentService constructor( private dialogService: DialogService, private window: Window, + private configService: ConfigService, ) { super(); } async openPopoutIfApprovedForEmail2fa(): Promise { + const isTwoFactorFormPersistenceEnabled = await this.configService.getFeatureFlag( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + + if (isTwoFactorFormPersistenceEnabled) { + // If the feature flag is enabled, we don't need to prompt the user to open the popout + return; + } + if (BrowserPopupUtils.inPopup(this.window)) { const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "warning" }, diff --git a/apps/browser/src/autofill/background/abstractions/notification.background.ts b/apps/browser/src/autofill/background/abstractions/notification.background.ts index c93fd9a3acf..db110319d20 100644 --- a/apps/browser/src/autofill/background/abstractions/notification.background.ts +++ b/apps/browser/src/autofill/background/abstractions/notification.background.ts @@ -2,6 +2,7 @@ import { NeverDomains } from "@bitwarden/common/models/domain/domain-service"; import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; +import { CollectionView } from "../../content/components/common-types"; import { NotificationQueueMessageTypes } from "../../enums/notification-queue-message-type.enum"; import AutofillPageDetails from "../../models/autofill-page-details"; @@ -83,6 +84,7 @@ type NotificationBackgroundExtensionMessage = { tab?: chrome.tabs.Tab; sender?: string; notificationType?: string; + organizationId?: string; fadeOutNotification?: boolean; }; @@ -94,6 +96,10 @@ type NotificationBackgroundExtensionMessageHandlers = { [key: string]: CallableFunction; unlockCompleted: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgGetFolderData: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; + bgGetCollectionData: ({ + message, + sender, + }: BackgroundOnMessageHandlerParams) => Promise; bgCloseNotificationBar: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgOpenAtRisksPasswords: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgAdjustNotificationBar: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; @@ -101,11 +107,14 @@ type NotificationBackgroundExtensionMessageHandlers = { bgChangedPassword: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgRemoveTabFromNotificationQueue: ({ sender }: BackgroundSenderParam) => void; bgSaveCipher: ({ message, sender }: BackgroundOnMessageHandlerParams) => void; + bgOpenAddEditVaultItemPopout: ({ + message, + sender, + }: BackgroundOnMessageHandlerParams) => Promise; bgOpenViewVaultItemPopout: ({ message, sender, }: BackgroundOnMessageHandlerParams) => Promise; - bgOpenVault: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgNeverSave: ({ sender }: BackgroundSenderParam) => Promise; bgUnlockPopoutOpened: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgReopenUnlockPopout: ({ sender }: BackgroundSenderParam) => Promise; diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index bb993fcf94b..63ae1193737 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -1,6 +1,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject, firstValueFrom, of } from "rxjs"; +import { CollectionService } from "@bitwarden/admin-console/common"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { DefaultPolicyService } from "@bitwarden/common/admin-console/services/policy/default-policy.service"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -53,6 +54,7 @@ describe("NotificationBackground", () => { let notificationBackground: NotificationBackground; const autofillService = mock(); const cipherService = mock(); + const collectionService = mock(); let activeAccountStatusMock$: BehaviorSubject; let authService: MockProxy; const policyService = mock(); @@ -83,6 +85,7 @@ describe("NotificationBackground", () => { authService, autofillService, cipherService, + collectionService, configService, domainSettingsService, environmentService, diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index dabb75b97b6..4e2a99d4a7a 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -2,6 +2,7 @@ // @ts-strict-ignore import { firstValueFrom, switchMap, map, of } from "rxjs"; +import { CollectionService } from "@bitwarden/admin-console/common"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -50,6 +51,7 @@ import { OrganizationCategories, NotificationCipherData, } from "../content/components/cipher/types"; +import { CollectionView } from "../content/components/common-types"; import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum"; import { AutofillService } from "../services/abstractions/autofill.service"; @@ -92,9 +94,11 @@ export default class NotificationBackground { bgGetEnableAddedLoginPrompt: () => this.getEnableAddedLoginPrompt(), bgGetExcludedDomains: () => this.getExcludedDomains(), bgGetFolderData: () => this.getFolderData(), + bgGetCollectionData: ({ message }) => this.getCollectionData(message), bgGetOrgData: () => this.getOrgData(), bgNeverSave: ({ sender }) => this.saveNever(sender.tab), - bgOpenVault: ({ message, sender }) => this.openVault(message, sender.tab), + bgOpenAddEditVaultItemPopout: ({ message, sender }) => + this.openAddEditVaultItem(message, sender.tab), bgOpenViewVaultItemPopout: ({ message, sender }) => this.viewItem(message, sender.tab), bgRemoveTabFromNotificationQueue: ({ sender }) => this.removeTabFromNotificationQueue(sender.tab), @@ -114,6 +118,7 @@ export default class NotificationBackground { private authService: AuthService, private autofillService: AutofillService, private cipherService: CipherService, + private collectionService: CollectionService, private configService: ConfigService, private domainSettingsService: DomainSettingsService, private environmentService: EnvironmentService, @@ -160,43 +165,87 @@ export default class NotificationBackground { /** * - * Gets the current active tab and retrieves all decrypted ciphers - * for the tab's URL. It constructs and returns an array of `NotificationCipherData` objects. + * Gets the current active tab and retrieves the relevant decrypted cipher + * for the tab's URL. It constructs and returns an array of `NotificationCipherData` objects or a singular object. * If no active tab or URL is found, it returns an empty array. + * If new login, returns a preview of the cipher. * * @returns {Promise} */ async getNotificationCipherData(): Promise { - const [currentTab, showFavicons, env] = await Promise.all([ + const [currentTab, showFavicons, env, activeUserId] = await Promise.all([ BrowserApi.getTabFromCurrentWindow(), firstValueFrom(this.domainSettingsService.showFavicons$), firstValueFrom(this.environmentService.environment$), + firstValueFrom(this.accountService.activeAccount$.pipe(getOptionalUserId)), + ]); + + if (!currentTab?.url || !activeUserId) { + return []; + } + + const [decryptedCiphers, organizations] = await Promise.all([ + this.cipherService.getAllDecryptedForUrl(currentTab.url, activeUserId), + firstValueFrom(this.organizationService.organizations$(activeUserId)), ]); const iconsServerUrl = env.getIconsUrl(); - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(getOptionalUserId), + + const getOrganizationType = (orgId?: string) => + organizations.find((org) => org.id === orgId)?.productTierType; + + const cipherQueueMessage = this.notificationQueue.find( + (message): message is AddChangePasswordQueueMessage | AddLoginQueueMessage => + message.type === NotificationQueueMessageType.ChangePassword || + message.type === NotificationQueueMessageType.AddLogin, ); - const decryptedCiphers = await this.cipherService.getAllDecryptedForUrl( - currentTab?.url, - activeUserId, + if (cipherQueueMessage) { + const cipherView = + cipherQueueMessage.type === NotificationQueueMessageType.ChangePassword + ? await this.getDecryptedCipherById(cipherQueueMessage.cipherId, activeUserId) + : this.convertAddLoginQueueMessageToCipherView(cipherQueueMessage); + + const organizationType = getOrganizationType(cipherView.organizationId); + return [ + this.convertToNotificationCipherData( + cipherView, + iconsServerUrl, + showFavicons, + organizationType, + ), + ]; + } + + return decryptedCiphers.map((view) => + this.convertToNotificationCipherData( + view, + iconsServerUrl, + showFavicons, + getOrganizationType(view.organizationId), + ), ); + } - const organizations = await firstValueFrom( - this.organizationService.organizations$(activeUserId), - ); + /** + * Converts a CipherView and organization type into a NotificationCipherData object + * for use in the notification bar. + * + * @returns A NotificationCipherData object containing the relevant cipher information. + */ - return decryptedCiphers.map((view) => { - const { id, name, reprompt, favorite, login, organizationId } = view; + convertToNotificationCipherData( + view: CipherView, + iconsServerUrl: string, + showFavicons: boolean, + organizationType?: ProductTierType, + ): NotificationCipherData { + const { id, name, reprompt, favorite, login } = view; - const organizationType = organizationId - ? organizations.find((org) => org.id === organizationId)?.productTierType - : null; - - const organizationCategories: OrganizationCategory[] = []; + const organizationCategories: OrganizationCategory[] = []; + if (organizationType != null) { if ( [ProductTierType.Teams, ProductTierType.Enterprise, ProductTierType.TeamsStarter].includes( organizationType, @@ -204,23 +253,22 @@ export default class NotificationBackground { ) { organizationCategories.push(OrganizationCategories.business); } + if ([ProductTierType.Families, ProductTierType.Free].includes(organizationType)) { organizationCategories.push(OrganizationCategories.family); } + } - return { - id, - name, - type: CipherType.Login, - reprompt, - favorite, - ...(organizationCategories.length ? { organizationCategories } : {}), - icon: buildCipherIcon(iconsServerUrl, view, showFavicons), - login: login && { - username: login.username, - }, - }; - }); + return { + id, + name, + type: CipherType.Login, + reprompt, + favorite, + ...(organizationCategories.length ? { organizationCategories } : {}), + icon: buildCipherIcon(iconsServerUrl, view, showFavicons), + login: login && { username: login.username }, + }; } /** @@ -746,17 +794,36 @@ export default class NotificationBackground { userId, ); - await this.openAddEditVaultItemPopout(senderTab, { cipherId: cipherView.id }); + await this.openAddEditVaultItemPopout(senderTab, { cipherId: cipherView?.id }); } - private async openVault( + private async openAddEditVaultItem( message: NotificationBackgroundExtensionMessage, senderTab: chrome.tabs.Tab, ) { - if (!message.cipherId) { - await this.openAddEditVaultItemPopout(senderTab); + const { cipherId, organizationId } = message; + const userId = await firstValueFrom(this.accountService.activeAccount$.pipe(getOptionalUserId)); + if (cipherId) { + await this.openAddEditVaultItemPopout(senderTab, { cipherId }); + return; } - await this.openAddEditVaultItemPopout(senderTab, { cipherId: message.cipherId }); + + const queueItem = this.notificationQueue.find((item) => item.tab.id === senderTab.id); + + if (queueItem?.type === NotificationQueueMessageType.AddLogin) { + const cipherView = this.convertAddLoginQueueMessageToCipherView(queueItem); + cipherView.organizationId = organizationId; + + if (userId) { + await this.cipherService.setAddEditCipherInfo({ cipher: cipherView }, userId); + } + + await this.openAddEditVaultItemPopout(senderTab); + this.removeTabFromNotificationQueue(senderTab); + return; + } + + await this.openAddEditVaultItemPopout(senderTab); } private async viewItem( @@ -855,6 +922,25 @@ export default class NotificationBackground { return await firstValueFrom(this.folderService.folderViews$(activeUserId)); } + private async getCollectionData( + message: NotificationBackgroundExtensionMessage, + ): Promise { + const collections = (await this.collectionService.getAllDecrypted()).reduce( + (acc, collection) => { + if (collection.organizationId === message?.orgId) { + acc.push({ + id: collection.id, + name: collection.name, + organizationId: collection.organizationId, + }); + } + return acc; + }, + [], + ); + return collections; + } + private async getWebVaultUrl(): Promise { const env = await firstValueFrom(this.environmentService.environment$); return env.getWebVaultUrl(); @@ -881,6 +967,7 @@ export default class NotificationBackground { const organizations = await firstValueFrom( this.organizationService.organizations$(activeUserId), ); + return organizations.map((org) => { const { id, name, productTierType } = org; return { @@ -1011,6 +1098,7 @@ export default class NotificationBackground { cipherView.folderId = folderId; cipherView.type = CipherType.Login; cipherView.login = loginView; + cipherView.organizationId = null; return cipherView; } diff --git a/apps/browser/src/autofill/content/components/buttons/edit-button.ts b/apps/browser/src/autofill/content/components/buttons/edit-button.ts index 67221f5be18..a0037146db2 100644 --- a/apps/browser/src/autofill/content/components/buttons/edit-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/edit-button.ts @@ -21,6 +21,7 @@ export function EditButton({ diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index dad4e887a12..00b8ae81cf9 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -557,7 +557,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: TwoFactorAuthEmailComponentService, useClass: ExtensionTwoFactorAuthEmailComponentService, - deps: [DialogService, WINDOW], + deps: [DialogService, WINDOW, ConfigService], }), safeProvider({ provide: TwoFactorAuthWebAuthnComponentService, diff --git a/apps/browser/src/safari/desktop/Info.plist b/apps/browser/src/safari/desktop/Info.plist index 69ea518a0ae..b687d9d2f3a 100644 --- a/apps/browser/src/safari/desktop/Info.plist +++ b/apps/browser/src/safari/desktop/Info.plist @@ -25,7 +25,7 @@ LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright - Copyright © 2015-2024 Bitwarden Inc. All rights reserved. + Copyright © 2015-2025 Bitwarden Inc. All rights reserved. NSMainStoryboardFile Main NSPrincipalClass diff --git a/apps/browser/src/safari/safari/Info.plist b/apps/browser/src/safari/safari/Info.plist index b79ed132ea9..95172846758 100644 --- a/apps/browser/src/safari/safari/Info.plist +++ b/apps/browser/src/safari/safari/Info.plist @@ -30,7 +30,7 @@ $(PRODUCT_MODULE_NAME).SafariWebExtensionHandler NSHumanReadableCopyright - Copyright © 2015-2024 Bitwarden Inc. All rights reserved. + Copyright © 2015-2025 Bitwarden Inc. All rights reserved. NSHumanReadableDescription A secure and free password manager for all of your devices. SFSafariAppExtensionBundleIdentifiersToReplace diff --git a/apps/cli/package.json b/apps/cli/package.json index 1bf6a1d41a1..daec6593543 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -74,7 +74,7 @@ "form-data": "4.0.1", "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", - "jsdom": "26.0.0", + "jsdom": "26.1.0", "jszip": "3.10.1", "koa": "2.16.1", "koa-bodyparser": "4.4.1", diff --git a/apps/cli/src/admin-console/commands/confirm.command.ts b/apps/cli/src/admin-console/commands/confirm.command.ts index 0d5c7ba069c..1c900511499 100644 --- a/apps/cli/src/admin-console/commands/confirm.command.ts +++ b/apps/cli/src/admin-console/commands/confirm.command.ts @@ -57,7 +57,7 @@ export class ConfirmCommand { } const publicKeyResponse = await this.apiService.getUserPublicKey(orgUser.userId); const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey); - const key = await this.encryptService.rsaEncrypt(orgKey.key, publicKey); + const key = await this.encryptService.encapsulateKeyUnsigned(orgKey, publicKey); const req = new OrganizationUserConfirmRequest(); req.key = key.encryptedString; await this.organizationUserApiService.postOrganizationUserConfirm( diff --git a/apps/cli/stores/chocolatey/bitwarden-cli.nuspec b/apps/cli/stores/chocolatey/bitwarden-cli.nuspec index e5ce03fa49d..f7f86bc843f 100644 --- a/apps/cli/stores/chocolatey/bitwarden-cli.nuspec +++ b/apps/cli/stores/chocolatey/bitwarden-cli.nuspec @@ -10,7 +10,7 @@ Bitwarden Inc. https://bitwarden.com/ https://raw.githubusercontent.com/bitwarden/brand/master/icons/256x256.png - Copyright © 2015-2024 Bitwarden Inc. + Copyright © 2015-2025 Bitwarden Inc. https://github.com/bitwarden/clients/ https://help.bitwarden.com/article/cli/ https://github.com/bitwarden/clients/issues diff --git a/apps/desktop/desktop_native/build.js b/apps/desktop/desktop_native/build.js index ec20dce4116..da61da15f9d 100644 --- a/apps/desktop/desktop_native/build.js +++ b/apps/desktop/desktop_native/build.js @@ -3,6 +3,21 @@ const child_process = require("child_process"); const fs = require("fs"); const path = require("path"); const process = require("process"); + +// Map of the Node arch equivalents for the rust target triplets, used to move the file to the correct location +const rustTargetsMap = { + "i686-pc-windows-msvc": { nodeArch: 'ia32', platform: 'win32' }, + "x86_64-pc-windows-msvc": { nodeArch: 'x64', platform: 'win32' }, + "aarch64-pc-windows-msvc": { nodeArch: 'arm64', platform: 'win32' }, + "x86_64-apple-darwin": { nodeArch: 'x64', platform: 'darwin' }, + "aarch64-apple-darwin": { nodeArch: 'arm64', platform: 'darwin' }, + 'x86_64-unknown-linux-musl': { nodeArch: 'x64', platform: 'linux' }, + 'aarch64-unknown-linux-musl': { nodeArch: 'arm64', platform: 'linux' }, +} + +// Ensure the dist directory exists +fs.mkdirSync(path.join(__dirname, "dist"), { recursive: true }); + const args = process.argv.slice(2); // Get arguments passed to the script const mode = args.includes("--release") ? "release" : "debug"; const targetArg = args.find(arg => arg.startsWith("--target=")); @@ -13,13 +28,21 @@ let crossPlatform = process.argv.length > 2 && process.argv[2] === "cross-platfo function buildNapiModule(target, release = true) { const targetArg = target ? `--target ${target}` : ""; const releaseArg = release ? "--release" : ""; - return child_process.execSync(`npm run build -- ${releaseArg} ${targetArg}`, { stdio: 'inherit', cwd: path.join(__dirname, "napi") }); + child_process.execSync(`npm run build -- ${releaseArg} ${targetArg}`, { stdio: 'inherit', cwd: path.join(__dirname, "napi") }); } function buildProxyBin(target, release = true) { const targetArg = target ? `--target ${target}` : ""; const releaseArg = release ? "--release" : ""; - return child_process.execSync(`cargo build --bin desktop_proxy ${releaseArg} ${targetArg}`, {stdio: 'inherit', cwd: path.join(__dirname, "proxy")}); + child_process.execSync(`cargo build --bin desktop_proxy ${releaseArg} ${targetArg}`, {stdio: 'inherit', cwd: path.join(__dirname, "proxy")}); + + if (target) { + // Copy the resulting binary to the dist folder + const targetFolder = release ? "release" : "debug"; + const ext = process.platform === "win32" ? ".exe" : ""; + const nodeArch = rustTargetsMap[target].nodeArch; + fs.copyFileSync(path.join(__dirname, "target", target, targetFolder, `desktop_proxy${ext}`), path.join(__dirname, "dist", `desktop_proxy.${process.platform}-${nodeArch}${ext}`)); + } } if (!crossPlatform && !target) { @@ -36,45 +59,17 @@ if (target) { return; } -// Note that targets contains pairs of [rust target, node arch] -// We do this to move the output binaries to a location that can -// be easily accessed from electron-builder using ${os} and ${arch} -let targets = []; -switch (process.platform) { - case "win32": - targets = [ - ["i686-pc-windows-msvc", 'ia32'], - ["x86_64-pc-windows-msvc", 'x64'], - ["aarch64-pc-windows-msvc", 'arm64'] - ]; - break; +// Filter the targets based on the current platform, and build for each of them +let platformTargets = Object.entries(rustTargetsMap).filter(([_, { platform: p }]) => p === process.platform); +console.log("Cross building native modules for the targets: ", platformTargets.map(([target, _]) => target).join(", ")); - case "darwin": - targets = [ - ["x86_64-apple-darwin", 'x64'], - ["aarch64-apple-darwin", 'arm64'] - ]; - break; - - default: - targets = [ - ['x86_64-unknown-linux-musl', 'x64'], - ['aarch64-unknown-linux-musl', 'arm64'] - ]; - - process.env["PKG_CONFIG_ALLOW_CROSS"] = "1"; - process.env["PKG_CONFIG_ALL_STATIC"] = "1"; - break; +// When building for Linux, we need to set some environment variables to allow cross-compilation +if (process.platform === "linux") { + process.env["PKG_CONFIG_ALLOW_CROSS"] = "1"; + process.env["PKG_CONFIG_ALL_STATIC"] = "1"; } -console.log("Cross building native modules for the targets: ", targets.map(([target, _]) => target).join(", ")); - -fs.mkdirSync(path.join(__dirname, "dist"), { recursive: true }); - -targets.forEach(([target, nodeArch]) => { +platformTargets.forEach(([target, _]) => { buildNapiModule(target); buildProxyBin(target); - - const ext = process.platform === "win32" ? ".exe" : ""; - fs.copyFileSync(path.join(__dirname, "target", target, "release", `desktop_proxy${ext}`), path.join(__dirname, "dist", `desktop_proxy.${process.platform}-${nodeArch}${ext}`)); }); diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index 925706bec7b..d51d9412d80 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -5,7 +5,7 @@ "productName": "Bitwarden", "appId": "com.bitwarden.desktop", "buildDependenciesFromSource": true, - "copyright": "Copyright © 2015-2024 Bitwarden Inc.", + "copyright": "Copyright © 2015-2025 Bitwarden Inc.", "directories": { "buildResources": "resources", "output": "dist", diff --git a/apps/desktop/stores/chocolatey/bitwarden.nuspec b/apps/desktop/stores/chocolatey/bitwarden.nuspec index dc95703614d..450fa734736 100644 --- a/apps/desktop/stores/chocolatey/bitwarden.nuspec +++ b/apps/desktop/stores/chocolatey/bitwarden.nuspec @@ -10,7 +10,7 @@ Bitwarden Inc. https://bitwarden.com/ https://raw.githubusercontent.com/bitwarden/brand/master/icons/256x256.png - Copyright © 2015-2024 Bitwarden Inc. + Copyright © 2015-2025 Bitwarden Inc. https://github.com/bitwarden/clients/ https://bitwarden.com/help/ https://github.com/bitwarden/clients/issues diff --git a/apps/web/src/app/billing/shared/payment-method.component.html b/apps/web/src/app/billing/shared/payment-method.component.html index cb1450cd338..16e1939907d 100644 --- a/apps/web/src/app/billing/shared/payment-method.component.html +++ b/apps/web/src/app/billing/shared/payment-method.component.html @@ -97,13 +97,7 @@ {{ paymentSource.description }}

-

diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index da0d698cfc3..be9e7e745a5 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 2aa429dba3f..7db546eb3b1 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "كل التطبيقات" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 0064c069ae4..47816e96b6c 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Bütün tətbiqlər" }, + "appLogoLabel": { + "message": "Bitwarden loqosu" + }, "criticalApplications": { "message": "Kritik tətbiqlər" }, @@ -3315,13 +3318,13 @@ "message": "Bir üzv ləğv edildikdə, artıq həmin üzv təşkilat datasına müraciət edə bilmir. Üzv müraciətini daha tez bərpa etmək üçün, Ləğv edilənlər vərəqinə gedin." }, "removeUserConfirmationKeyConnector": { - "message": "Xəbərdarlıq! Bu istifadəçi, şifrələmələrini idarə etmək üçün Açar Bağlayıcı tələb edir. Bu istifadəçini təşkilatınızdan silsəniz, hesabı birdəfəlik sıradan çıxarılacaq. Bu əməliyyatın geri dönüşü yoxdur. Davam etmək istəyirsiniz?" + "message": "Xəbərdarlıq! Bu istifadəçi, şifrələmələrini idarə etmək üçün Key Connector tələb edir. Bu istifadəçini təşkilatınızdan silsəniz, hesabı birdəfəlik sıradan çıxarılacaq. Bu əməliyyatın geri dönüşü yoxdur. Davam etmək istəyirsiniz?" }, "externalId": { "message": "Xarici kimlik" }, "externalIdDesc": { - "message": "Xarici kimlik, referans olaraq və ya bu mənbəni istifadəçi kataloqu kimi xarici bir sistemə bağlamaq üçün istifadə edilir." + "message": "Xarici kimlik, Bitwarden Directory Connector və API tərəfindən istifadə edilən şifrələnməmiş istinaddır." }, "ssoExternalId": { "message": "SSO Xarici Kimlik" @@ -4073,7 +4076,7 @@ "message": "Brauzeri güncəllə" }, "generatingYourRiskInsights": { - "message": "Generating your Risk Insights..." + "message": "Risk Təhlilləriniz yaradılır..." }, "updateBrowserDesc": { "message": "Dəstəklənməyən bir veb brauzer istifadə edirsiniz. Veb seyf düzgün işləməyə bilər." @@ -6306,19 +6309,19 @@ "message": "Ödənişsiz Bitwarden Ailələri" }, "sponsoredBitwardenFamilies": { - "message": "Sponsored families" + "message": "Sponsorlu ailələr" }, "noSponsoredFamilies": { - "message": "No sponsored families" + "message": "Sponsorlu ailələr yoxdur" }, "noSponsoredFamiliesDescription": { - "message": "Sponsored non-member families plans will display here" + "message": "Sponsorlu üzv olmayan ailələr planı burada görünəcək" }, "sponsorFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "Təşkilatınızın üzvləri Ödənişsiz Bitwarden Ailələr planından yararlana bilər. Bitwarden təşkilatınızın üzvü olmayan işçilər üçün \"Ödənişsiz Bitwarden Ailələr\"ə sponsor ola bilərsiniz. Üzv olmayan birinə sponsorluq etmək üçün təşkilatınızda mövcud yer olmalıdır." }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "Aktiv bir sponsorluğu ləğv etdiyiniz zaman, sponsorlu təşkilatınızın yenilənmə tarixindən sonra təşkilatınızda bir yer mövcud olacaq." }, "sponsoredFamiliesEligible": { "message": "Siz və ailəniz Ödənişsiz Bitwarden Ailələri üçün uyğunsunuz. İşdə olmadığınız vaxtlarda belə datanızı güvənli saxlamaq üçün özəl e-poçtunuzu istifadə edin." @@ -6336,16 +6339,16 @@ "message": "Ailə sirləri üçün paylaşılan kolleksiyalar" }, "memberFamilies": { - "message": "Member families" + "message": "Üzv ailələr" }, "noMemberFamilies": { - "message": "No member families" + "message": "Üzv olan ailə yoxdur" }, "noMemberFamiliesDescription": { - "message": "Members who have redeemed family plans will display here" + "message": "Ailə planlarını götürən üzvlər burada görünəcək" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "Təşkilatınızın üzvləri Ödənişsiz Bitwarden Ailələr planından yararlana bilər. Burada Ailələr təşkilatına sponsorluq edən üzvləri görə bilərsiniz." }, "badToken": { "message": "Keçid, artıq etibarlı deyil. Lütfən sponsorun təklifi yenidən göndərməsini təmin edin." @@ -6441,10 +6444,10 @@ "message": "Sponsorluq silindi" }, "ssoKeyConnectorError": { - "message": "Açar bağlayıcı xətası: Açar Bağlayıcının mövcud olduğuna və düzgün işlədiyinə əmin olun." + "message": "Key Connector xətası: \"Key Connector\"un mövcud olduğuna və düzgün işlədiyinə əmin olun." }, "keyConnectorUrl": { - "message": "Açar Bağlayıcı URL-si" + "message": "Key Connector URL-si" }, "sendVerificationCode": { "message": "Doğrulama kodunu e-poçtunuza göndərin" @@ -6513,7 +6516,7 @@ "message": "Kimlik doğrulandıqdan sonra üzvlər, ana parollarını istifadə edərək seyf datalarının şifrəsini aça biləcək." }, "keyConnector": { - "message": "Açar Bağlayıcı" + "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { "message": "SSO ilə Girişi, self-hosted şifrə açma açar serverinizə bağlayın. Bu seçimi istifadə edərək, üzvlərin seyf datasının şifrəsini açmaq üçün ana parollarını istifadə etməsinə ehtiyac qalmayacaq.", @@ -6524,11 +6527,11 @@ "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": { - "message": "Açar Bağlayıcı şifrə açmanı quraşdırmaq üçün tələb olunur. Quraşdırma üzrə kömək üçün Bitwarden Dəstək ilə əlaqə saxlayın.", + "message": "Key Connector şifrə açmanı quraşdırmaq üçün tələb olunur. Quraşdırma üzrə kömək üçün Bitwarden Dəstək ilə əlaqə saxlayın.", "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.'" }, "keyConnectorPolicyRestriction": { - "message": "\"SSO və Açar Bağlayıcı Şifrə Açma ilə Giriş\" fəaldır. Bu siyasət yalnız Sahiblər və Adminlər üçün etibarlıdır." + "message": "\"SSO və Key Connector Şifrə Açma ilə Giriş\" fəaldır. Bu siyasət yalnız sahiblər və adminlər üçün etibarlıdır." }, "enabledSso": { "message": "SSO fəaldır" @@ -6537,16 +6540,16 @@ "message": "SSO sıradan çıxarılıb" }, "enabledKeyConnector": { - "message": "Açar Bağlayıcı fəaldır" + "message": "Key Connector aktivdir" }, "disabledKeyConnector": { - "message": "Açar Bağlayıcı sıradan çıxarılıb" + "message": "Key Connector deaktivdir" }, "keyConnectorWarning": { - "message": "Açar Bağlayıcı qurulduqdan sonra, Üzv şifrə açma seçimləri dəyişdirilə bilməz." + "message": "Üzvlər \"Key Connector\"u istifadə etməyə başladıqdan sonra, təşkilatınız ana parol ilə şifrə açma proseduruna geri qaytarıla bilməz. Yalnız bir açar serverini deploy və idarə etmə üçün uyğun olduqda davam edin." }, "migratedKeyConnector": { - "message": "Açar Bağlayıcıya daşındı" + "message": "\"Key Connector\"a daşındı" }, "paymentSponsored": { "message": "Lütfən təşkilatla əlaqələndirmək üçün bir ödəniş metodu təqdim edin. Narahat olmayın, əlavə özəllikləri seçmədiyiniz və ya sponsorluğunuz bitmədiyi müddətcə sizdən heç bir ödəniş tutulmayacaq. " @@ -6567,10 +6570,10 @@ "message": "Test" }, "keyConnectorTestSuccess": { - "message": "Uğurlu! Açar Bağlayıcı əlçatandır." + "message": "Uğurlu! Key Connector əlçatandır." }, "keyConnectorTestFail": { - "message": "Açar Bağlayıcıya müraciət edilə bilmir. URL-ni yoxlayın." + "message": "\"Key Connector\"a müraciət edilə bilmir. URL-ni yoxlayın." }, "sponsorshipTokenHasExpired": { "message": "Sponsorluq təklifinin müddəti bitdi." @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Giriş prosesini tamamlamaq üçün aşağıdakı addımları izləyin." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "DUO-nu başlat" }, @@ -8011,7 +8017,7 @@ "message": "Üzv dəvət et" }, "addSponsorship": { - "message": "Add sponsorship" + "message": "Sponsorluq əlavə et" }, "needsConfirmation": { "message": "Təsdiqləmə lazımdır" diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index f812a4642a2..d7d2ece4dba 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Усе праграмы" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Крытычныя праграмы" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index fc33ba64843..3db468d5f61 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Всички приложения" }, + "appLogoLabel": { + "message": "Лого на Битуорден" + }, "criticalApplications": { "message": "Важни приложения" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Следвайте стъпките по-долу, за да завършите вписването." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Следвайте стъпките по-долу, за да завършите вписването си чрез устройството за удостоверяване." + }, "launchDuo": { "message": "Стартиране на DUO" }, diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index dac995ecc2c..cf9ad7e2642 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 2eeb7cf9c93..00c9d7bec2b 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 340d8b68117..258fdfb80ef 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Totes les aplicacions" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Aplicacions crítiques" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Inicia DUO" }, diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 0aa8e8440d8..8a225aa7efd 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Všechny aplikace" }, + "appLogoLabel": { + "message": "Logo Bitwarden" + }, "criticalApplications": { "message": "Kritické aplikace" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Postupujte podle kroků níže pro dokončení přihlášení." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Postupujte podle následujících kroků pro dokončení přihlášení Vaším bezpečnostním klíčem." + }, "launchDuo": { "message": "Spustit Duo" }, diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index a320fbb5756..aa832c55cb6 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 8c9df167884..ea840633c37 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Alle applikationer" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Kritiske apps" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Start Duo" }, diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 41ff54f8203..547e9bc880d 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Alle Anwendungen" }, + "appLogoLabel": { + "message": "Bitwarden-Logo" + }, "criticalApplications": { "message": "Kritische Anwendungen" }, @@ -3324,10 +3327,10 @@ "message": "Die externe ID ist eine unverschlüsselte Referenz, die vom Bitwarden Directory Connector und der API verwendet wird." }, "ssoExternalId": { - "message": "SSO External ID" + "message": "Externe SSO-ID" }, "ssoExternalIdDesc": { - "message": "SSO External ID is an unencrypted reference between Bitwarden and your configured SSO provider." + "message": "Die externe SSO-ID ist eine unverschlüsselte Referenz zwischen Bitwarden und deinem konfigurierten SSO-Anbieter." }, "nestCollectionUnder": { "message": "Sammlung verschachteln unter" @@ -4073,7 +4076,7 @@ "message": "Browser aktualisieren" }, "generatingYourRiskInsights": { - "message": "Generating your Risk Insights..." + "message": "Dein Risiko-Überblick wird generiert..." }, "updateBrowserDesc": { "message": "Du verwendest einen nicht unterstützten Webbrowser. Der Web-Tresor funktioniert möglicherweise nicht richtig." @@ -6306,19 +6309,19 @@ "message": "Kostenloses Bitwarden Families" }, "sponsoredBitwardenFamilies": { - "message": "Sponsored families" + "message": "Gesponserte Familien" }, "noSponsoredFamilies": { - "message": "No sponsored families" + "message": "Keine gesponserten Familien" }, "noSponsoredFamiliesDescription": { - "message": "Sponsored non-member families plans will display here" + "message": "Gesponserte Families-Tarife von Nicht-Mitgliedern werden hier angezeigt" }, "sponsorFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "Mitglieder deiner Organisation sind für den kostenlosen Bitwarden Families-Tarif berechtigt. Du kannst kostenlose Bitwarden Families-Tarife für Mitarbeiter sponsern, die kein Mitglied deiner Bitwarden Organisation sind. Das Sponsoring eines Nicht-Mitglieds erfordert einen verfügbaren Benutzerplatz in deiner Organisation." }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "Wenn du ein aktives Sponsoring entfernst, steht dir nach dem Verlängerungsdatum der gesponserten Organisation ein Benutzerplatz in deiner Organisation zur Verfügung." }, "sponsoredFamiliesEligible": { "message": "Du und deine Familie haben Anspruch auf Free Bitwarden Families. Mit deiner persönlichen E-Mail-Adresse einlösen, um deine Daten zu schützen, auch wenn du nicht am Arbeitsplatz bist." @@ -6336,16 +6339,16 @@ "message": "Gemeinsame Sammlungen für Familiengeheimnisse" }, "memberFamilies": { - "message": "Member families" + "message": "Mitgliederfamilien" }, "noMemberFamilies": { - "message": "No member families" + "message": "Keine Mitgliederfamilien" }, "noMemberFamiliesDescription": { - "message": "Members who have redeemed family plans will display here" + "message": "Mitglieder, die Families-Tarife eingelöst haben, werden hier angezeigt" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "Mitglieder deiner Organisation sind für den kostenlosen Bitwarden Families-Tarif berechtigt. Hier kannst du Mitglieder sehen, die eine Familien-Organisation gesponsert haben." }, "badToken": { "message": "Der Link ist nicht mehr gültig. Bitte lasse dir vom Sponsor das Angebot erneut senden." @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Folge den Schritten unten, um die Anmeldung abzuschließen." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Folge den Schritten unten, um die Anmeldung mit deinem Sicherheitsschlüssel abzuschließen." + }, "launchDuo": { "message": "DUO starten" }, @@ -8011,7 +8017,7 @@ "message": "Mitglied einladen" }, "addSponsorship": { - "message": "Add sponsorship" + "message": "Sponsoring hinzufügen" }, "needsConfirmation": { "message": "Bestätigung erforderlich" @@ -10373,7 +10379,7 @@ "message": "Der Name der Organisation darf 50 Zeichen nicht überschreiten." }, "rotationCompletedTitle": { - "message": "Schlüsselrotation erfolgreich" + "message": "Schlüsselerneuerung erfolgreich" }, "rotationCompletedDesc": { "message": "Dein Master-Passwort und Verschlüsselungsschlüssel wurden aktualisiert. Deine anderen Geräte wurden abgemeldet." @@ -10587,7 +10593,7 @@ } }, "userkeyRotationDisclaimerDescription": { - "message": "Die Rotation deiner Verschlüsselungsschlüssel erfordert, den Schlüsseln aller Organisationen, die dein Konto wiederherstellen können, sowie aller Kontakte, für die du den Notfallzugriff aktiviert hast, zu vertrauen. Um fortzufahren, stelle sicher, dass du Folgendes bestätigen kannst:" + "message": "Die Erneuerung deiner Verschlüsselungsschlüssel erfordert, den Schlüsseln aller Organisationen zu vertrauen, die dein Konto wiederherstellen können, sowie aller Kontakte, für die du den Notfallzugriff aktiviert hast. Um fortzufahren, stelle sicher, dass du Folgendes bestätigen kannst:" }, "userkeyRotationDisclaimerTitle": { "message": "Nicht vertrauenswürdige Verschlüsselungsschlüssel" @@ -10623,12 +10629,12 @@ "message": "Kostenlose Organisationen können bis zu 2 Sammlungen haben. Upgrade auf ein kostenpflichtiges Abo, um mehr Sammlungen hinzuzufügen." }, "businessUnit": { - "message": "Business Unit" + "message": "Geschäftsbereich" }, "businessUnits": { - "message": "Business Units" + "message": "Geschäftsbereiche" }, "newBusinessUnit": { - "message": "New business unit" + "message": "Neuer Geschäftsbereich" } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 32e169867f8..400cbd30e12 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Όλες οι εφαρμογές" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Κρίσιμες εφαρμογές" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Εκκίνηση Duo" }, diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 91d19c14186..73236099780 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -6315,10 +6318,10 @@ "message": "Sponsored non-member families plans will display here" }, "sponsorFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "Members of your organisation are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organisation. Sponsoring a non-member requires an available seat within your organisation." }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "When you remove an active sponsorship, a seat within your organisation will be available after the renewal date of the sponsored organisation." }, "sponsoredFamiliesEligible": { "message": "You and your family are eligible for Free Bitwarden Families. Redeem with your personal email to keep your data secure even when you are not at work." @@ -6345,7 +6348,7 @@ "message": "Members who have redeemed family plans will display here" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "Members of your organisation are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organisation." }, "badToken": { "message": "The link is no longer valid. Please have the sponsor resend the offer." @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index c110b0405c9..aa3475ad7f7 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -6315,10 +6318,10 @@ "message": "Sponsored non-member families plans will display here" }, "sponsorFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "Members of your organisation are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organisation. Sponsoring a non-member requires an available seat within your organisation." }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "When you remove an active sponsorship, a seat within your organisation will be available after the renewal date of the sponsored organisation." }, "sponsoredFamiliesEligible": { "message": "You and your family are eligible for Free Bitwarden Families. Redeem with your personal email to keep your data secure even when you are not at work." @@ -6345,7 +6348,7 @@ "message": "Members who have redeemed family plans will display here" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "Members of your organisation are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organisation." }, "badToken": { "message": "The link is no longer valid. Please have the sponsor resend the offer." @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index e4f6af64c43..11eeaebdf97 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Ĉiuj aplikaĵoj" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index a2de480e314..c6862e4b602 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Todas las aplicaciones" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Aplicaciones críticas" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Iniciar Duo" }, diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 4d830c453ec..d4c0bd04ed2 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -1,6 +1,9 @@ { "allApplications": { - "message": "All applications" + "message": "Kõik rakendused" + }, + "appLogoLabel": { + "message": "Bitwardeni logo" }, "criticalApplications": { "message": "Critical applications" @@ -21,7 +24,7 @@ "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." }, "dataLastUpdated": { - "message": "Data last updated: $DATE$", + "message": "Viimati uuendatud: $DATE$", "placeholders": { "date": { "content": "$1", @@ -30,19 +33,19 @@ } }, "notifiedMembers": { - "message": "Notified members" + "message": "Teavitatud liikmed" }, "revokeMembers": { - "message": "Revoke members" + "message": "Lõpeta liikmesus" }, "restoreMembers": { - "message": "Restore members" + "message": "Taasta liikmesus" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "Ei õnnestunud taastada ligipääsu organisatsioonile" }, "allApplicationsWithCount": { - "message": "All applications ($COUNT$)", + "message": "Kõik rakendused ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -51,7 +54,7 @@ } }, "createNewLoginItem": { - "message": "Create new login item" + "message": "Loo uus kirje" }, "criticalApplicationsWithCount": { "message": "Critical applications ($COUNT$)", @@ -63,7 +66,7 @@ } }, "notifiedMembersWithCount": { - "message": "Notified members ($COUNT$)", + "message": "Teavitatud liikmed ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -312,7 +315,7 @@ "message": "Kaardi turvakood (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Kaardi turvakood / CVV" }, "identityName": { "message": "Identiteedi nimi" @@ -429,7 +432,7 @@ "message": "Lohista sorteerimiseks" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "Järjekorra muutmiseks lohista" }, "cfTypeText": { "message": "Tekst" @@ -441,7 +444,7 @@ "message": "Boolean" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Märkeruut" }, "cfTypeLinked": { "message": "Seotud", @@ -487,7 +490,7 @@ } }, "newFolder": { - "message": "New folder" + "message": "Uus kaust" }, "folderName": { "message": "Folder name" @@ -838,25 +841,25 @@ "message": "Copy address" }, "copyPhone": { - "message": "Copy phone" + "message": "Kopeeri telefoninumber" }, "copyEmail": { - "message": "Copy email" + "message": "Kopeeri e-posti aadress" }, "copyCompany": { - "message": "Copy company" + "message": "Kopeeri firma nimi" }, "copySSN": { - "message": "Copy Social Security number" + "message": "Kopeeri isikukood" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Kopeeri passi number" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Kopeeri litsentsi number" }, "copyName": { - "message": "Copy name" + "message": "Kopeeri nimi" }, "me": { "message": "Mina" @@ -1037,7 +1040,7 @@ "message": "Ei" }, "location": { - "message": "Location" + "message": "Asukoht" }, "loginOrCreateNewAccount": { "message": "Logi sisse või loo uus konto." @@ -1064,13 +1067,13 @@ "message": "Kasuta teist logimismeetodit" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Logi sisse pääsuvõtmega" }, "useSingleSignOn": { "message": "Use single sign-on" }, "welcomeBack": { - "message": "Welcome back" + "message": "Tere tulemast tagasi" }, "invalidPasskeyPleaseTryAgain": { "message": "Vigane pääsuvõti. Palun proovi uuesti." @@ -1154,7 +1157,7 @@ "message": "Konto loomine" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Esimest korda siin?" }, "setAStrongPassword": { "message": "Määra tugev parool" @@ -1172,16 +1175,16 @@ "message": "Logi sisse" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Logi sisse Bitwardenisse" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Sisesta oma emailile saadetud kood" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Sisesta kood oma autentimisrakendusest" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Autentimiseks vajuta nuppu oma YubiKey'l" }, "authenticationTimeout": { "message": "Authentication timeout" @@ -1190,25 +1193,25 @@ "message": "The authentication session timed out. Please restart the login process." }, "verifyYourIdentity": { - "message": "Verify your Identity" + "message": "Kinnitage oma Identiteet" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Me ei tunne seda seadet. Enda identiteedi kinnitamiseks palun sisesta oma emailile saadetud kood." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Jätka sisse logimist" }, "whatIsADevice": { - "message": "What is a device?" + "message": "Mis asi on seade?" }, "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": "Seade on ainulaadne Bitwardeni rakendus, kus sa oled sisse logitud. Rakenduse uuesti installimine, andmete kustutamine või küpsiste kustutamine võib tekitada olukorra, kus üks seade esineb mitu korda." }, "logInInitiated": { "message": "Sisselogimine käivitatud" }, "logInRequestSent": { - "message": "Request sent" + "message": "Päring saadetud" }, "submit": { "message": "Kinnita" @@ -1263,16 +1266,16 @@ "message": "Seaded" }, "accountEmail": { - "message": "Account email" + "message": "Konto e-maili aadress" }, "requestHint": { - "message": "Request hint" + "message": "Küsi vihjet" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "Küsi parooli vihjet" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" + "message": "Sisesta oma e-maili aadress ja sulle saadetakse sinna parooli vihje" }, "getMasterPasswordHint": { "message": "Tuleta ülemparooli vihjega meelde" @@ -1330,7 +1333,7 @@ "message": "Sinu hoidla on lukus." }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Sinu konto on lukustatud" }, "uuid": { "message": "UUID" @@ -1397,7 +1400,7 @@ "message": "Unlock Bitwarden on your device or on the " }, "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" + "message": "Kas sa püüad praegu oma kontole sisse logida?" }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", @@ -1409,13 +1412,13 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "Kinnita juurdepääs" }, "denyAccess": { - "message": "Deny access" + "message": "Keeldu juurdepääsu andmast" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "veebirakendus" }, "notificationSentDevicePart2": { "message": "Make sure the Fingerprint phrase matches the one below before approving." @@ -1424,7 +1427,7 @@ "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" + "message": "Sinu seadmele saadeti teavitus" }, "versionNumber": { "message": "Versioon $VERSION_NUMBER$", @@ -1445,14 +1448,14 @@ } }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Ära küsi 30 päeva jooksul uuesti" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Vali teine meetod", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Kasuta taastamise koodi" }, "insertU2f": { "message": "Sisesta oma turvaline võti arvuti USB porti. Kui sellel on nupp, siis vajuta seda." @@ -1470,7 +1473,7 @@ "message": "Kaheastmelise sisselogimise valikud" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Vali kaheastmelise sisselogimise meetod" }, "recoveryCodeDesc": { "message": "Sul ei ole ligipääsu ühelegi kaheastmelise kinnitamise teenusele? Kasuta taastamise koodi, et kaheastmeline kinnitamine oma kontol välja lülitada." @@ -1515,7 +1518,7 @@ "message": "(pärineb FIDO'lt)" }, "openInNewTab": { - "message": "Open in new tab" + "message": "Ava uuel vahelehel" }, "emailTitle": { "message": "E-post" @@ -1682,7 +1685,7 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Väldi raskesti eristatavaid tähti ja sümboleid", "description": "Label for the avoid ambiguous characters checkbox." }, "length": { @@ -3913,7 +3916,7 @@ "message": "Device Type" }, "ipAddress": { - "message": "IP Address" + "message": "IP aadress" }, "confirmLogIn": { "message": "Confirm login" @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 0f8858914b4..c10362ee924 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index faee8b5480f..770cf7ce9ba 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 417ac391763..b22ec54a736 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Kaikki sovellukset" }, + "appLogoLabel": { + "message": "Bitwarden-logo" + }, "criticalApplications": { "message": "Kriittiset sovellukset" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Avaa Duo" }, @@ -9363,10 +9369,10 @@ "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, "deviceIdMissing": { - "message": "Device ID is missing" + "message": "Laitteen ID puuttuu" }, "deviceTypeMissing": { - "message": "Device type is missing" + "message": "Laitteen tyyppi puuttuu" }, "deviceCreationDateMissing": { "message": "Laitteen luontipäivä puuttuu" @@ -10255,7 +10261,7 @@ "message": "Muistuta myöhemmin" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "Onko sinulla luotettava pääsy sähköpostiisi, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -10264,10 +10270,10 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "Ei ole" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "Kyllä, voin käyttää sähköpostiani luotettavasti" }, "turnOnTwoStepLogin": { "message": "Ota kaksivaiheinen kirjautuminen käyttöön" @@ -10379,16 +10385,16 @@ "message": "Your master password and encryption keys have been updated. Your other devices have been logged out." }, "trustUserEmergencyAccess": { - "message": "Trust and confirm user" + "message": "Luota ja vahvista käyttäjä" }, "trustOrganization": { - "message": "Trust organization" + "message": "Luota organisaatioon" }, "trust": { - "message": "Trust" + "message": "Luota" }, "doNotTrust": { - "message": "Do not trust" + "message": "Älä luota" }, "emergencyAccessTrustWarning": { "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" @@ -10397,7 +10403,7 @@ "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." }, "trustUser": { - "message": "Trust user" + "message": "Luota käyttäjään" }, "sshKeyWrongPassword": { "message": "Syöttämäsi salasana on virheellinen." diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index fc01382f527..d6080694b04 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 70ac93232e8..95fea042efa 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Toutes les applications" }, + "appLogoLabel": { + "message": "Logo de Bitwarden" + }, "criticalApplications": { "message": "Applications critiques" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Suivez les étapes ci-dessous pour terminer de vous connecter." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Suivez les étapes ci-dessous pour terminer la connexion avec votre clé de sécurité." + }, "launchDuo": { "message": "Lancer DUO" }, diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index cd8c389a0b2..82930d52d0e 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 04cbec113ec..ccd45626475 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "כל היישומים" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "יישומים קריטיים" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "עקוב אחר השלבים למטה כדי לסיים להיכנס." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "פתח את Duo" }, diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 8a55f388919..08f120e3d8d 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index d1a773b20ce..933fe372a0c 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Sve aplikacije" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Kritične aplikacije" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Prati korake za dovršetak prijave." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Pokreni Duo" }, diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index a0ff38cf02d..0f7d9729c0f 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Összes alkalmazás" }, + "appLogoLabel": { + "message": "Bitwarden logó" + }, "criticalApplications": { "message": "Kritikus alkalmazások" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Kövessük az alábbi lépéseket a bejelentkezés befejezéséhez." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Kövessük az alábbi lépéseket a biztonsági kulccsal bejelentkezés befejezéséhez." + }, "launchDuo": { "message": "Duo indítása" }, diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 753c865357c..87cf8054d6c 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Semua aplikasi" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 2bb57c594d3..5d341df743d 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Tutte le applicazioni" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Applicazioni critiche" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Segui i passaggi qui sotto per completare l'accesso." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Avvia DUO" }, diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 4463a08d766..71c453e8de8 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "すべてのアプリ" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "きわめて重要なアプリ" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "以下の手順に従ってログインを完了してください。" }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "DUO を起動" }, diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index cf82a4b8b68..bcfe3090723 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 6a96c3529e2..18816fa57a5 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index d1c3f149b45..e80f5c4a627 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 4d5dc07bdc5..779eb5f7b88 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index d7379dcb02e..9286b140059 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Visas lietotnes" }, + "appLogoLabel": { + "message": "Bitwarden logotips" + }, "criticalApplications": { "message": "Kritiskās lietotnes" }, @@ -2812,7 +2815,7 @@ "message": "Izvēlētais maksājumu veids tiks izmantots jebkuru neapmaksātu abonementu apmaksai." }, "paymentChargedWithTrial": { - "message": "Pašreizējā plānā ir iekļauts bezmaksas 7 dienu izmēģinājuma laiks. Izvēlētais apmaksas veids netiks izmantots līdz izmēģinājuma beigā. Norēķini notiks katru $INTERVAL$. To var atcelt jebkurā brīdī." + "message": "Pašreizējā plānā ir iekļauts bezmaksas 7 dienu izmēģinājuma laiks. Izvēlētais apmaksas veids netiks izmantots līdz izmēģinājuma beigām. To var atcelt jebkurā brīdī." }, "paymentInformation": { "message": "Maksājuma informācija" @@ -2842,7 +2845,7 @@ "message": "Tiek gaidīta atcelšana" }, "subscriptionPendingCanceled": { - "message": "Abonements ir atzīmēts atcelšanai pašreizējā norēķinu perioda beigās." + "message": "Abonements ir atzīmēts atcelšanai pašreizējā norēķinu laika posma beigās." }, "reinstateSubscription": { "message": "Atjaunot abonementu" @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Jāseko zemāk esošajām norādēm, lai pabeigtu pieteikšanos." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Jāizpilda zemāk esošās darbības, lai pabeigtu pieteikšanos ar savu drošības atslēgu." + }, "launchDuo": { "message": "Palaist DUO" }, diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index de418138e4e..92b2498b2ed 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index 6a96c3529e2..18816fa57a5 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 6a96c3529e2..18816fa57a5 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index f9ca2ea0594..64d787b95ed 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Start Duo" }, diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 48560b0990d..6c42df5ed82 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 4880e2bb211..eb7a1e0f6e5 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Alle applicaties" }, + "appLogoLabel": { + "message": "Bitwarden-logo" + }, "criticalApplications": { "message": "Belangrijke applicaties" }, @@ -6312,13 +6315,13 @@ "message": "Geen gesponsorde families" }, "noSponsoredFamiliesDescription": { - "message": "Sponsored non-member families plans will display here" + "message": "Gesponsorde niet-lid Familie-plannen worden hier weergegeven" }, "sponsorFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "Leden van je organisatie komen in aanmerking voor gratis Bitwarden Familie. Je kunt de gratis Bitwarden Familie sponsoren voor medewerkers die geen lid zijn van je Bitwarden-organisatie. Het sponsoren van een niet-lid vereist een beschikbare zitplaats binnen je organisatie." }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "Als je een actieve sponsoring verwijdert, komt er een plaats binnen je organisatie beschikbaar na de verlengingsdatum van de gesponsorde organisatie." }, "sponsoredFamiliesEligible": { "message": "Jij en je familie komen in aanmerking voor gratis Bitwarden Families. Verzilver met je persoonlijke e-mail om je gegevens veilig te houden, zelfs als je niet op het werk bent." @@ -6336,16 +6339,16 @@ "message": "Gedeelde collecties voor familiegeheimen" }, "memberFamilies": { - "message": "Member families" + "message": "Lid-families" }, "noMemberFamilies": { - "message": "No member families" + "message": "Niet-leden families" }, "noMemberFamiliesDescription": { - "message": "Members who have redeemed family plans will display here" + "message": "Leden die familieplannen hebben geclaimd worden hier weergegeven" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "Leden van jouw organisatie komen in aanmerking voor gratis gebruik van Bitwarden Familie. Hier kunt je leden zien die een Familie-organisatie hebben gesponsord." }, "badToken": { "message": "De link is niet langer geldig. Zorg ervoor dat de sponsors de uitnodiging opnieuw versturen." @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Volg de onderstaande stappen om in te loggen." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Volg onderstaande stappen om in te loggen met je beveiligingssleutel." + }, "launchDuo": { "message": "DUO starten" }, diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 42b425c13c4..acfc936ffe5 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 6a96c3529e2..18816fa57a5 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 62e3aba491f..18b82e7c25f 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Wszystkie aplikacje" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Krytyczne aplikacje" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Wykonaj poniższe kroki, by dokończyć logowanie" }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Wykonaj poniższe kroki, aby zakończyć logowanie za pomocą klucza bezpieczeństwa." + }, "launchDuo": { "message": "Uruchom DUO" }, diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 4ba7b5d8e5f..deb3bb663d6 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Todas as aplicações" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Aplicações críticas" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Siga os passos abaixo para finalizar o login." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Abrir o Duo" }, diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 419e71709e3..375ae2179c6 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Todas as aplicações" }, + "appLogoLabel": { + "message": "Logótipo do Bitwarden" + }, "criticalApplications": { "message": "Aplicações críticas" }, @@ -441,7 +444,7 @@ "message": "Booleano" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Caixa de verificação" }, "cfTypeLinked": { "message": "Associado", @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Siga os passos abaixo para concluir o início de sessão." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Siga os passos abaixo para concluir o início de sessão com a sua chave de segurança." + }, "launchDuo": { "message": "Iniciar o DUO" }, diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index a35d843d1ee..0af45c5e5b2 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Toate aplicațiile" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Aplicațiile critice" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 740cd23bc9a..5a259db687c 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Все приложения" }, + "appLogoLabel": { + "message": "Логотип Bitwarden" + }, "criticalApplications": { "message": "Критичные приложения" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Следуйте указаниям ниже, чтобы завершить авторизацию." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Выполните следующие шаги, чтобы завершить авторизацию с помощью ключа безопасности." + }, "launchDuo": { "message": "Запустить Duo" }, diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index 0fccb850994..59701bd437f 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 8c652c0b815..2d99289a375 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Všetky aplikácie" }, + "appLogoLabel": { + "message": "Logo Bitwarden" + }, "criticalApplications": { "message": "Kritické aplikácie" }, @@ -6306,19 +6309,19 @@ "message": "Bitwarden pre Rodiny zadarmo" }, "sponsoredBitwardenFamilies": { - "message": "Sponsored families" + "message": "Sponzorované rodiny" }, "noSponsoredFamilies": { - "message": "No sponsored families" + "message": "Žiadne sponzorované rodiny" }, "noSponsoredFamiliesDescription": { - "message": "Sponsored non-member families plans will display here" + "message": "Tu sa zobrazia sponzorované plány pre Rodiny pre nečlenov" }, "sponsorFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "Členovia vašej organizácie majú nárok na bezplatný plán pre Rodiny. Bezplatný plán pre Rodiny môžete sponzorovať aj pre zamestnancov ktorí nie sú členmi vašej Bitwarden organizácie. Spozorovanie nečlena vyžaduje voľné sedenie v organizácii." }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "Keď odoberiete aktívne sponzorstvo, sedenie vo vašej organizácii sa uvoľní po dátume obnovenia sponzorovanej organizácie." }, "sponsoredFamiliesEligible": { "message": "Vy a vaša rodina máte bezplatne k dispozícii Bitwarden pre Rodiny. Uplatnite si túto možnosť s vaším osobným emailom aby ste mali dáta v bezpečí aj keď nie ste v práci." @@ -6336,16 +6339,16 @@ "message": "Zdieľané zbierky pre Rodinné heslá" }, "memberFamilies": { - "message": "Member families" + "message": "Členské rodiny" }, "noMemberFamilies": { - "message": "No member families" + "message": "Nečlenské rodiny" }, "noMemberFamiliesDescription": { - "message": "Members who have redeemed family plans will display here" + "message": "Tu sa zobrazia členovia ktorí využili rodinne plány" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "Členovia vašej organizácie majú nárok na bezplatný plán pre Rodiny. Tu môžete vidieť členov so sponzorstvom Rodinnej organizácie." }, "badToken": { "message": "The link is no longer valid. Please have the sponsor resend the offer." @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Na dokončenie prihlásenia postupujte podľa pokynov." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Spustiť DUO" }, @@ -8011,7 +8017,7 @@ "message": "Pozvať člena" }, "addSponsorship": { - "message": "Add sponsorship" + "message": "Pridať sponzorstvo" }, "needsConfirmation": { "message": "Potrebné potvrdenie" diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 1211a14c630..e11d2d65fed 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Vse aplikacije" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Kritične aplikacije" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index bff8820dc2f..c9cbc3088aa 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Све апликације" }, + "appLogoLabel": { + "message": "Bitwarden лого" + }, "criticalApplications": { "message": "Критичне апликације" }, @@ -3324,10 +3327,10 @@ "message": "Спољни ид се може користити као референца или за повезивање овог ресурса са спољним системом као што је корисничка фасцикла." }, "ssoExternalId": { - "message": "SSO External ID" + "message": "SSO Спољни ИД" }, "ssoExternalIdDesc": { - "message": "SSO External ID is an unencrypted reference between Bitwarden and your configured SSO provider." + "message": "SSO Спољни ИД је неуредна референца између Bitwarden-а и вашег конфигурисаног SSO провајдера." }, "nestCollectionUnder": { "message": "Постави колекцију испод" @@ -4073,7 +4076,7 @@ "message": "Ажурирајте Претраживач" }, "generatingYourRiskInsights": { - "message": "Generating your Risk Insights..." + "message": "Генерисање прегледа вашег ризика..." }, "updateBrowserDesc": { "message": "Користите неподржани веб прегледач. Веб сеф можда неће правилно функционисати." @@ -6866,10 +6869,10 @@ "message": "„Ухвати све“ е-порука" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Користите подешено catch-all пријемно сандуче вашег домена." }, "useThisEmail": { - "message": "Use this email" + "message": "Користи овај имејл" }, "random": { "message": "Случајно", @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Покренути DUO" }, @@ -8799,7 +8805,7 @@ "message": "УРЛ Сервера" }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "УРЛ сервера који се самостално хостује", "description": "Label for field requesting a self-hosted integration service URL" }, "alreadyHaveAccount": { @@ -9372,7 +9378,7 @@ "message": "Недостаје датум креације уређаја" }, "desktopRequired": { - "message": "Desktop required" + "message": "Desktop је потребан" }, "reopenLinkOnDesktop": { "message": "Reopen this link from your email on a desktop." diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 7135f4d90ec..18526343daa 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Sve aplikacije" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Kritične aplikacije" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index a81f6398e7a..9aa721a3796 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Alla applikationer" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Kritiska applikationer" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Starta Duo" }, diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 6a96c3529e2..18816fa57a5 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 1208d27b044..6b4921160b0 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 4d1f7588159..47c3665c41b 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Tüm uygulamalar" }, + "appLogoLabel": { + "message": "Bitwarden logosu" + }, "criticalApplications": { "message": "Kritik uygulamalar" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Güvenlik anahtarınızla girişi tamamlamak için aşağıdaki adımları izleyin." + }, "launchDuo": { "message": "Duo'yu başlat" }, diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 0dc579e993d..86459ccbf3b 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "Всі програми" }, + "appLogoLabel": { + "message": "Логотип Bitwarden" + }, "criticalApplications": { "message": "Критичні програми" }, @@ -3324,10 +3327,10 @@ "message": "Зовнішній ID – це незашифроване посилання, призначене для використання Bitwarden Directory Connector і API." }, "ssoExternalId": { - "message": "SSO External ID" + "message": "Зовнішній ID SSO" }, "ssoExternalIdDesc": { - "message": "SSO External ID is an unencrypted reference between Bitwarden and your configured SSO provider." + "message": "Зовнішній ID SSO – це незашифроване посилання між Bitwarden і вашим налаштованим провайдером SSO." }, "nestCollectionUnder": { "message": "Розмістити збірку під" @@ -4073,7 +4076,7 @@ "message": "Оновити браузер" }, "generatingYourRiskInsights": { - "message": "Generating your Risk Insights..." + "message": "Генерується інформація щодо ризиків..." }, "updateBrowserDesc": { "message": "Ви використовуєте непідтримуваний браузер. Вебсховище може працювати неправильно." @@ -5692,7 +5695,7 @@ "message": "WebAuthn успішно підтверджено! Ви можете закрити цю вкладку." }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Новий пароль повинен відрізнятися від поточного." }, "hintEqualsPassword": { "message": "Підказка повинна відрізнятися від пароля." @@ -5890,7 +5893,7 @@ "message": "Цифровий відбиток" }, "fingerprintPhrase": { - "message": "Fingerprint phrase:" + "message": "Фраза відбитка:" }, "removeUsers": { "message": "Вилучити користувачів" @@ -6306,19 +6309,19 @@ "message": "Bitwarden Families безплатно" }, "sponsoredBitwardenFamilies": { - "message": "Sponsored families" + "message": "Спонсоровані родини" }, "noSponsoredFamilies": { - "message": "No sponsored families" + "message": "Немає спонсорованих родин" }, "noSponsoredFamiliesDescription": { - "message": "Sponsored non-member families plans will display here" + "message": "Тут буде показано спонсоровані плани родин, які не є учасниками" }, "sponsorFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "Учасники вашої організації мають право на безплатний план Bitwarden Families. Ви можете спонсорувати безплатні плани Bitwarden Families для співробітників, які не є учасниками вашої організації Bitwarden. Для спонсорування користувачів, які не є учасниками організації, необхідні вільні місця в межах вашої організації." }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "Якщо вилучити активне спонсорство, місце у вашій організації стане доступним після дати оновлення спонсорованої організації." }, "sponsoredFamiliesEligible": { "message": "Ви та ваша сім'я маєте право на Bitwarden Families безплатно. Активуйте доступ з особистою електронною адресою, щоб зберігати свої дані захищеними навіть коли ви не на роботі." @@ -6336,16 +6339,16 @@ "message": "Спільні збірки для обміну паролями" }, "memberFamilies": { - "message": "Member families" + "message": "Родини учасників" }, "noMemberFamilies": { - "message": "No member families" + "message": "Родини, які не є учасниками" }, "noMemberFamiliesDescription": { - "message": "Members who have redeemed family plans will display here" + "message": "Тут показуватимуться учасники, які скористалися родинним планом" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "Учасники вашої організації мають право на безплатний план Bitwarden Families. Тут ви можете переглянути учасників, які спонсорують родинну організацію." }, "badToken": { "message": "Посилання більше не дійсне. Попросіть спонсора повторно надіслати пропозицію." @@ -6757,7 +6760,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "Будуть експортовані лише записи особистого сховища включно з вкладеннями, пов'язані з $EMAIL$. Записи сховища організації не експортуватимуться.", "placeholders": { "email": { "content": "$1", @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Виконайте наведені нижче кроки, щоб завершити вхід." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Виконайте наведені нижче кроки, щоб завершити вхід за допомогою ключа безпеки." + }, "launchDuo": { "message": "Запустити Duo" }, @@ -8011,7 +8017,7 @@ "message": "Запросити учасника" }, "addSponsorship": { - "message": "Add sponsorship" + "message": "Додати спонсорство" }, "needsConfirmation": { "message": "Потребує підтвердження" @@ -8751,7 +8757,7 @@ "message": "Дозволити видалення збірок лише власникам та адміністраторам" }, "limitItemDeletionDescription": { - "message": "Limit item deletion to members with the Manage collection permissions" + "message": "Обмежити видалення записів для учасників, які мають дозвіл на керування збірками" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Власники та адміністратори можуть керувати всіма збірками та записами" @@ -10373,31 +10379,31 @@ "message": "Назва організації не може перевищувати 50 символів." }, "rotationCompletedTitle": { - "message": "Key rotation successful" + "message": "Оновлення ключа пройшло успішно" }, "rotationCompletedDesc": { - "message": "Your master password and encryption keys have been updated. Your other devices have been logged out." + "message": "Ваш головний пароль і ключі шифрування оновлено. Сеанси на всіх інших пристроях завершено." }, "trustUserEmergencyAccess": { - "message": "Trust and confirm user" + "message": "Підтвердити й довіряти користувачу" }, "trustOrganization": { - "message": "Trust organization" + "message": "Довіряти організації" }, "trust": { - "message": "Trust" + "message": "Довіряти" }, "doNotTrust": { - "message": "Do not trust" + "message": "Не довіряти" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "Щоб захистити свій обліковий запис, підтверджуйте лише якщо ви надали цьому користувачу екстрений доступ, і його цифровий відбиток збігається з показаним в його обліковому записі." }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "Щоб захистити свій обліковий запис, продовжуйте лише якщо ви є учасником цієї організації, маєте ввімкнене відновлення облікового запису, і показаний нижче цифровий відбиток збігається з відбитком організації." }, "trustUser": { - "message": "Trust user" + "message": "Довіряти користувачу" }, "sshKeyWrongPassword": { "message": "Ви ввели неправильний пароль." @@ -10569,7 +10575,7 @@ "message": "Призначені місця перевищують доступні місця." }, "userkeyRotationDisclaimerEmergencyAccessText": { - "message": "Fingerprint phrase for $NUM_USERS$ contacts for which you have enabled emergency access.", + "message": "Фраза відбитка для контактів ($NUM_USERS$), яким ви активували екстрений доступ.", "placeholders": { "num_users": { "content": "$1", @@ -10578,7 +10584,7 @@ } }, "userkeyRotationDisclaimerAccountRecoveryOrgsText": { - "message": "Fingerprint phrase for the organization $ORG_NAME$ for which you have enabled account recovery.", + "message": "Фраза відбитка для організації $ORG_NAME$, якій ви активували відновлення облікового запису.", "placeholders": { "org_name": { "content": "$1", @@ -10587,10 +10593,10 @@ } }, "userkeyRotationDisclaimerDescription": { - "message": "Rotating your encryption keys will require you to trust keys of any organizations that can recover your account, and any contacts that you have enabled emergency access for. To continue, make sure you can verify the following:" + "message": "Оновлення ваших ключів шифрування потребуватиме довіри ключам будь-яких організацій, які можуть відновлювати ваш обліковий запис, а також будь-яких контактів, яким ви активували екстрений доступ. Щоб продовжити, переконайтеся, що ви можете перевірити зазначене нижче:" }, "userkeyRotationDisclaimerTitle": { - "message": "Untrusted encryption keys" + "message": "Недовірені ключі шифрування" }, "changeAtRiskPassword": { "message": "Змінити ризикований пароль" @@ -10623,12 +10629,12 @@ "message": "Безплатні організації можуть мати до 2 збірок. Передплатіть тарифний план, щоб додати більше збірок." }, "businessUnit": { - "message": "Business Unit" + "message": "Бізнес-підрозділ" }, "businessUnits": { - "message": "Business Units" + "message": "Бізнес-підрозділи" }, "newBusinessUnit": { - "message": "New business unit" + "message": "Новий бізнес-підрозділ" } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 4da814e80ad..251f2c8565f 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "All applications" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "Critical applications" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "Launch Duo" }, diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index f3cf97f8d8c..b7355b13e0a 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "所有应用程序" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "关键应用程序" }, @@ -2425,7 +2428,7 @@ "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "orgsReportsDesc": { - "message": "点击下面的报告来验证和消除您组织帐户中的安全漏洞。", + "message": "点击下面的报告,找出并消除您的组织账户中的安全漏洞。", "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "unsecuredWebsitesReport": { @@ -6306,19 +6309,19 @@ "message": "免费 Bitwarden 家庭" }, "sponsoredBitwardenFamilies": { - "message": "Sponsored families" + "message": "赞助的家庭" }, "noSponsoredFamilies": { - "message": "No sponsored families" + "message": "没有赞助的家庭" }, "noSponsoredFamiliesDescription": { - "message": "Sponsored non-member families plans will display here" + "message": "已赞助的非成员家庭计划将显示在这里" }, "sponsorFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "您的组织成员有资格获得免费的 Bitwarden 家庭版计划。您可以为不是您的 Bitwarden 组织成员的员工赞助免费 Bitwarden 家庭。赞助非成员需要您的组织内有可用的席位。" }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "当您移除某个活动赞助时,该赞助席位将在被赞助组织的续费日期后释放给您的组织使用。" }, "sponsoredFamiliesEligible": { "message": "您和您的家人有资格获得免费的 Bitwarden 家庭版计划。使用您的个人电子邮箱兑换,即使您不在工作中,也能确保您的数据安全。" @@ -6336,16 +6339,16 @@ "message": "用于家庭机密的共享集合" }, "memberFamilies": { - "message": "Member families" + "message": "成员家庭" }, "noMemberFamilies": { - "message": "No member families" + "message": "没有成员家庭" }, "noMemberFamiliesDescription": { - "message": "Members who have redeemed family plans will display here" + "message": "已兑换家庭计划的成员将在这里显示" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "您的组织成员有资格获得免费的 Bitwarden 家庭版计划。在这里,您可以看到已赞助了家庭组织的成员。" }, "badToken": { "message": "链接已失效。请让赞助方重新发送邀请。" @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "按照以下步骤完成登录。" }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "请按照下面的步骤,使用您的安全密钥完成登录。" + }, "launchDuo": { "message": "启动 Duo" }, @@ -8011,7 +8017,7 @@ "message": "邀请成员" }, "addSponsorship": { - "message": "Add sponsorship" + "message": "添加赞助" }, "needsConfirmation": { "message": "需要确认" diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index e9ad25abf34..680b60a26ca 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -2,6 +2,9 @@ "allApplications": { "message": "所有應用程式" }, + "appLogoLabel": { + "message": "Bitwarden logo" + }, "criticalApplications": { "message": "重要應用程式" }, @@ -7276,6 +7279,9 @@ "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." }, + "followTheStepsBelowToFinishLoggingInWithSecurityKey": { + "message": "Follow the steps below to finish logging in with your security key." + }, "launchDuo": { "message": "啟動 Duo" }, diff --git a/bitwarden_license/bit-web/src/app/billing/providers/setup/setup-business-unit.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/setup/setup-business-unit.component.ts index 4c8d483a0c5..f262ba1abd0 100644 --- a/bitwarden_license/bit-web/src/app/billing/providers/setup/setup-business-unit.component.ts +++ b/bitwarden_license/bit-web/src/app/billing/providers/setup/setup-business-unit.component.ts @@ -84,10 +84,8 @@ export class SetupBusinessUnitComponent extends BaseAcceptComponent { const organizationKey = await firstValueFrom(organizationKey$); - const { encryptedString: encryptedOrganizationKey } = await this.encryptService.encrypt( - organizationKey.key, - providerKey, - ); + const { encryptedString: encryptedOrganizationKey } = + await this.encryptService.wrapSymmetricKey(organizationKey, providerKey); if (!encryptedProviderKey || !encryptedOrganizationKey) { return await fail(); diff --git a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-authenticator.component.html b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-authenticator.component.html index af3a8569efa..b52af7b3820 100644 --- a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-authenticator.component.html +++ b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-authenticator.component.html @@ -1,6 +1,13 @@ {{ "verificationCode" | i18n }} - + diff --git a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-authenticator.component.ts b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-authenticator.component.ts index 333afc22d2a..d8735d3fd54 100644 --- a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-authenticator.component.ts +++ b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-authenticator.component.ts @@ -1,5 +1,5 @@ import { CommonModule } from "@angular/common"; -import { Component, Input } from "@angular/core"; +import { Component, Input, Output, EventEmitter } from "@angular/core"; import { ReactiveFormsModule, FormsModule, FormControl } from "@angular/forms"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -32,4 +32,10 @@ import { }) export class TwoFactorAuthAuthenticatorComponent { @Input({ required: true }) tokenFormControl: FormControl | undefined = undefined; + @Output() tokenChange = new EventEmitter<{ token: string }>(); + + onTokenChange(event: Event) { + const tokenValue = (event.target as HTMLInputElement).value || ""; + this.tokenChange.emit({ token: tokenValue }); + } } diff --git a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-component-email-cache.service.spec.ts b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-component-email-cache.service.spec.ts new file mode 100644 index 00000000000..f3b904a4ea6 --- /dev/null +++ b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-component-email-cache.service.spec.ts @@ -0,0 +1,165 @@ +import { TestBed } from "@angular/core/testing"; +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; + +import { + TwoFactorAuthEmailComponentCache, + TwoFactorAuthEmailComponentCacheService, +} from "./two-factor-auth-email-component-cache.service"; + +describe("TwoFactorAuthEmailCache", () => { + describe("fromJSON", () => { + it("returns null when input is null", () => { + const result = TwoFactorAuthEmailComponentCache.fromJSON(null as any); + expect(result).toBeNull(); + }); + + it("creates a TwoFactorAuthEmailCache instance from valid JSON", () => { + const jsonData = { emailSent: true }; + const result = TwoFactorAuthEmailComponentCache.fromJSON(jsonData); + + expect(result).not.toBeNull(); + expect(result).toBeInstanceOf(TwoFactorAuthEmailComponentCache); + expect(result?.emailSent).toBe(true); + }); + }); +}); + +describe("TwoFactorAuthEmailComponentCacheService", () => { + let service: TwoFactorAuthEmailComponentCacheService; + let mockViewCacheService: MockProxy; + let mockConfigService: MockProxy; + let cacheData: BehaviorSubject; + let mockSignal: any; + + beforeEach(() => { + mockViewCacheService = mock(); + mockConfigService = mock(); + cacheData = new BehaviorSubject(null); + mockSignal = jest.fn(() => cacheData.getValue()); + mockSignal.set = jest.fn((value: TwoFactorAuthEmailComponentCache | null) => + cacheData.next(value), + ); + mockViewCacheService.signal.mockReturnValue(mockSignal); + + TestBed.configureTestingModule({ + providers: [ + TwoFactorAuthEmailComponentCacheService, + { provide: ViewCacheService, useValue: mockViewCacheService }, + { provide: ConfigService, useValue: mockConfigService }, + ], + }); + + service = TestBed.inject(TwoFactorAuthEmailComponentCacheService); + }); + + it("creates the service", () => { + expect(service).toBeTruthy(); + }); + + describe("init", () => { + it("sets featureEnabled to true when flag is enabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + + await service.init(); + + expect(mockConfigService.getFeatureFlag).toHaveBeenCalledWith( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + + service.cacheData({ emailSent: true }); + expect(mockSignal.set).toHaveBeenCalled(); + }); + + it("sets featureEnabled to false when flag is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + + await service.init(); + + expect(mockConfigService.getFeatureFlag).toHaveBeenCalledWith( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + + service.cacheData({ emailSent: true }); + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("cacheData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("caches email sent state when feature is enabled", () => { + service.cacheData({ emailSent: true }); + + expect(mockSignal.set).toHaveBeenCalledWith({ + emailSent: true, + }); + }); + + it("does not cache data when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + service.cacheData({ emailSent: true }); + + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("clearCachedData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("clears cached data when feature is enabled", () => { + service.clearCachedData(); + + expect(mockSignal.set).toHaveBeenCalledWith(null); + }); + + it("does not clear cached data when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + service.clearCachedData(); + + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("getCachedData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("returns cached data when feature is enabled", () => { + const testData = new TwoFactorAuthEmailComponentCache(); + testData.emailSent = true; + cacheData.next(testData); + + const result = service.getCachedData(); + + expect(result).toEqual(testData); + expect(mockSignal).toHaveBeenCalled(); + }); + + it("returns null when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + const result = service.getCachedData(); + + expect(result).toBeNull(); + expect(mockSignal).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email-component-cache.service.spec.ts b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email-component-cache.service.spec.ts new file mode 100644 index 00000000000..1613c0e4af8 --- /dev/null +++ b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email-component-cache.service.spec.ts @@ -0,0 +1,165 @@ +import { TestBed } from "@angular/core/testing"; +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; + +import { + TwoFactorAuthEmailComponentCache, + TwoFactorAuthEmailComponentCacheService, +} from "./two-factor-auth-email-component-cache.service"; + +describe("TwoFactorAuthEmailComponentCache", () => { + describe("fromJSON", () => { + it("returns null when input is null", () => { + const result = TwoFactorAuthEmailComponentCache.fromJSON(null as any); + expect(result).toBeNull(); + }); + + it("creates a TwoFactorAuthEmailCache instance from valid JSON", () => { + const jsonData = { emailSent: true }; + const result = TwoFactorAuthEmailComponentCache.fromJSON(jsonData); + + expect(result).not.toBeNull(); + expect(result).toBeInstanceOf(TwoFactorAuthEmailComponentCache); + expect(result?.emailSent).toBe(true); + }); + }); +}); + +describe("TwoFactorAuthEmailComponentCacheService", () => { + let service: TwoFactorAuthEmailComponentCacheService; + let mockViewCacheService: MockProxy; + let mockConfigService: MockProxy; + let cacheData: BehaviorSubject; + let mockSignal: any; + + beforeEach(() => { + mockViewCacheService = mock(); + mockConfigService = mock(); + cacheData = new BehaviorSubject(null); + mockSignal = jest.fn(() => cacheData.getValue()); + mockSignal.set = jest.fn((value: TwoFactorAuthEmailComponentCache | null) => + cacheData.next(value), + ); + mockViewCacheService.signal.mockReturnValue(mockSignal); + + TestBed.configureTestingModule({ + providers: [ + TwoFactorAuthEmailComponentCacheService, + { provide: ViewCacheService, useValue: mockViewCacheService }, + { provide: ConfigService, useValue: mockConfigService }, + ], + }); + + service = TestBed.inject(TwoFactorAuthEmailComponentCacheService); + }); + + it("creates the service", () => { + expect(service).toBeTruthy(); + }); + + describe("init", () => { + it("sets featureEnabled to true when flag is enabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + + await service.init(); + + expect(mockConfigService.getFeatureFlag).toHaveBeenCalledWith( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + + service.cacheData({ emailSent: true }); + expect(mockSignal.set).toHaveBeenCalled(); + }); + + it("sets featureEnabled to false when flag is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + + await service.init(); + + expect(mockConfigService.getFeatureFlag).toHaveBeenCalledWith( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + + service.cacheData({ emailSent: true }); + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("cacheData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("caches email sent state when feature is enabled", () => { + service.cacheData({ emailSent: true }); + + expect(mockSignal.set).toHaveBeenCalledWith({ + emailSent: true, + }); + }); + + it("does not cache data when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + service.cacheData({ emailSent: true }); + + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("clearCachedData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("clears cached data when feature is enabled", () => { + service.clearCachedData(); + + expect(mockSignal.set).toHaveBeenCalledWith(null); + }); + + it("does not clear cached data when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + service.clearCachedData(); + + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("getCachedData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("returns cached data when feature is enabled", () => { + const testData = new TwoFactorAuthEmailComponentCache(); + testData.emailSent = true; + cacheData.next(testData); + + const result = service.getCachedData(); + + expect(result).toEqual(testData); + expect(mockSignal).toHaveBeenCalled(); + }); + + it("returns null when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + const result = service.getCachedData(); + + expect(result).toBeNull(); + expect(mockSignal).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email-component-cache.service.ts b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email-component-cache.service.ts new file mode 100644 index 00000000000..e32b6cd1385 --- /dev/null +++ b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email-component-cache.service.ts @@ -0,0 +1,95 @@ +import { inject, Injectable, WritableSignal } from "@angular/core"; +import { Jsonify } from "type-fest"; + +import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; + +/** + * The key for the email two factor auth component cache. + */ +export const TWO_FACTOR_AUTH_EMAIL_COMPONENT_CACHE_KEY = "two-factor-auth-email-component-cache"; + +/** + * Cache model for the email two factor auth component. + */ +export class TwoFactorAuthEmailComponentCache { + emailSent: boolean = false; + + static fromJSON( + obj: Partial>, + ): TwoFactorAuthEmailComponentCache | null { + // Return null if the cache is empty + if (obj == null) { + return null; + } + + return Object.assign(new TwoFactorAuthEmailComponentCache(), obj); + } +} + +/** + * Cache service for the two factor auth email component. + */ +@Injectable() +export class TwoFactorAuthEmailComponentCacheService { + private viewCacheService: ViewCacheService = inject(ViewCacheService); + private configService: ConfigService = inject(ConfigService); + + /** True when the feature flag is enabled */ + private featureEnabled: boolean = false; + + /** + * Signal for the cached email state. + */ + private emailCache: WritableSignal = + this.viewCacheService.signal({ + key: TWO_FACTOR_AUTH_EMAIL_COMPONENT_CACHE_KEY, + initialValue: null, + deserializer: TwoFactorAuthEmailComponentCache.fromJSON, + }); + + /** + * Must be called once before interacting with the cached data. + */ + async init() { + this.featureEnabled = await this.configService.getFeatureFlag( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + } + + /** + * Cache the email sent state. + */ + cacheData(data: { emailSent: boolean }): void { + if (!this.featureEnabled) { + return; + } + + this.emailCache.set({ + emailSent: data.emailSent, + } as TwoFactorAuthEmailComponentCache); + } + + /** + * Clear the cached email data. + */ + clearCachedData(): void { + if (!this.featureEnabled) { + return; + } + + this.emailCache.set(null); + } + + /** + * Get whether the email has been sent. + */ + getCachedData(): TwoFactorAuthEmailComponentCache | null { + if (!this.featureEnabled) { + return null; + } + + return this.emailCache(); + } +} diff --git a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email.component.html b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email.component.html index 41873c32ed0..90f1d74ae48 100644 --- a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email.component.html +++ b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email.component.html @@ -1,6 +1,13 @@ {{ "verificationCode" | i18n }} - +

diff --git a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email.component.ts b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email.component.ts index 0c67416532f..25235017bd1 100644 --- a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email.component.ts +++ b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-email/two-factor-auth-email.component.ts @@ -1,5 +1,5 @@ import { CommonModule } from "@angular/common"; -import { Component, Input, OnInit } from "@angular/core"; +import { Component, Input, OnInit, Output, EventEmitter } from "@angular/core"; import { ReactiveFormsModule, FormsModule, FormControl } from "@angular/forms"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -22,6 +22,7 @@ import { ToastService, } from "@bitwarden/components"; +import { TwoFactorAuthEmailComponentCacheService } from "./two-factor-auth-email-component-cache.service"; import { TwoFactorAuthEmailComponentService } from "./two-factor-auth-email-component.service"; @Component({ @@ -40,14 +41,20 @@ import { TwoFactorAuthEmailComponentService } from "./two-factor-auth-email-comp AsyncActionsModule, FormsModule, ], - providers: [], + providers: [ + { + provide: TwoFactorAuthEmailComponentCacheService, + useClass: TwoFactorAuthEmailComponentCacheService, + }, + ], }) export class TwoFactorAuthEmailComponent implements OnInit { @Input({ required: true }) tokenFormControl: FormControl | undefined = undefined; + @Output() tokenChange = new EventEmitter<{ token: string }>(); twoFactorEmail: string | undefined = undefined; - emailPromise: Promise | undefined = undefined; - tokenValue: string = ""; + emailPromise: Promise | undefined; + emailSent = false; constructor( protected i18nService: I18nService, @@ -59,14 +66,22 @@ export class TwoFactorAuthEmailComponent implements OnInit { protected appIdService: AppIdService, private toastService: ToastService, private twoFactorAuthEmailComponentService: TwoFactorAuthEmailComponentService, + private cacheService: TwoFactorAuthEmailComponentCacheService, ) {} async ngOnInit(): Promise { await this.twoFactorAuthEmailComponentService.openPopoutIfApprovedForEmail2fa?.(); + await this.cacheService.init(); + + // Check if email was already sent + const cachedData = this.cacheService.getCachedData(); + if (cachedData?.emailSent) { + this.emailSent = true; + } const providers = await this.twoFactorService.getProviders(); - if (!providers) { + if (!providers || providers.size === 0) { throw new Error("User has no 2FA Providers"); } @@ -78,11 +93,20 @@ export class TwoFactorAuthEmailComponent implements OnInit { this.twoFactorEmail = email2faProviderData.Email; - if (providers.size > 1) { + if (!this.emailSent) { await this.sendEmail(false); } } + /** + * Emits the token value to the parent component + * @param event - The event object from the input field + */ + onTokenChange(event: Event) { + const tokenValue = (event.target as HTMLInputElement).value || ""; + this.tokenChange.emit({ token: tokenValue }); + } + async sendEmail(doToast: boolean) { if (this.emailPromise !== undefined) { return; @@ -113,6 +137,10 @@ export class TwoFactorAuthEmailComponent implements OnInit { request.authRequestId = (await this.loginStrategyService.getAuthRequestId()) ?? ""; this.emailPromise = this.apiService.postTwoFactorEmail(request); await this.emailPromise; + + this.emailSent = true; + this.cacheService.cacheData({ emailSent: this.emailSent }); + if (doToast) { this.toastService.showToast({ variant: "success", diff --git a/libs/auth/src/angular/two-factor-auth/two-factor-auth-component-cache.service.spec.ts b/libs/auth/src/angular/two-factor-auth/two-factor-auth-component-cache.service.spec.ts new file mode 100644 index 00000000000..0993954fde1 --- /dev/null +++ b/libs/auth/src/angular/two-factor-auth/two-factor-auth-component-cache.service.spec.ts @@ -0,0 +1,191 @@ +import { TestBed } from "@angular/core/testing"; +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; +import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; + +import { + TwoFactorAuthComponentCache, + TwoFactorAuthComponentCacheService, + TwoFactorAuthComponentData, +} from "./two-factor-auth-component-cache.service"; + +describe("TwoFactorAuthCache", () => { + describe("fromJSON", () => { + it("returns null when input is null", () => { + const result = TwoFactorAuthComponentCache.fromJSON(null as any); + expect(result).toBeNull(); + }); + + it("creates a TwoFactorAuthCache instance from valid JSON", () => { + const jsonData = { + token: "123456", + remember: true, + selectedProviderType: TwoFactorProviderType.Email, + }; + const result = TwoFactorAuthComponentCache.fromJSON(jsonData as any); + + expect(result).not.toBeNull(); + expect(result).toBeInstanceOf(TwoFactorAuthComponentCache); + expect(result?.token).toBe("123456"); + expect(result?.remember).toBe(true); + expect(result?.selectedProviderType).toBe(TwoFactorProviderType.Email); + }); + }); +}); + +describe("TwoFactorAuthComponentCacheService", () => { + let service: TwoFactorAuthComponentCacheService; + let mockViewCacheService: MockProxy; + let mockConfigService: MockProxy; + let cacheData: BehaviorSubject; + let mockSignal: any; + + beforeEach(() => { + mockViewCacheService = mock(); + mockConfigService = mock(); + cacheData = new BehaviorSubject(null); + mockSignal = jest.fn(() => cacheData.getValue()); + mockSignal.set = jest.fn((value: TwoFactorAuthComponentCache | null) => cacheData.next(value)); + mockViewCacheService.signal.mockReturnValue(mockSignal); + + TestBed.configureTestingModule({ + providers: [ + TwoFactorAuthComponentCacheService, + { provide: ViewCacheService, useValue: mockViewCacheService }, + { provide: ConfigService, useValue: mockConfigService }, + ], + }); + + service = TestBed.inject(TwoFactorAuthComponentCacheService); + }); + + it("creates the service", () => { + expect(service).toBeTruthy(); + }); + + describe("init", () => { + it("sets featureEnabled to true when flag is enabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + + await service.init(); + + expect(mockConfigService.getFeatureFlag).toHaveBeenCalledWith( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + + service.cacheData({ token: "123456" }); + expect(mockSignal.set).toHaveBeenCalled(); + }); + + it("sets featureEnabled to false when flag is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + + await service.init(); + + expect(mockConfigService.getFeatureFlag).toHaveBeenCalledWith( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + + service.cacheData({ token: "123456" }); + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("cacheData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("caches complete data when feature is enabled", () => { + const testData: TwoFactorAuthComponentData = { + token: "123456", + remember: true, + selectedProviderType: TwoFactorProviderType.Email, + }; + + service.cacheData(testData); + + expect(mockSignal.set).toHaveBeenCalledWith({ + token: "123456", + remember: true, + selectedProviderType: TwoFactorProviderType.Email, + }); + }); + + it("caches partial data when feature is enabled", () => { + service.cacheData({ token: "123456" }); + + expect(mockSignal.set).toHaveBeenCalledWith({ + token: "123456", + remember: undefined, + selectedProviderType: undefined, + }); + }); + + it("does not cache data when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + service.cacheData({ token: "123456" }); + + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("clearCachedData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("clears cached data when feature is enabled", () => { + service.clearCachedData(); + + expect(mockSignal.set).toHaveBeenCalledWith(null); + }); + + it("does not clear cached data when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + service.clearCachedData(); + + expect(mockSignal.set).not.toHaveBeenCalled(); + }); + }); + + describe("getCachedData", () => { + beforeEach(async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(true); + await service.init(); + }); + + it("returns cached data when feature is enabled", () => { + const testData = new TwoFactorAuthComponentCache(); + testData.token = "123456"; + testData.remember = true; + testData.selectedProviderType = TwoFactorProviderType.Email; + cacheData.next(testData); + + const result = service.getCachedData(); + + expect(result).toEqual(testData); + expect(mockSignal).toHaveBeenCalled(); + }); + + it("returns null when feature is disabled", async () => { + mockConfigService.getFeatureFlag.mockResolvedValue(false); + await service.init(); + + const result = service.getCachedData(); + + expect(result).toBeNull(); + expect(mockSignal).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/libs/auth/src/angular/two-factor-auth/two-factor-auth-component-cache.service.ts b/libs/auth/src/angular/two-factor-auth/two-factor-auth-component-cache.service.ts new file mode 100644 index 00000000000..61b44aa98dd --- /dev/null +++ b/libs/auth/src/angular/two-factor-auth/two-factor-auth-component-cache.service.ts @@ -0,0 +1,105 @@ +import { inject, Injectable, WritableSignal } from "@angular/core"; +import { Jsonify } from "type-fest"; + +import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; +import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; + +const TWO_FACTOR_AUTH_COMPONENT_CACHE_KEY = "two-factor-auth-component-cache"; + +/** + * Cache model for the two factor authentication data. + */ +export class TwoFactorAuthComponentCache { + token: string | undefined = undefined; + remember: boolean | undefined = undefined; + selectedProviderType: TwoFactorProviderType | undefined = undefined; + + static fromJSON( + obj: Partial>, + ): TwoFactorAuthComponentCache | null { + // Return null if the cache is empty + if (obj == null) { + return null; + } + + return Object.assign(new TwoFactorAuthComponentCache(), obj); + } +} + +export interface TwoFactorAuthComponentData { + token?: string; + remember?: boolean; + selectedProviderType?: TwoFactorProviderType; +} + +/** + * Cache service used for the two factor auth component. + */ +@Injectable() +export class TwoFactorAuthComponentCacheService { + private viewCacheService: ViewCacheService = inject(ViewCacheService); + private configService: ConfigService = inject(ConfigService); + + /** True when the `PM9115_TwoFactorExtensionDataPersistence` flag is enabled */ + private featureEnabled: boolean = false; + + /** + * Signal for the cached TwoFactorAuthData. + */ + private twoFactorAuthComponentCache: WritableSignal = + this.viewCacheService.signal({ + key: TWO_FACTOR_AUTH_COMPONENT_CACHE_KEY, + initialValue: null, + deserializer: TwoFactorAuthComponentCache.fromJSON, + }); + + constructor() {} + + /** + * Must be called once before interacting with the cached data. + */ + async init() { + this.featureEnabled = await this.configService.getFeatureFlag( + FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, + ); + } + + /** + * Update the cache with the new TwoFactorAuthData. + */ + cacheData(data: TwoFactorAuthComponentData): void { + if (!this.featureEnabled) { + return; + } + + this.twoFactorAuthComponentCache.set({ + token: data.token, + remember: data.remember, + selectedProviderType: data.selectedProviderType, + } as TwoFactorAuthComponentCache); + } + + /** + * Clears the cached TwoFactorAuthData. + */ + clearCachedData(): void { + if (!this.featureEnabled) { + return; + } + + this.twoFactorAuthComponentCache.set(null); + } + + /** + * Returns the cached TwoFactorAuthData (when available). + */ + getCachedData(): TwoFactorAuthComponentCache | null { + if (!this.featureEnabled) { + return null; + } + + return this.twoFactorAuthComponentCache(); + } +} diff --git a/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.html b/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.html index ec03944a954..8ad35c7b5c6 100644 --- a/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.html +++ b/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.html @@ -13,11 +13,13 @@ > {{ "dontAskAgainOnThisDeviceFor30Days" | i18n }} - + { let anonLayoutWrapperDataService: MockProxy; let mockEnvService: MockProxy; let mockLoginSuccessHandlerService: MockProxy; + let mockTwoFactorAuthCompCacheService: MockProxy; let mockUserDecryptionOpts: { noMasterPassword: UserDecryptionOptions; @@ -112,6 +112,10 @@ describe("TwoFactorAuthComponent", () => { anonLayoutWrapperDataService = mock(); + mockTwoFactorAuthCompCacheService = mock(); + mockTwoFactorAuthCompCacheService.getCachedData.mockReturnValue(null); + mockTwoFactorAuthCompCacheService.init.mockResolvedValue(); + mockUserDecryptionOpts = { noMasterPassword: new UserDecryptionOptions({ hasMasterPassword: false, @@ -155,7 +159,9 @@ describe("TwoFactorAuthComponent", () => { }), }; - selectedUserDecryptionOptions = new BehaviorSubject(undefined); + selectedUserDecryptionOptions = new BehaviorSubject( + mockUserDecryptionOpts.withMasterPassword, + ); mockUserDecryptionOptionsService.userDecryptionOptions$ = selectedUserDecryptionOptions; TestBed.configureTestingModule({ @@ -194,6 +200,10 @@ describe("TwoFactorAuthComponent", () => { { provide: EnvironmentService, useValue: mockEnvService }, { provide: AnonLayoutWrapperDataService, useValue: anonLayoutWrapperDataService }, { provide: LoginSuccessHandlerService, useValue: mockLoginSuccessHandlerService }, + { + provide: TwoFactorAuthComponentCacheService, + useValue: mockTwoFactorAuthCompCacheService, + }, ], }); diff --git a/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts b/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts index aed9f9f07a5..f09d7163667 100644 --- a/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts +++ b/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts @@ -60,6 +60,10 @@ import { TwoFactorAuthDuoComponent } from "./child-components/two-factor-auth-du import { TwoFactorAuthEmailComponent } from "./child-components/two-factor-auth-email/two-factor-auth-email.component"; import { TwoFactorAuthWebAuthnComponent } from "./child-components/two-factor-auth-webauthn/two-factor-auth-webauthn.component"; import { TwoFactorAuthYubikeyComponent } from "./child-components/two-factor-auth-yubikey.component"; +import { + TwoFactorAuthComponentCacheService, + TwoFactorAuthComponentData, +} from "./two-factor-auth-component-cache.service"; import { DuoLaunchAction, LegacyKeyMigrationAction, @@ -90,7 +94,11 @@ import { TwoFactorAuthYubikeyComponent, TwoFactorAuthWebAuthnComponent, ], - providers: [], + providers: [ + { + provide: TwoFactorAuthComponentCacheService, + }, + ], }) export class TwoFactorAuthComponent implements OnInit, OnDestroy { @ViewChild("continueButton", { read: ElementRef, static: false }) continueButton: @@ -160,6 +168,7 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { private anonLayoutWrapperDataService: AnonLayoutWrapperDataService, private environmentService: EnvironmentService, private loginSuccessHandlerService: LoginSuccessHandlerService, + private twoFactorAuthComponentCacheService: TwoFactorAuthComponentCacheService, ) {} async ngOnInit() { @@ -168,7 +177,33 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { this.listenForAuthnSessionTimeout(); - await this.setSelected2faProviderType(); + // Initialize the cache + await this.twoFactorAuthComponentCacheService.init(); + + // Load cached form data if available + let loadedCachedProviderType = false; + const cachedData = this.twoFactorAuthComponentCacheService.getCachedData(); + if (cachedData) { + if (cachedData.token) { + this.form.patchValue({ token: cachedData.token }); + } + if (cachedData.remember !== undefined) { + this.form.patchValue({ remember: cachedData.remember }); + } + if (cachedData.selectedProviderType !== undefined) { + this.selectedProviderType = cachedData.selectedProviderType; + loadedCachedProviderType = true; + } + } + + // If we don't have a cached provider type, set it to the default and cache it + if (!loadedCachedProviderType) { + this.selectedProviderType = await this.initializeSelected2faProviderType(); + this.twoFactorAuthComponentCacheService.cacheData({ + selectedProviderType: this.selectedProviderType, + }); + } + await this.set2faProvidersAndData(); await this.setAnonLayoutDataByTwoFactorProviderType(); @@ -181,7 +216,29 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { this.loading = false; } - private async setSelected2faProviderType() { + /** + * Save specific form data fields to the cache + */ + async saveFormDataWithPartialData(data: Partial) { + // Get current cached data + const currentData = this.twoFactorAuthComponentCacheService.getCachedData(); + + this.twoFactorAuthComponentCacheService.cacheData({ + token: data?.token ?? currentData?.token ?? "", + remember: data?.remember ?? currentData?.remember ?? false, + selectedProviderType: data?.selectedProviderType ?? currentData?.selectedProviderType, + }); + } + + /** + * Save the remember value to the cache when the checkbox is checked or unchecked + */ + async onRememberChange() { + const rememberValue = !!this.rememberFormControl.value; + await this.saveFormDataWithPartialData({ remember: rememberValue }); + } + + private async initializeSelected2faProviderType(): Promise { const webAuthnSupported = this.platformUtilsService.supportsWebAuthn(this.win); if ( @@ -190,18 +247,19 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { ) { const webAuthn2faResponse = this.activatedRoute.snapshot.paramMap.get("webAuthnResponse"); if (webAuthn2faResponse) { - this.selectedProviderType = TwoFactorProviderType.WebAuthn; - return; + return TwoFactorProviderType.WebAuthn; } } - this.selectedProviderType = await this.twoFactorService.getDefaultProvider(webAuthnSupported); + return await this.twoFactorService.getDefaultProvider(webAuthnSupported); } private async set2faProvidersAndData() { this.twoFactorProviders = await this.twoFactorService.getProviders(); - const providerData = this.twoFactorProviders?.get(this.selectedProviderType); - this.selectedProviderData = providerData; + if (this.selectedProviderType !== undefined) { + const providerData = this.twoFactorProviders?.get(this.selectedProviderType); + this.selectedProviderData = providerData; + } } private listenForAuthnSessionTimeout() { @@ -267,6 +325,13 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { // In all flows but WebAuthn, the remember value is taken from the form. const rememberValue = remember ?? this.rememberFormControl.value ?? false; + // Cache form data before submitting + this.twoFactorAuthComponentCacheService.cacheData({ + token: tokenValue, + remember: rememberValue, + selectedProviderType: this.selectedProviderType, + }); + try { this.formPromise = this.loginStrategyService.logInTwoFactor( new TokenTwoFactorRequest(this.selectedProviderType, tokenValue, rememberValue), @@ -274,6 +339,7 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { ); const authResult: AuthResult = await this.formPromise; this.logService.info("Successfully submitted two factor token"); + await this.handleAuthResult(authResult); } catch { this.logService.error("Error submitting two factor token"); @@ -299,6 +365,13 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { this.selectedProviderType = response.type; await this.setAnonLayoutDataByTwoFactorProviderType(); + // Update the cached provider type when a new one is chosen + this.twoFactorAuthComponentCacheService.cacheData({ + token: "", + remember: false, + selectedProviderType: response.type, + }); + this.form.reset(); this.form.updateValueAndValidity(); } @@ -376,6 +449,9 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { } private async handleAuthResult(authResult: AuthResult) { + // Clear form cache + this.twoFactorAuthComponentCacheService.clearCachedData(); + if (await this.handleMigrateEncryptionKey(authResult)) { return; // stop login process } 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 f7bf2260a36..0d2df969f87 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 @@ -123,7 +123,9 @@ describe("AuthRequestService", () => { }); it("should use the user key if the master key and hash do not exist", async () => { - keyService.getUserKey.mockResolvedValueOnce({ key: new Uint8Array(64) } as UserKey); + keyService.getUserKey.mockResolvedValueOnce( + new SymmetricCryptoKey(new Uint8Array(64)) as UserKey, + ); await sut.approveOrDenyAuthRequest( true, @@ -131,7 +133,7 @@ describe("AuthRequestService", () => { ); expect(encryptService.encapsulateKeyUnsigned).toHaveBeenCalledWith( - { key: new Uint8Array(64) }, + new SymmetricCryptoKey(new Uint8Array(64)), expect.anything(), ); }); 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 fd33f5d2077..5469b121f10 100644 --- a/libs/auth/src/common/services/pin/pin.service.spec.ts +++ b/libs/auth/src/common/services/pin/pin.service.spec.ts @@ -434,7 +434,7 @@ describe("PinService", () => { .fn() .mockResolvedValue(pinKeyEncryptedUserKeyPersistant); sut.makePinKey = jest.fn().mockResolvedValue(mockPinKey); - encryptService.decryptToBytes.mockResolvedValue(mockUserKey.key); + encryptService.decryptToBytes.mockResolvedValue(mockUserKey.toEncoded()); } function mockPinEncryptedKeyDataByPinLockType(pinLockType: PinLockType) { diff --git a/libs/common/src/auth/services/webauthn-login/webauthn-login-prf-key.service.spec.ts b/libs/common/src/auth/services/webauthn-login/webauthn-login-prf-key.service.spec.ts index 614c593048d..eca1f188d85 100644 --- a/libs/common/src/auth/services/webauthn-login/webauthn-login-prf-key.service.spec.ts +++ b/libs/common/src/auth/services/webauthn-login/webauthn-login-prf-key.service.spec.ts @@ -21,7 +21,7 @@ describe("WebAuthnLoginPrfKeyService", () => { const result = await service.createSymmetricKeyFromPrf(randomBytes(32)); - expect(result.key.length).toBe(64); + expect(result.toEncoded().length).toBe(64); }); }); }); diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index e353d79988f..4eabb8ea114 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -17,6 +17,7 @@ export enum FeatureFlag { /* Auth */ PM9112_DeviceApprovalPersistence = "pm-9112-device-approval-persistence", + PM9115_TwoFactorExtensionDataPersistence = "pm-9115-two-factor-extension-data-persistence", /* Autofill */ BlockBrowserInjectionsByDomain = "block-browser-injections-by-domain", @@ -54,7 +55,6 @@ export enum FeatureFlag { PM9111ExtensionPersistAddEditForm = "pm-9111-extension-persist-add-edit-form", NewDeviceVerificationTemporaryDismiss = "new-device-temporary-dismiss", NewDeviceVerificationPermanentDismiss = "new-device-permanent-dismiss", - VaultBulkManagementAction = "vault-bulk-management-action", SecurityTasks = "security-tasks", CipherKeyEncryption = "cipher-key-encryption", PM18520_UpdateDesktopCipherForm = "pm-18520-desktop-cipher-forms", @@ -108,7 +108,6 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.PM9111ExtensionPersistAddEditForm]: FALSE, [FeatureFlag.NewDeviceVerificationTemporaryDismiss]: FALSE, [FeatureFlag.NewDeviceVerificationPermanentDismiss]: FALSE, - [FeatureFlag.VaultBulkManagementAction]: FALSE, [FeatureFlag.SecurityTasks]: FALSE, [FeatureFlag.CipherKeyEncryption]: FALSE, [FeatureFlag.PM18520_UpdateDesktopCipherForm]: FALSE, @@ -116,6 +115,7 @@ export const DefaultFeatureFlagValue = { /* Auth */ [FeatureFlag.PM9112_DeviceApprovalPersistence]: FALSE, + [FeatureFlag.PM9115_TwoFactorExtensionDataPersistence]: FALSE, /* Billing */ [FeatureFlag.TrialPaymentOptional]: FALSE, diff --git a/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts b/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts index f500b8d8668..ac87295496c 100644 --- a/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts @@ -103,7 +103,7 @@ export class EncryptServiceImplementation implements EncryptService { throw new Error("No wrappingKey provided for wrapping."); } - return await this.encryptUint8Array(keyToBeWrapped.key, wrappingKey); + return await this.encryptUint8Array(keyToBeWrapped.toEncoded(), wrappingKey); } async unwrapDecapsulationKey( @@ -166,7 +166,7 @@ export class EncryptServiceImplementation implements EncryptService { } if (this.blockType0) { - if (key.inner().type === EncryptionType.AesCbc256_B64 || key.key.byteLength < 64) { + if (key.inner().type === EncryptionType.AesCbc256_B64) { throw new Error("Type 0 encryption is not supported."); } } @@ -196,7 +196,7 @@ export class EncryptServiceImplementation implements EncryptService { } if (this.blockType0) { - if (key.inner().type === EncryptionType.AesCbc256_B64 || key.key.byteLength < 64) { + if (key.inner().type === EncryptionType.AesCbc256_B64) { throw new Error("Type 0 encryption is not supported."); } } diff --git a/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts index 97a642c639f..d19de6c0414 100644 --- a/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts @@ -58,10 +58,9 @@ describe("EncryptService", () => { it("fails if type 0 key is provided with flag turned on", async () => { (encryptService as any).blockType0 = true; const mock32Key = mock(); - mock32Key.key = makeStaticByteArray(32); mock32Key.inner.mockReturnValue({ type: 0, - encryptionKey: mock32Key.key, + encryptionKey: makeStaticByteArray(32), }); await expect(encryptService.wrapSymmetricKey(mock32Key, mock32Key)).rejects.toThrow( @@ -99,10 +98,9 @@ describe("EncryptService", () => { it("throws if type 0 key is provided with flag turned on", async () => { (encryptService as any).blockType0 = true; const mock32Key = mock(); - mock32Key.key = makeStaticByteArray(32); mock32Key.inner.mockReturnValue({ type: 0, - encryptionKey: mock32Key.key, + encryptionKey: makeStaticByteArray(32), }); await expect( @@ -140,10 +138,9 @@ describe("EncryptService", () => { it("throws if type 0 key is provided with flag turned on", async () => { (encryptService as any).blockType0 = true; const mock32Key = mock(); - mock32Key.key = makeStaticByteArray(32); mock32Key.inner.mockReturnValue({ type: 0, - encryptionKey: mock32Key.key, + encryptionKey: makeStaticByteArray(32), }); await expect( @@ -187,10 +184,9 @@ describe("EncryptService", () => { (encryptService as any).blockType0 = true; const key = new SymmetricCryptoKey(makeStaticByteArray(32)); const mock32Key = mock(); - mock32Key.key = makeStaticByteArray(32); mock32Key.inner.mockReturnValue({ type: 0, - encryptionKey: mock32Key.key, + encryptionKey: makeStaticByteArray(32), }); await expect(encryptService.encrypt(null!, key)).rejects.toThrow( @@ -273,10 +269,9 @@ describe("EncryptService", () => { (encryptService as any).blockType0 = true; const key = new SymmetricCryptoKey(makeStaticByteArray(32)); const mock32Key = mock(); - mock32Key.key = makeStaticByteArray(32); mock32Key.inner.mockReturnValue({ type: 0, - encryptionKey: mock32Key.key, + encryptionKey: makeStaticByteArray(32), }); await expect(encryptService.encryptToBytes(plainValue, key)).rejects.toThrow( @@ -666,7 +661,7 @@ describe("EncryptService", () => { const actual = await encryptService.encapsulateKeyUnsigned(testKey, publicKey); expect(cryptoFunctionService.rsaEncrypt).toBeCalledWith( - expect.toEqualBuffer(testKey.key), + expect.toEqualBuffer(testKey.toEncoded()), expect.toEqualBuffer(publicKey), "sha1", ); @@ -717,7 +712,7 @@ describe("EncryptService", () => { "sha1", ); - expect(actual.key).toEqualBuffer(data); + expect(actual.toEncoded()).toEqualBuffer(data); }); }); }); diff --git a/libs/common/src/key-management/device-trust/services/device-trust.service.implementation.ts b/libs/common/src/key-management/device-trust/services/device-trust.service.implementation.ts index 205f332d0f9..06999cab9c3 100644 --- a/libs/common/src/key-management/device-trust/services/device-trust.service.implementation.ts +++ b/libs/common/src/key-management/device-trust/services/device-trust.service.implementation.ts @@ -221,8 +221,8 @@ export class DeviceTrustService implements DeviceTrustServiceAbstraction { } const newEncryptedPublicKey = await this.encryptService.encrypt(publicKey, newUserKey); - const newEncryptedUserKey = await this.encryptService.rsaEncrypt( - newUserKey.key, + const newEncryptedUserKey = await this.encryptService.encapsulateKeyUnsigned( + newUserKey, publicKey, ); diff --git a/libs/common/src/key-management/device-trust/services/device-trust.service.spec.ts b/libs/common/src/key-management/device-trust/services/device-trust.service.spec.ts index e78fc01b694..7d4a25c1f08 100644 --- a/libs/common/src/key-management/device-trust/services/device-trust.service.spec.ts +++ b/libs/common/src/key-management/device-trust/services/device-trust.service.spec.ts @@ -450,7 +450,7 @@ describe("deviceTrustService", () => { // RsaEncrypt must be called w/ a user key array buffer of 64 bytes const userKey = cryptoSvcRsaEncryptSpy.mock.calls[0][0]; - expect(userKey.key.byteLength).toBe(64); + expect(userKey.inner().type).toBe(EncryptionType.AesCbc256_HmacSha256_B64); expect(encryptServiceWrapDecapsulationKeySpy).toHaveBeenCalledTimes(1); expect(encryptServiceWrapEncapsulationKeySpy).toHaveBeenCalledTimes(1); @@ -706,7 +706,9 @@ describe("deviceTrustService", () => { ); encryptService.decryptToBytes.mockResolvedValue(null); encryptService.encrypt.mockResolvedValue(new EncString("test_encrypted_data")); - encryptService.rsaEncrypt.mockResolvedValue(new EncString("test_encrypted_data")); + encryptService.encapsulateKeyUnsigned.mockResolvedValue( + new EncString("test_encrypted_data"), + ); const protectedDeviceResponse = new ProtectedDeviceResponse({ id: "id", @@ -861,8 +863,8 @@ describe("deviceTrustService", () => { // Mock the decryption of the public key with the old user key encryptService.decryptToBytes.mockImplementationOnce((_encValue, privateKeyValue) => { - expect(privateKeyValue.key.byteLength).toBe(64); - expect(new Uint8Array(privateKeyValue.key)[0]).toBe(FakeOldUserKeyMarker); + expect(privateKeyValue.inner().type).toBe(EncryptionType.AesCbc256_HmacSha256_B64); + expect(new Uint8Array(privateKeyValue.toEncoded())[0]).toBe(FakeOldUserKeyMarker); const data = new Uint8Array(250); data.fill(FakeDecryptedPublicKeyMarker, 0, 1); return Promise.resolve(data); @@ -870,8 +872,8 @@ describe("deviceTrustService", () => { // Mock the encryption of the new user key with the decrypted public key encryptService.encapsulateKeyUnsigned.mockImplementationOnce((data, publicKey) => { - expect(data.key.byteLength).toBe(64); // New key should also be 64 bytes - expect(new Uint8Array(data.key)[0]).toBe(FakeNewUserKeyMarker); // New key should have the first byte be '1'; + expect(data.inner().type).toBe(EncryptionType.AesCbc256_HmacSha256_B64); // New key should also be 64 bytes + expect(new Uint8Array(data.toEncoded())[0]).toBe(FakeNewUserKeyMarker); // New key should have the first byte be '1'; expect(new Uint8Array(publicKey)[0]).toBe(FakeDecryptedPublicKeyMarker); return Promise.resolve(new EncString("4.ZW5jcnlwdGVkdXNlcg==")); @@ -882,7 +884,7 @@ describe("deviceTrustService", () => { expect(plainValue).toBeInstanceOf(Uint8Array); expect(new Uint8Array(plainValue as Uint8Array)[0]).toBe(FakeDecryptedPublicKeyMarker); - expect(new Uint8Array(key.key)[0]).toBe(FakeNewUserKeyMarker); + expect(new Uint8Array(key.toEncoded())[0]).toBe(FakeNewUserKeyMarker); return Promise.resolve( new EncString("2.ZW5jcnlwdGVkcHVibGlj|ZW5jcnlwdGVkcHVibGlj|ZW5jcnlwdGVkcHVibGlj"), ); diff --git a/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts b/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts index 6b641ad443a..9246652b4c8 100644 --- a/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts +++ b/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts @@ -19,7 +19,6 @@ describe("SymmetricCryptoKey", () => { const cryptoKey = new SymmetricCryptoKey(key); expect(cryptoKey).toEqual({ - key: key, keyB64: "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", innerKey: { type: EncryptionType.AesCbc256_B64, @@ -33,7 +32,6 @@ describe("SymmetricCryptoKey", () => { const cryptoKey = new SymmetricCryptoKey(key); expect(cryptoKey).toEqual({ - key: key, keyB64: "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw==", innerKey: { diff --git a/libs/common/src/platform/models/domain/symmetric-crypto-key.ts b/libs/common/src/platform/models/domain/symmetric-crypto-key.ts index c85f3432b28..ad16ddd06f6 100644 --- a/libs/common/src/platform/models/domain/symmetric-crypto-key.ts +++ b/libs/common/src/platform/models/domain/symmetric-crypto-key.ts @@ -24,7 +24,6 @@ export type Aes256CbcKey = { export class SymmetricCryptoKey { private innerKey: Aes256CbcHmacKey | Aes256CbcKey; - key: Uint8Array; keyB64: string; /** @@ -40,7 +39,6 @@ export class SymmetricCryptoKey { type: EncryptionType.AesCbc256_B64, encryptionKey: key, }; - this.key = key; this.keyB64 = this.toBase64(); } else if (key.byteLength === 64) { this.innerKey = { @@ -48,7 +46,6 @@ export class SymmetricCryptoKey { encryptionKey: key.slice(0, 32), authenticationKey: key.slice(32), }; - this.key = key; this.keyB64 = this.toBase64(); } else { throw new Error(`Unsupported encType/key length ${key.byteLength}`); diff --git a/libs/common/src/platform/services/key-generation.service.spec.ts b/libs/common/src/platform/services/key-generation.service.spec.ts index a2597414d0e..f75eaeb25be 100644 --- a/libs/common/src/platform/services/key-generation.service.spec.ts +++ b/libs/common/src/platform/services/key-generation.service.spec.ts @@ -4,6 +4,7 @@ import { PBKDF2KdfConfig, Argon2KdfConfig } from "@bitwarden/key-management"; import { CryptoFunctionService } from "../../key-management/crypto/abstractions/crypto-function.service"; import { CsprngArray } from "../../types/csprng"; +import { EncryptionType } from "../enums"; import { KeyGenerationService } from "./key-generation.service"; @@ -52,7 +53,7 @@ describe("KeyGenerationService", () => { expect(salt).toEqual(inputSalt); expect(material).toEqual(inputMaterial); - expect(derivedKey.key.length).toEqual(64); + expect(derivedKey.inner().type).toEqual(EncryptionType.AesCbc256_HmacSha256_B64); }, ); }); @@ -67,7 +68,7 @@ describe("KeyGenerationService", () => { const key = await sut.deriveKeyFromMaterial(material, salt, purpose); - expect(key.key.length).toEqual(64); + expect(key.inner().type).toEqual(EncryptionType.AesCbc256_HmacSha256_B64); }); }); @@ -81,7 +82,7 @@ describe("KeyGenerationService", () => { const key = await sut.deriveKeyFromPassword(password, salt, kdfConfig); - expect(key.key.length).toEqual(32); + expect(key.inner().type).toEqual(EncryptionType.AesCbc256_B64); }); it("should derive a 32 byte key from a password using argon2id", async () => { @@ -94,7 +95,7 @@ describe("KeyGenerationService", () => { const key = await sut.deriveKeyFromPassword(password, salt, kdfConfig); - expect(key.key.length).toEqual(32); + expect(key.inner().type).toEqual(EncryptionType.AesCbc256_B64); }); }); }); diff --git a/libs/common/src/platform/services/key-generation.service.ts b/libs/common/src/platform/services/key-generation.service.ts index 6203eaabdd1..8f9e6856aa0 100644 --- a/libs/common/src/platform/services/key-generation.service.ts +++ b/libs/common/src/platform/services/key-generation.service.ts @@ -1,5 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import { MasterKey, PinKey } from "@bitwarden/common/types/key"; import { KdfConfig, PBKDF2KdfConfig, Argon2KdfConfig, KdfType } from "@bitwarden/key-management"; import { CryptoFunctionService } from "../../key-management/crypto/abstractions/crypto-function.service"; @@ -78,10 +79,21 @@ export class KeyGenerationService implements KeyGenerationServiceAbstraction { return new SymmetricCryptoKey(key); } - async stretchKey(key: SymmetricCryptoKey): Promise { + async stretchKey(key: MasterKey | PinKey): Promise { const newKey = new Uint8Array(64); - const encKey = await this.cryptoFunctionService.hkdfExpand(key.key, "enc", 32, "sha256"); - const macKey = await this.cryptoFunctionService.hkdfExpand(key.key, "mac", 32, "sha256"); + // Master key and pin key are always 32 bytes + const encKey = await this.cryptoFunctionService.hkdfExpand( + key.inner().encryptionKey, + "enc", + 32, + "sha256", + ); + const macKey = await this.cryptoFunctionService.hkdfExpand( + key.inner().encryptionKey, + "mac", + 32, + "sha256", + ); newKey.set(new Uint8Array(encKey)); newKey.set(new Uint8Array(macKey), 32); diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index 455be3babea..21f268d84de 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -124,12 +124,8 @@ export class CipherService implements CipherServiceAbstraction { * decryption is in progress. The latest decrypted ciphers will be emitted once decryption is complete. */ cipherViews$ = perUserCache$((userId: UserId): Observable => { - return combineLatest([ - this.encryptedCiphersState(userId).state$, - this.localData$(userId), - this.keyService.cipherDecryptionKeys$(userId, true), - ]).pipe( - filter(([ciphers, keys]) => ciphers != null && keys != null), // Skip if ciphers haven't been loaded yor synced yet + return combineLatest([this.encryptedCiphersState(userId).state$, this.localData$(userId)]).pipe( + filter(([ciphers]) => ciphers != null), // Skip if ciphers haven't been loaded yor synced yet switchMap(() => this.getAllDecrypted(userId)), ); }, this.clearCipherViewsForUser$); diff --git a/libs/components/src/button/button.component.ts b/libs/components/src/button/button.component.ts index 0b4ce3073c3..19618938c42 100644 --- a/libs/components/src/button/button.component.ts +++ b/libs/components/src/button/button.component.ts @@ -1,12 +1,10 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { coerceBooleanProperty } from "@angular/cdk/coercion"; import { NgClass } from "@angular/common"; -import { Input, HostBinding, Component, model, computed } from "@angular/core"; +import { Input, HostBinding, Component, model, computed, input } from "@angular/core"; import { toObservable, toSignal } from "@angular/core/rxjs-interop"; import { debounce, interval } from "rxjs"; -import { ButtonLikeAbstraction, ButtonType } from "../shared/button-like.abstraction"; +import { ButtonLikeAbstraction, ButtonType, ButtonSize } from "../shared/button-like.abstraction"; const focusRing = [ "focus-visible:tw-ring-2", @@ -15,6 +13,11 @@ const focusRing = [ "focus-visible:tw-z-10", ]; +const buttonSizeStyles: Record = { + small: ["tw-py-1", "tw-px-3", "tw-text-sm"], + default: ["tw-py-1.5", "tw-px-3"], +}; + const buttonStyles: Record = { primary: [ "tw-border-primary-600", @@ -59,8 +62,6 @@ export class ButtonComponent implements ButtonLikeAbstraction { @HostBinding("class") get classList() { return [ "tw-font-semibold", - "tw-py-1.5", - "tw-px-3", "tw-rounded-full", "tw-transition", "tw-border-2", @@ -85,7 +86,8 @@ export class ButtonComponent implements ButtonLikeAbstraction { "disabled:hover:tw-no-underline", ] : [], - ); + ) + .concat(buttonSizeStyles[this.size() || "default"]); } protected disabledAttr = computed(() => { @@ -105,7 +107,9 @@ export class ButtonComponent implements ButtonLikeAbstraction { return this.showLoadingStyle() || (this.disabledAttr() && this.loading() === false); }); - @Input() buttonType: ButtonType; + @Input() buttonType: ButtonType = "secondary"; + + size = input("default"); private _block = false; diff --git a/libs/components/src/button/button.stories.ts b/libs/components/src/button/button.stories.ts index 448e290cce8..759bd1a352c 100644 --- a/libs/components/src/button/button.stories.ts +++ b/libs/components/src/button/button.stories.ts @@ -9,6 +9,13 @@ export default { buttonType: "primary", disabled: false, loading: false, + size: "default", + }, + argTypes: { + size: { + options: ["small", "default"], + control: { type: "radio" }, + }, }, parameters: { design: { @@ -24,19 +31,19 @@ export const Primary: Story = { render: (args) => ({ props: args, template: /*html*/ ` -
- - - - - +
+ + + + +
-
- Anchor - Anchor:hover - Anchor:focus-visible - Anchor:hover:focus-visible - Anchor:active + `, }), @@ -59,6 +66,22 @@ export const Danger: Story = { }, }; +export const Small: Story = { + render: (args) => ({ + props: args, + template: /*html*/ ` +
+ + + +
+ `, + }), + args: { + size: "small", + }, +}; + export const Loading: Story = { render: (args) => ({ props: args, diff --git a/libs/components/src/shared/button-like.abstraction.ts b/libs/components/src/shared/button-like.abstraction.ts index 5ee9d272594..c7cb620bff0 100644 --- a/libs/components/src/shared/button-like.abstraction.ts +++ b/libs/components/src/shared/button-like.abstraction.ts @@ -4,6 +4,8 @@ import { ModelSignal } from "@angular/core"; // @ts-strict-ignore export type ButtonType = "primary" | "secondary" | "danger" | "unstyled"; +export type ButtonSize = "default" | "small"; + export abstract class ButtonLikeAbstraction { loading: ModelSignal; disabled: ModelSignal; diff --git a/libs/key-management/src/key.service.spec.ts b/libs/key-management/src/key.service.spec.ts index 90d049b7293..57291462924 100644 --- a/libs/key-management/src/key.service.spec.ts +++ b/libs/key-management/src/key.service.spec.ts @@ -497,7 +497,7 @@ describe("keyService", () => { const output = new Uint8Array(64); output.set(encryptedPrivateKey.dataBytes); output.set( - key.key.subarray(0, 64 - encryptedPrivateKey.dataBytes.length), + key.toEncoded().subarray(0, 64 - encryptedPrivateKey.dataBytes.length), encryptedPrivateKey.dataBytes.length, ); return output; @@ -827,7 +827,7 @@ describe("keyService", () => { masterPasswordService.masterKeyHashSubject.next(storedMasterKeyHash); cryptoFunctionService.pbkdf2 - .calledWith(masterKey.key, masterPassword as string, "sha256", 2) + .calledWith(masterKey.inner().encryptionKey, masterPassword as string, "sha256", 2) .mockResolvedValue(Utils.fromB64ToArray(mockReturnedHash)); const actualDidMatch = await keyService.compareKeyHash( diff --git a/libs/key-management/src/key.service.ts b/libs/key-management/src/key.service.ts index 5dec206b86b..a3b6a1fa2d1 100644 --- a/libs/key-management/src/key.service.ts +++ b/libs/key-management/src/key.service.ts @@ -26,7 +26,7 @@ import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/ke 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 { KeySuffixOptions, HashPurpose } from "@bitwarden/common/platform/enums"; +import { KeySuffixOptions, HashPurpose, EncryptionType } from "@bitwarden/common/platform/enums"; import { convertValues } from "@bitwarden/common/platform/misc/convert-values"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EFFLongWordList } from "@bitwarden/common/platform/misc/wordlist"; @@ -346,7 +346,12 @@ export class DefaultKeyService implements KeyServiceAbstraction { } const iterations = hashPurpose === HashPurpose.LocalAuthorization ? 2 : 1; - const hash = await this.cryptoFunctionService.pbkdf2(key.key, password, "sha256", iterations); + const hash = await this.cryptoFunctionService.pbkdf2( + key.inner().encryptionKey, + password, + "sha256", + iterations, + ); return Utils.fromBufferToB64(hash); } @@ -823,13 +828,13 @@ export class DefaultKeyService implements KeyServiceAbstraction { newSymKey: SymmetricCryptoKey, ): Promise<[T, EncString]> { let protectedSymKey: EncString; - if (encryptionKey.key.byteLength === 32) { + if (encryptionKey.inner().type === EncryptionType.AesCbc256_B64) { const stretchedEncryptionKey = await this.keyGenerationService.stretchKey(encryptionKey); protectedSymKey = await this.encryptService.wrapSymmetricKey( newSymKey, stretchedEncryptionKey, ); - } else if (encryptionKey.key.byteLength === 64) { + } else if (encryptionKey.inner().type === EncryptionType.AesCbc256_HmacSha256_B64) { protectedSymKey = await this.encryptService.wrapSymmetricKey(newSymKey, encryptionKey); } else { throw new Error("Invalid key size."); diff --git a/package-lock.json b/package-lock.json index 3e16fd7ba68..4e08a6df9a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", "jquery": "3.7.1", - "jsdom": "26.0.0", + "jsdom": "26.1.0", "jszip": "3.10.1", "koa": "2.16.1", "koa-bodyparser": "4.4.1", @@ -208,7 +208,7 @@ "form-data": "4.0.1", "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", - "jsdom": "26.0.0", + "jsdom": "26.1.0", "jszip": "3.10.1", "koa": "2.16.1", "koa-bodyparser": "4.4.1", @@ -24463,15 +24463,14 @@ } }, "node_modules/jsdom": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", - "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "license": "MIT", "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.1", + "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", @@ -24481,12 +24480,12 @@ "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", + "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.0", + "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, @@ -24525,9 +24524,9 @@ } }, "node_modules/jsdom/node_modules/tough-cookie": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", - "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "license": "BSD-3-Clause", "dependencies": { "tldts": "^6.1.32" diff --git a/package.json b/package.json index c78decb9827..861559b2b66 100644 --- a/package.json +++ b/package.json @@ -178,7 +178,7 @@ "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", "jquery": "3.7.1", - "jsdom": "26.0.0", + "jsdom": "26.1.0", "jszip": "3.10.1", "koa": "2.16.1", "koa-bodyparser": "4.4.1",