Merge branch 'main' into auth/pm-8111/browser-refresh-login-component

This commit is contained in:
rr-bw 2024-09-07 12:45:18 -07:00
commit d279ae499d
No known key found for this signature in database
GPG Key ID: 3FA13C3ADEE51D5D
194 changed files with 5670 additions and 1594 deletions

View File

@ -2,7 +2,6 @@
"devFlags": {}, "devFlags": {},
"flags": { "flags": {
"showPasswordless": true, "showPasswordless": true,
"enableCipherKeyEncryption": false,
"accountSwitching": false "accountSwitching": false
} }
} }

View File

@ -7,7 +7,6 @@
}, },
"flags": { "flags": {
"showPasswordless": true, "showPasswordless": true,
"enableCipherKeyEncryption": false,
"accountSwitching": true "accountSwitching": true
} }
} }

View File

@ -1,6 +1,5 @@
{ {
"flags": { "flags": {
"enableCipherKeyEncryption": false,
"accountSwitching": true "accountSwitching": true
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "تأكيد" "message": "تأكيد"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -684,10 +684,10 @@
"message": "Yeni hesabınız yaradıldı! İndi giriş edə bilərsiniz." "message": "Yeni hesabınız yaradıldı! İndi giriş edə bilərsiniz."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Yeni hesabınız yaradıldı!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Giriş etdiniz!"
}, },
"youSuccessfullyLoggedIn": { "youSuccessfullyLoggedIn": {
"message": "Uğurla giriş etdiniz" "message": "Uğurla giriş etdiniz"
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Başladan saytın tələb etdiyi doğrulama. Bu özəllik, hələlik ana parolu olmayan hesablara tətbiq olunmur." "message": "Başladan saytın tələb etdiyi doğrulama. Bu özəllik, hələlik ana parolu olmayan hesablara tətbiq olunmur."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Keçid açarı ilə giriş edilsin?" "message": "Keçid açarı ilə giriş edilsin?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Bu sayt üçün uyuşan bir giriş məlumatınız yoxdur." "message": "Bu sayt üçün uyuşan bir giriş məlumatınız yoxdur."
}, },
"noMatchingLoginsForSite": {
"message": "Bu sayt üçün uyuşan giriş məlumatı yoxdur"
},
"confirm": { "confirm": {
"message": "Təsdiqlə" "message": "Təsdiqlə"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Keçid açarını yeni bir giriş olaraq saxla" "message": "Keçid açarını yeni bir giriş olaraq saxla"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Bu keçid açarını saxlayacaq bir giriş seçin" "message": "Bu keçid açarını saxlayacaq bir giriş seçin"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Giriş ediləcək keçid açarını seçin"
},
"passkeyItem": { "passkeyItem": {
"message": "Keçid açarı elementi" "message": "Keçid açarı elementi"
}, },
@ -4295,6 +4301,27 @@
"message": "Müəssisə siyasət tələbləri bu ayara tətbiq edildi" "message": "Müəssisə siyasət tələbləri bu ayara tətbiq edildi"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Əlavə məzmun əlçatandır"
},
"itemsInTrash": {
"message": "Tullantıdakı elementlər"
},
"noItemsInTrash": {
"message": "Tullantıda element yoxdur"
},
"noItemsInTrashDesc": {
"message": "Sildiyiniz elementlər burada görünəcək və 30 gün sonra birdəfəlik silinəcək"
},
"trashWarning": {
"message": "Tullantıda 30 gündən çox qalan elementlər avtomatik silinəcək"
},
"restore": {
"message": "Bərpa et"
},
"deleteForever": {
"message": "Həmişəlik sil"
},
"noEditPermissions": {
"message": "Bu elementə düzəliş etmə icazəniz yoxdur"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Пацвердзіць" "message": "Пацвердзіць"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Изисква се проверка от иницииращия сайт. Тази функция все още не е внедрена за акаунти без главна парола." "message": "Изисква се проверка от иницииращия сайт. Тази функция все още не е внедрена за акаунти без главна парола."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Вписване със секретен ключ?" "message": "Вписване със секретен ключ?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Нямате елемент за вписване, подходящ за този уеб сайт." "message": "Нямате елемент за вписване, подходящ за този уеб сайт."
}, },
"noMatchingLoginsForSite": {
"message": "Няма записи за вписване отговарящи на този уеб сайт"
},
"confirm": { "confirm": {
"message": "Потвърждаване" "message": "Потвърждаване"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Запазване на секретния ключ като нов елемент за вписване" "message": "Запазване на секретния ключ като нов елемент за вписване"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Изберете елемент, в който да запазите този секретен ключ" "message": "Изберете елемент, в който да запазите този секретен ключ"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Изберете секретен ключ, с който да се впишете"
},
"passkeyItem": { "passkeyItem": {
"message": "Секретен ключ" "message": "Секретен ключ"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Има налично допълнително съдържание" "message": "Има налично допълнително съдържание"
},
"itemsInTrash": {
"message": "Елементи в кошчето"
},
"noItemsInTrash": {
"message": "Няма елементи в кошчето"
},
"noItemsInTrashDesc": {
"message": "Елементите, които изтривате, ще бъдат премествани тук и изтривани окончателно след 30 дни"
},
"trashWarning": {
"message": "Елементите, които са били в кошчето за повече от 30 дни, ще бъдат изтривани автоматично"
},
"restore": {
"message": "Възстановяване"
},
"deleteForever": {
"message": "Изтриване завинаги"
},
"noEditPermissions": {
"message": "Нямате право за редактиране на този елемент"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verificació requerida pel lloc iniciador. Aquesta funció encara no s'ha implementat per als comptes sense contrasenya mestra." "message": "Verificació requerida pel lloc iniciador. Aquesta funció encara no s'ha implementat per als comptes sense contrasenya mestra."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Inici de sessió amb clau de pas?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Ja hi ha una clau de pas per a aquesta aplicació." "message": "Ja hi ha una clau de pas per a aquesta aplicació."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "No teniu cap inici de sessió que coincidisca amb el d'aquest lloc." "message": "No teniu cap inici de sessió que coincidisca amb el d'aquest lloc."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirma-ho" "message": "Confirma-ho"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Guarda la clau de pas com a nou inici de sessió" "message": "Guarda la clau de pas com a nou inici de sessió"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Trieu un inici de sessió per guardar aquesta clau de pas" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Element de clau de pas" "message": "Element de clau de pas"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Ověření vyžadované iniciátorem webu. Tato funkce ještě není implementována pro účty bez hlavního hesla." "message": "Ověření vyžadované iniciátorem webu. Tato funkce ještě není implementována pro účty bez hlavního hesla."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Přihlásit se pomocí přístupového klíče?" "message": "Přihlásit se pomocí přístupového klíče?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Pro tuto stránku nemáte žádné přihlašovací údaje." "message": "Pro tuto stránku nemáte žádné přihlašovací údaje."
}, },
"noMatchingLoginsForSite": {
"message": "Žádné odpovídající přihlašovací údaje pro tento web"
},
"confirm": { "confirm": {
"message": "Potvrdit" "message": "Potvrdit"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Uložit přístupový klíč jako nové přihlášení" "message": "Uložit přístupový klíč jako nové přihlášení"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Vyberte přihlášení pro uložení tohoto přístupového klíče" "message": "Vyberte přihlášení pro uložení tohoto přístupového klíče"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Vyberte přístupový klíč, kterým se chcete přihlásit"
},
"passkeyItem": { "passkeyItem": {
"message": "Položka přístupového klíče" "message": "Položka přístupového klíče"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Je k dispozici další obsah" "message": "Je k dispozici další obsah"
},
"itemsInTrash": {
"message": "Položky v koši"
},
"noItemsInTrash": {
"message": "Žádné položky v koši"
},
"noItemsInTrashDesc": {
"message": "Položky, které smažete, se zde zobrazí a budou trvale smazány po 30 dnech."
},
"trashWarning": {
"message": "Položky, které byly v koši déle než 30 dní, budou automaticky smazány."
},
"restore": {
"message": "Obnovit"
},
"deleteForever": {
"message": "Smazat navždy"
},
"noEditPermissions": {
"message": "Nemáte oprávnění upravit tuto položku"
} }
} }

View File

@ -260,7 +260,7 @@
"message": "Bitwarden for Business" "message": "Bitwarden for Business"
}, },
"bitwardenAuthenticator": { "bitwardenAuthenticator": {
"message": "Bitwarden Authenticator" "message": "Dilyswr Bitwarden"
}, },
"continueToAuthenticatorPageDesc": { "continueToAuthenticatorPageDesc": {
"message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website"
@ -302,7 +302,7 @@
"message": "Golygu ffolder" "message": "Golygu ffolder"
}, },
"newFolder": { "newFolder": {
"message": "New folder" "message": "Ffolder newydd"
}, },
"folderName": { "folderName": {
"message": "Folder name" "message": "Folder name"
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Cadarnhau" "message": "Cadarnhau"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -2237,7 +2237,7 @@
"message": "Kodeordsbeskyttet" "message": "Kodeordsbeskyttet"
}, },
"copyLink": { "copyLink": {
"message": "Copy link" "message": "Kopier link"
}, },
"copySendLink": { "copySendLink": {
"message": "Kopiér Send link", "message": "Kopiér Send link",
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Bekræftelse krævet af startwebstedet. Denne funktion er endnu ikke implementeret for konti uden hovedadgangskode." "message": "Bekræftelse krævet af startwebstedet. Denne funktion er endnu ikke implementeret for konti uden hovedadgangskode."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log ind med adgangsnøgle?" "message": "Log ind med adgangsnøgle?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Der er intet matchende login til dette websted." "message": "Der er intet matchende login til dette websted."
}, },
"noMatchingLoginsForSite": {
"message": "Ingen matchende logins for dette websted"
},
"confirm": { "confirm": {
"message": "Bekræft" "message": "Bekræft"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Gem adgangsnøgle som nyt login" "message": "Gem adgangsnøgle som nyt login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Vælg et login at gemme denne adgangsnøgle til" "message": "Vælg et login at gemme denne adgangsnøgle til"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Vælg en adgangsnøgle at logge ind med"
},
"passkeyItem": { "passkeyItem": {
"message": "Adgangsnøgleemne" "message": "Adgangsnøgleemne"
}, },
@ -4032,7 +4038,7 @@
} }
}, },
"autoFillOnPageLoad": { "autoFillOnPageLoad": {
"message": "Autofill on page load?" "message": "Autoudfyld ved sideindlæsning?"
}, },
"cardExpiredTitle": { "cardExpiredTitle": {
"message": "Udløbet kort" "message": "Udløbet kort"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Yderligere indhold er tilgængeligt" "message": "Yderligere indhold er tilgængeligt"
},
"itemsInTrash": {
"message": "Emner i papirkurv"
},
"noItemsInTrash": {
"message": "Ingen emner i papirkurv"
},
"noItemsInTrashDesc": {
"message": "Emner, som slettes, vil fremgå her og slettes permanent efter 30 dage"
},
"trashWarning": {
"message": "Emner, som har været i papirkurven i over 30 dage, slettes automatisk"
},
"restore": {
"message": "Gendan"
},
"deleteForever": {
"message": "Slet permanent"
},
"noEditPermissions": {
"message": "Ingen tilladelse til at redigere dette emne"
} }
} }

View File

@ -404,7 +404,7 @@
"description": "Card header for password generator include block" "description": "Card header for password generator include block"
}, },
"uppercaseDescription": { "uppercaseDescription": {
"message": "Großbuchstaben verwenden", "message": "Großbuchstaben einschließen",
"description": "Tooltip for the password generator uppercase character checkbox" "description": "Tooltip for the password generator uppercase character checkbox"
}, },
"uppercaseLabel": { "uppercaseLabel": {
@ -412,7 +412,7 @@
"description": "Label for the password generator uppercase character checkbox" "description": "Label for the password generator uppercase character checkbox"
}, },
"lowercaseDescription": { "lowercaseDescription": {
"message": "Kleinbuchstaben verwenden", "message": "Kleinbuchstaben einschließen",
"description": "Full description for the password generator lowercase character checkbox" "description": "Full description for the password generator lowercase character checkbox"
}, },
"lowercaseLabel": { "lowercaseLabel": {
@ -420,7 +420,7 @@
"description": "Label for the password generator lowercase character checkbox" "description": "Label for the password generator lowercase character checkbox"
}, },
"numbersDescription": { "numbersDescription": {
"message": "Ziffern verwenden", "message": "Ziffern einschließen",
"description": "Full description for the password generator numbers checkbox" "description": "Full description for the password generator numbers checkbox"
}, },
"numbersLabel": { "numbersLabel": {
@ -428,7 +428,7 @@
"description": "Label for the password generator numbers checkbox" "description": "Label for the password generator numbers checkbox"
}, },
"specialCharactersDescription": { "specialCharactersDescription": {
"message": "Sonderzeichen verwenden", "message": "Sonderzeichen einschließen",
"description": "Full description for the password generator special characters checkbox" "description": "Full description for the password generator special characters checkbox"
}, },
"specialCharactersLabel": { "specialCharactersLabel": {
@ -718,7 +718,7 @@
} }
}, },
"autofillError": { "autofillError": {
"message": "Die Felder dieser Seite konnten nicht automatisch ausgefüllt werden. Bitte Nutzernamen und/oder Passwort manuell kopieren." "message": "Die Felder dieser Seite konnten nicht automatisch ausgefüllt werden. Kopiere die Informationen und füge sie manuell ein."
}, },
"totpCaptureError": { "totpCaptureError": {
"message": "QR-Code kann nicht von der aktuellen Webseite gescannt werden" "message": "QR-Code kann nicht von der aktuellen Webseite gescannt werden"
@ -958,7 +958,7 @@
"description": "Default URI match detection for autofill." "description": "Default URI match detection for autofill."
}, },
"defaultUriMatchDetectionDesc": { "defaultUriMatchDetectionDesc": {
"message": "Wählen Sie die Standardmethode, mit der die URI-Match-Erkennung für Anmeldungen bei Aktionen wie dem automatischen Ausfüllen behandelt wird." "message": "Wähle die Standardmethode, mit der die URI-Match-Erkennung für Anmeldungen bei Aktionen wie dem automatischen Ausfüllen behandelt wird."
}, },
"theme": { "theme": {
"message": "Design" "message": "Design"
@ -3202,7 +3202,7 @@
"description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load."
}, },
"autofillOnPageLoadSetToDefault": { "autofillOnPageLoadSetToDefault": {
"message": "Auto-Ausfüllen beim Lader einer Seite wurde auf die Standardeinstellung gesetzt.", "message": "Auto-Ausfüllen beim Laden einer Seite wurde auf die Standardeinstellung gesetzt.",
"description": "Toast message for informing the user that autofill on page load has been set to the default setting." "description": "Toast message for informing the user that autofill on page load has been set to the default setting."
}, },
"turnOffMasterPasswordPromptToEditField": { "turnOffMasterPasswordPromptToEditField": {
@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Überprüfung durch die initiierende Website erforderlich. Diese Funktion ist noch nicht für Konten ohne Master-Passwort implementiert." "message": "Überprüfung durch die initiierende Website erforderlich. Diese Funktion ist noch nicht für Konten ohne Master-Passwort implementiert."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Mit Passkey anmelden?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Für diese Anwendung existiert bereits ein Passkey." "message": "Für diese Anwendung existiert bereits ein Passkey."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Du hast keinen passenden Zugangsdaten für diese Website." "message": "Du hast keinen passenden Zugangsdaten für diese Website."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Bestätigen" "message": "Bestätigen"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Passkey als neue Zugangsdaten speichern" "message": "Passkey als neue Zugangsdaten speichern"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Wähle Zugangsdaten aus, in die dieser Passkey gespeichert werden sollen" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Passkey-Eintrag" "message": "Passkey-Eintrag"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Zusätzlicher Inhalt ist verfügbar" "message": "Zusätzlicher Inhalt ist verfügbar"
},
"itemsInTrash": {
"message": "Einträge im Papierkorb"
},
"noItemsInTrash": {
"message": "Keine Einträge im Papierkorb"
},
"noItemsInTrashDesc": {
"message": "Einträge, die du löschst, erscheinen hier und werden nach 30 Tagen dauerhaft gelöscht"
},
"trashWarning": {
"message": "Einträge, die länger als 30 Tage im Papierkorb waren, werden automatisch gelöscht"
},
"restore": {
"message": "Wiederherstellen"
},
"deleteForever": {
"message": "Dauerhaft löschen"
},
"noEditPermissions": {
"message": "Du bist nicht berechtigt, diesen Eintrag zu bearbeiten"
} }
} }

View File

@ -308,7 +308,7 @@
"message": "Όνομα φακέλου" "message": "Όνομα φακέλου"
}, },
"folderHintText": { "folderHintText": {
"message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" "message": "Φωλιάστε έναν φάκελο προσθέτοντας το όνομα του γονικού φακέλου ακολουθούμενο από ένα \"/\". Παράδειγμα: Κοινωνικά/Φόρουμ"
}, },
"noFoldersAdded": { "noFoldersAdded": {
"message": "Δεν προστέθηκαν φάκελοι" "message": "Δεν προστέθηκαν φάκελοι"
@ -400,11 +400,11 @@
"description": "deprecated. Use specialCharactersLabel instead." "description": "deprecated. Use specialCharactersLabel instead."
}, },
"include": { "include": {
"message": "Include", "message": "Συμπερίληψη",
"description": "Card header for password generator include block" "description": "Card header for password generator include block"
}, },
"uppercaseDescription": { "uppercaseDescription": {
"message": "Include uppercase characters", "message": "Συμπερίληψη κεφαλαίων χαρακτήρων",
"description": "Tooltip for the password generator uppercase character checkbox" "description": "Tooltip for the password generator uppercase character checkbox"
}, },
"uppercaseLabel": { "uppercaseLabel": {
@ -412,7 +412,7 @@
"description": "Label for the password generator uppercase character checkbox" "description": "Label for the password generator uppercase character checkbox"
}, },
"lowercaseDescription": { "lowercaseDescription": {
"message": "Include lowercase characters", "message": "Συμπερίληψη πεζών χαρακτήρων",
"description": "Full description for the password generator lowercase character checkbox" "description": "Full description for the password generator lowercase character checkbox"
}, },
"lowercaseLabel": { "lowercaseLabel": {
@ -420,7 +420,7 @@
"description": "Label for the password generator lowercase character checkbox" "description": "Label for the password generator lowercase character checkbox"
}, },
"numbersDescription": { "numbersDescription": {
"message": "Include numbers", "message": "Συμπερίληψη αριθμών",
"description": "Full description for the password generator numbers checkbox" "description": "Full description for the password generator numbers checkbox"
}, },
"numbersLabel": { "numbersLabel": {
@ -428,7 +428,7 @@
"description": "Label for the password generator numbers checkbox" "description": "Label for the password generator numbers checkbox"
}, },
"specialCharactersDescription": { "specialCharactersDescription": {
"message": "Include special characters", "message": "Συμπερίληψη ειδικών χαρακτήρων",
"description": "Full description for the password generator special characters checkbox" "description": "Full description for the password generator special characters checkbox"
}, },
"specialCharactersLabel": { "specialCharactersLabel": {
@ -459,7 +459,7 @@
"description": "deprecated. Use avoidAmbiguous instead." "description": "deprecated. Use avoidAmbiguous instead."
}, },
"avoidAmbiguous": { "avoidAmbiguous": {
"message": "Avoid ambiguous characters", "message": "Αποφυγή αμφιλεγόμενων χαρακτήρων",
"description": "Label for the avoid ambiguous characters checkbox." "description": "Label for the avoid ambiguous characters checkbox."
}, },
"searchVault": { "searchVault": {
@ -684,10 +684,10 @@
"message": "Ο λογαριασμός σας έχει δημιουργηθεί! Τώρα μπορείτε να συνδεθείτε." "message": "Ο λογαριασμός σας έχει δημιουργηθεί! Τώρα μπορείτε να συνδεθείτε."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Ο νέος σας λογαριασμός έχει δημιουργηθεί!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Έχετε συνδεθεί!"
}, },
"youSuccessfullyLoggedIn": { "youSuccessfullyLoggedIn": {
"message": "Έχετε συνδεθεί επιτυχώς" "message": "Έχετε συνδεθεί επιτυχώς"
@ -1009,7 +1009,7 @@
"message": "Τύπος εξαγωγής" "message": "Τύπος εξαγωγής"
}, },
"accountRestricted": { "accountRestricted": {
"message": "Ο λογαριασμός περιορίστηκε" "message": "Περιορισμένο στο λογαριασμό"
}, },
"filePasswordAndConfirmFilePasswordDoNotMatch": { "filePasswordAndConfirmFilePasswordDoNotMatch": {
"message": "“Κωδικός πρόσβασης αρχείου” και “Επιβεβαίωση κωδικού πρόσβασης αρχείου“ δεν ταιριάζουν." "message": "“Κωδικός πρόσβασης αρχείου” και “Επιβεβαίωση κωδικού πρόσβασης αρχείου“ δεν ταιριάζουν."
@ -1131,7 +1131,7 @@
"message": "1 GB κρυπτογραφημένο αποθηκευτικό χώρο για συνημμένα αρχεία." "message": "1 GB κρυπτογραφημένο αποθηκευτικό χώρο για συνημμένα αρχεία."
}, },
"premiumSignUpEmergency": { "premiumSignUpEmergency": {
"message": "Emergency access." "message": "Πρόσβαση έκτακτης ανάγκης."
}, },
"premiumSignUpTwoStepOptions": { "premiumSignUpTwoStepOptions": {
"message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey και το Duo." "message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey και το Duo."
@ -1155,7 +1155,7 @@
"message": "Μπορείτε να αγοράσετε συνδρομή Premium στο διαδικτυακό θησαυ/κιο του bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;" "message": "Μπορείτε να αγοράσετε συνδρομή Premium στο διαδικτυακό θησαυ/κιο του bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;"
}, },
"premiumPurchaseAlertV2": { "premiumPurchaseAlertV2": {
"message": "You can purchase Premium from your account settings on the Bitwarden web app." "message": "Μπορείτε να αγοράσετε το Premium από τις ρυθμίσεις του λογαριασμού σας στην διαδικτυακή εφαρμογή Bitwarden."
}, },
"premiumCurrentMember": { "premiumCurrentMember": {
"message": "Είστε Premium μέλος!" "message": "Είστε Premium μέλος!"
@ -1164,7 +1164,7 @@
"message": "Ευχαριστούμε που υποστηρίζετε το Bitwarden." "message": "Ευχαριστούμε που υποστηρίζετε το Bitwarden."
}, },
"premiumFeatures": { "premiumFeatures": {
"message": "Upgrade to Premium and receive:" "message": "Αναβαθμίστε σε Premium και λάβετε:"
}, },
"premiumPrice": { "premiumPrice": {
"message": "Όλα για μόνο $PRICE$ /έτος!", "message": "Όλα για μόνο $PRICE$ /έτος!",
@ -1176,7 +1176,7 @@
} }
}, },
"premiumPriceV2": { "premiumPriceV2": {
"message": "All for just $PRICE$ per year!", "message": "Όλα μόνο για $PRICE$ ανά έτος!",
"placeholders": { "placeholders": {
"price": { "price": {
"content": "$1", "content": "$1",
@ -2135,10 +2135,10 @@
"message": "Παρακαλώ ξεκλειδώστε αυτόν τον χρήστη στην εφαρμογή επιφάνειας εργασίας και προσπαθήστε ξανά." "message": "Παρακαλώ ξεκλειδώστε αυτόν τον χρήστη στην εφαρμογή επιφάνειας εργασίας και προσπαθήστε ξανά."
}, },
"biometricsNotAvailableTitle": { "biometricsNotAvailableTitle": {
"message": "Biometric unlock unavailable" "message": "Μη διαθέσιμο βιομετρικό ξεκλείδωμα"
}, },
"biometricsNotAvailableDesc": { "biometricsNotAvailableDesc": {
"message": "Biometric unlock is currently unavailable. Please try again later." "message": "Το βιομετρικό ξεκλείδωμα δεν είναι διαθέσιμο προς το παρόν. Παρακαλώ προσπαθήστε ξανά αργότερα."
}, },
"biometricsFailedTitle": { "biometricsFailedTitle": {
"message": "Τα βιομετρικά απέτυχαν" "message": "Τα βιομετρικά απέτυχαν"
@ -2371,11 +2371,11 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}, },
"createdSendSuccessfully": { "createdSendSuccessfully": {
"message": "Send created successfully!", "message": "Το Send δημιουργήθηκε επιτυχώς!",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}, },
"sendAvailability": { "sendAvailability": {
"message": "The Send will be available to anyone with the link for the next $DAYS$ days.", "message": "Το Send θα είναι διαθέσιμο σε όποιον έχει τον σύνδεσμο για τις επόμενες $DAYS$ ημέρες.",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.",
"placeholders": { "placeholders": {
"days": { "days": {
@ -2385,7 +2385,7 @@
} }
}, },
"sendLinkCopied": { "sendLinkCopied": {
"message": "Send link copied", "message": "Ο σύνδεσμος Send αντιγράφηκε",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}, },
"editedSend": { "editedSend": {
@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Απαιτείται επαλήθευση από τον ιστότοπο εκκίνησης. Αυτή η λειτουργία δεν έχει ακόμα υλοποιηθεί για λογαριασμούς χωρίς τον κύριο κωδικό πρόσβασης." "message": "Απαιτείται επαλήθευση από τον ιστότοπο εκκίνησης. Αυτή η λειτουργία δεν έχει ακόμα υλοποιηθεί για λογαριασμούς χωρίς τον κύριο κωδικό πρόσβασης."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Σύνδεση με κλειδί πρόσβασης;" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Υπάρχει ήδη ένα κλειδί πρόσβασης για αυτήν την εφαρμογή." "message": "Υπάρχει ήδη ένα κλειδί πρόσβασης για αυτήν την εφαρμογή."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Δεν έχετε στοιχεία σύνδεσης που να συνδυάζονται με αυτόν τον ιστότοπο." "message": "Δεν έχετε στοιχεία σύνδεσης που να συνδυάζονται με αυτόν τον ιστότοπο."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Επιβεβαίωση" "message": "Επιβεβαίωση"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Αποθήκευση κλειδιού πρόσβασης ως νέα σύνδεση" "message": "Αποθήκευση κλειδιού πρόσβασης ως νέα σύνδεση"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Επιλέξτε μια σύνδεση στην οποία θα αποθηκεύσετε αυτό το κλειδί πρόσβασης" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Αντικείμενο κλειδιού πρόσβασης" "message": "Αντικείμενο κλειδιού πρόσβασης"
@ -3697,7 +3703,7 @@
"description": "Notification message for when saving credentials has succeeded." "description": "Notification message for when saving credentials has succeeded."
}, },
"passwordSaved": { "passwordSaved": {
"message": "Password saved!", "message": "Ο κωδικός πρόσβασης αποθηκεύτηκε!",
"description": "Notification message for when saving credentials has succeeded." "description": "Notification message for when saving credentials has succeeded."
}, },
"updateCipherAttemptSuccess": { "updateCipherAttemptSuccess": {
@ -3705,7 +3711,7 @@
"description": "Notification message for when updating credentials has succeeded." "description": "Notification message for when updating credentials has succeeded."
}, },
"passwordUpdated": { "passwordUpdated": {
"message": "Password updated!", "message": "Ο κωδικός πρόσβασης ενημερώθηκε!",
"description": "Notification message for when updating credentials has succeeded." "description": "Notification message for when updating credentials has succeeded."
}, },
"saveCipherAttemptFailed": { "saveCipherAttemptFailed": {
@ -4014,7 +4020,7 @@
} }
}, },
"showMatchDetection": { "showMatchDetection": {
"message": "Show match detection $WEBSITE$", "message": "Εμφάνιση ανιχνεύσεων αντιστοίχισης $WEBSITE$",
"placeholders": { "placeholders": {
"website": { "website": {
"content": "$1", "content": "$1",
@ -4023,7 +4029,7 @@
} }
}, },
"hideMatchDetection": { "hideMatchDetection": {
"message": "Hide match detection $WEBSITE$", "message": "Απόκρυψη ανιχνεύσεων αντιστοίχισης $WEBSITE$",
"placeholders": { "placeholders": {
"website": { "website": {
"content": "$1", "content": "$1",
@ -4035,10 +4041,10 @@
"message": "Αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας;" "message": "Αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας;"
}, },
"cardExpiredTitle": { "cardExpiredTitle": {
"message": "Expired card" "message": "Ληγμένη κάρτα"
}, },
"cardExpiredMessage": { "cardExpiredMessage": {
"message": "If you've renewed it, update the card's information" "message": "Εάν την ανανεώσατε, ενημερώστε τα στοιχεία της κάρτας"
}, },
"cardDetails": { "cardDetails": {
"message": "Στοιχεία κάρτας" "message": "Στοιχεία κάρτας"
@ -4053,7 +4059,7 @@
} }
}, },
"enableAnimations": { "enableAnimations": {
"message": "Enable animations" "message": "Ενεργοποίηση κινούμενων εικόνων"
}, },
"addAccount": { "addAccount": {
"message": "Προσθήκη λογαριασμού" "message": "Προσθήκη λογαριασμού"
@ -4295,6 +4301,27 @@
"message": "Οι απαιτήσεις της πολιτικής για επιχειρήσεις έχουν εφαρμοστεί σε αυτήν τη ρύθμιση" "message": "Οι απαιτήσεις της πολιτικής για επιχειρήσεις έχουν εφαρμοστεί σε αυτήν τη ρύθμιση"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Πρόσθετο περιεχόμενο είναι διαθέσιμο"
},
"itemsInTrash": {
"message": "Αντικείμενα στον κάδο"
},
"noItemsInTrash": {
"message": "Κανένα αντικείμενο στον κάδο"
},
"noItemsInTrashDesc": {
"message": "Τα αντικείμενα που διαγράφετε θα εμφανιστούν εδώ και θα διαγραφούν οριστικά μετά από 30 ημέρες"
},
"trashWarning": {
"message": "Αντικείμενα που βρίσκονται στον κάδο για περισσότερο από 30 ημέρες θα διαγράφονται αυτόματα"
},
"restore": {
"message": "Επαναφορά"
},
"deleteForever": {
"message": "Διαγραφή για πάντα"
},
"noEditPermissions": {
"message": "Δεν έχετε δικαίωμα να επεξεργαστείτε αυτό το αντικείμενο"
} }
} }

View File

@ -4300,8 +4300,11 @@
"enterprisePolicyRequirementsApplied": { "enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting" "message": "Enterprise policy requirements have been applied to this setting"
}, },
"additionalContentAvailable": { "showCharacterCount": {
"message": "Additional content is available" "message": "Show character count"
},
"hideCharacterCount": {
"message": "Hide character count"
}, },
"itemsInTrash": { "itemsInTrash": {
"message": "Items in trash" "message": "Items in trash"

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in the bin"
},
"noItemsInTrash": {
"message": "No items in the bin"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in the bin more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in bin"
},
"noItemsInTrash": {
"message": "No items in bin"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in the bin more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -14,7 +14,7 @@
"message": "Identifícate o crea una nueva cuenta para acceder a tu caja fuerte." "message": "Identifícate o crea una nueva cuenta para acceder a tu caja fuerte."
}, },
"inviteAccepted": { "inviteAccepted": {
"message": "Invitation accepted" "message": "Invitación aceptada"
}, },
"createAccount": { "createAccount": {
"message": "Crear cuenta" "message": "Crear cuenta"
@ -69,10 +69,10 @@
"message": "Pista de contraseña maestra (opcional)" "message": "Pista de contraseña maestra (opcional)"
}, },
"joinOrganization": { "joinOrganization": {
"message": "Join organization" "message": "Incorporarse a la organización"
}, },
"finishJoiningThisOrganizationBySettingAMasterPassword": { "finishJoiningThisOrganizationBySettingAMasterPassword": {
"message": "Finish joining this organization by setting a master password." "message": "Termine de unirse a esta organización estableciendo una contraseña maestra."
}, },
"tab": { "tab": {
"message": "Pestaña" "message": "Pestaña"
@ -114,19 +114,19 @@
"message": "Copiar código de seguridad" "message": "Copiar código de seguridad"
}, },
"copyName": { "copyName": {
"message": "Copy name" "message": "Copiar nombre"
}, },
"copyCompany": { "copyCompany": {
"message": "Copy company" "message": "Copiar empresa"
}, },
"copySSN": { "copySSN": {
"message": "Copy Social Security number" "message": "Copiar número de seguro social"
}, },
"copyPassportNumber": { "copyPassportNumber": {
"message": "Copy passport number" "message": "Copiar número de pasaporte"
}, },
"copyLicenseNumber": { "copyLicenseNumber": {
"message": "Copy license number" "message": "Copiar número de licencia"
}, },
"autoFill": { "autoFill": {
"message": "Autorrellenar" "message": "Autorrellenar"
@ -302,22 +302,22 @@
"message": "Editar carpeta" "message": "Editar carpeta"
}, },
"newFolder": { "newFolder": {
"message": "New folder" "message": "Carpeta nueva"
}, },
"folderName": { "folderName": {
"message": "Folder name" "message": "Nombre de carpeta"
}, },
"folderHintText": { "folderHintText": {
"message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums"
}, },
"noFoldersAdded": { "noFoldersAdded": {
"message": "No folders added" "message": "Ninguna carpeta añadida"
}, },
"createFoldersToOrganize": { "createFoldersToOrganize": {
"message": "Create folders to organize your vault items" "message": "Create folders to organize your vault items"
}, },
"deleteFolderPermanently": { "deleteFolderPermanently": {
"message": "Are you sure you want to permanently delete this folder?" "message": "¿Confirma que quiere eliminar permanentemente esta carpeta?"
}, },
"deleteFolder": { "deleteFolder": {
"message": "Eliminar carpeta" "message": "Eliminar carpeta"
@ -400,11 +400,11 @@
"description": "deprecated. Use specialCharactersLabel instead." "description": "deprecated. Use specialCharactersLabel instead."
}, },
"include": { "include": {
"message": "Include", "message": "Incluir",
"description": "Card header for password generator include block" "description": "Card header for password generator include block"
}, },
"uppercaseDescription": { "uppercaseDescription": {
"message": "Include uppercase characters", "message": "Incluir letras mayúsculas",
"description": "Tooltip for the password generator uppercase character checkbox" "description": "Tooltip for the password generator uppercase character checkbox"
}, },
"uppercaseLabel": { "uppercaseLabel": {
@ -412,7 +412,7 @@
"description": "Label for the password generator uppercase character checkbox" "description": "Label for the password generator uppercase character checkbox"
}, },
"lowercaseDescription": { "lowercaseDescription": {
"message": "Include lowercase characters", "message": "Incluir letras minúsculas",
"description": "Full description for the password generator lowercase character checkbox" "description": "Full description for the password generator lowercase character checkbox"
}, },
"lowercaseLabel": { "lowercaseLabel": {
@ -420,7 +420,7 @@
"description": "Label for the password generator lowercase character checkbox" "description": "Label for the password generator lowercase character checkbox"
}, },
"numbersDescription": { "numbersDescription": {
"message": "Include numbers", "message": "Incluir números",
"description": "Full description for the password generator numbers checkbox" "description": "Full description for the password generator numbers checkbox"
}, },
"numbersLabel": { "numbersLabel": {
@ -428,7 +428,7 @@
"description": "Label for the password generator numbers checkbox" "description": "Label for the password generator numbers checkbox"
}, },
"specialCharactersDescription": { "specialCharactersDescription": {
"message": "Include special characters", "message": "Incluir caracteres especiales",
"description": "Full description for the password generator special characters checkbox" "description": "Full description for the password generator special characters checkbox"
}, },
"specialCharactersLabel": { "specialCharactersLabel": {
@ -459,7 +459,7 @@
"description": "deprecated. Use avoidAmbiguous instead." "description": "deprecated. Use avoidAmbiguous instead."
}, },
"avoidAmbiguous": { "avoidAmbiguous": {
"message": "Avoid ambiguous characters", "message": "Evitar caracteres ambiguos",
"description": "Label for the avoid ambiguous characters checkbox." "description": "Label for the avoid ambiguous characters checkbox."
}, },
"searchVault": { "searchVault": {
@ -754,19 +754,19 @@
"message": "Tu sesión ha expirado." "message": "Tu sesión ha expirado."
}, },
"logIn": { "logIn": {
"message": "Log in" "message": "Acceder"
}, },
"restartRegistration": { "restartRegistration": {
"message": "Restart registration" "message": "Reiniciar registro"
}, },
"expiredLink": { "expiredLink": {
"message": "Expired link" "message": "Enlace caducado"
}, },
"pleaseRestartRegistrationOrTryLoggingIn": { "pleaseRestartRegistrationOrTryLoggingIn": {
"message": "Please restart registration or try logging in." "message": "Reinicie el registro o pruebe a acceder a su cuenta."
}, },
"youMayAlreadyHaveAnAccount": { "youMayAlreadyHaveAnAccount": {
"message": "You may already have an account" "message": "Puede que ya tenga una cuenta"
}, },
"logOutConfirmation": { "logOutConfirmation": {
"message": "¿Estás seguro de querer cerrar la sesión?" "message": "¿Estás seguro de querer cerrar la sesión?"
@ -830,7 +830,7 @@
"message": "Nueva URI" "message": "Nueva URI"
}, },
"addDomain": { "addDomain": {
"message": "Add domain", "message": "Añadir dominio",
"description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context."
}, },
"addedItem": { "addedItem": {
@ -1131,7 +1131,7 @@
"message": "1 GB de espacio cifrado en disco para adjuntos." "message": "1 GB de espacio cifrado en disco para adjuntos."
}, },
"premiumSignUpEmergency": { "premiumSignUpEmergency": {
"message": "Emergency access." "message": "Acceso de emergencia."
}, },
"premiumSignUpTwoStepOptions": { "premiumSignUpTwoStepOptions": {
"message": "Opciones de inicio de sesión con autenticación de dos pasos propietarios como YubiKey y Duo." "message": "Opciones de inicio de sesión con autenticación de dos pasos propietarios como YubiKey y Duo."
@ -1891,16 +1891,16 @@
"message": "Una o más políticas de la organización están afectando la configuración del generador" "message": "Una o más políticas de la organización están afectando la configuración del generador"
}, },
"passwordGenerator": { "passwordGenerator": {
"message": "Password generator" "message": "Generador de contraseñas"
}, },
"usernameGenerator": { "usernameGenerator": {
"message": "Username generator" "message": "Generador de nombres de usuario"
}, },
"useThisPassword": { "useThisPassword": {
"message": "Use this password" "message": "Usar esta contraseña"
}, },
"useThisUsername": { "useThisUsername": {
"message": "Use this username" "message": "Usar este nombre de usuario"
}, },
"securePasswordGenerated": { "securePasswordGenerated": {
"message": "Secure password generated! Don't forget to also update your password on the website." "message": "Secure password generated! Don't forget to also update your password on the website."
@ -2135,10 +2135,10 @@
"message": "Por favor, desbloquea a este usuario en la aplicación de escritorio e inténtalo de nuevo." "message": "Por favor, desbloquea a este usuario en la aplicación de escritorio e inténtalo de nuevo."
}, },
"biometricsNotAvailableTitle": { "biometricsNotAvailableTitle": {
"message": "Biometric unlock unavailable" "message": "Desbloqueo biométrico no disponible"
}, },
"biometricsNotAvailableDesc": { "biometricsNotAvailableDesc": {
"message": "Biometric unlock is currently unavailable. Please try again later." "message": "El desbloqueo biométrico no está disponible actualmente. Inténtelo de nuevo más tarde."
}, },
"biometricsFailedTitle": { "biometricsFailedTitle": {
"message": "Fallo de biométrica" "message": "Fallo de biométrica"
@ -2168,7 +2168,7 @@
"message": "Una política organizacional ha bloqueado la importación de elementos a su caja fuerte personal." "message": "Una política organizacional ha bloqueado la importación de elementos a su caja fuerte personal."
}, },
"domainsTitle": { "domainsTitle": {
"message": "Domains", "message": "Dominios",
"description": "A category title describing the concept of web domains" "description": "A category title describing the concept of web domains"
}, },
"excludedDomains": { "excludedDomains": {
@ -2237,7 +2237,7 @@
"message": "Protegido por contraseña" "message": "Protegido por contraseña"
}, },
"copyLink": { "copyLink": {
"message": "Copy link" "message": "Copiar enlace"
}, },
"copySendLink": { "copySendLink": {
"message": "Copiar enlace Send", "message": "Copiar enlace Send",
@ -2924,10 +2924,10 @@
"message": "Autofill shortcut" "message": "Autofill shortcut"
}, },
"autofillKeyboardShortcutUpdateLabel": { "autofillKeyboardShortcutUpdateLabel": {
"message": "Change shortcut" "message": "Cambiar atajo"
}, },
"autofillKeyboardManagerShortcutsLabel": { "autofillKeyboardManagerShortcutsLabel": {
"message": "Manage shortcuts" "message": "Gestionar atajos"
}, },
"autofillShortcut": { "autofillShortcut": {
"message": "Atajo de teclado para autocompletar" "message": "Atajo de teclado para autocompletar"
@ -3280,7 +3280,7 @@
"description": "Screen reader text (aria-label) for new card button within inline menu" "description": "Screen reader text (aria-label) for new card button within inline menu"
}, },
"newIdentity": { "newIdentity": {
"message": "New identity", "message": "Identidad nueva",
"description": "Button text to display within inline menu when there are no matching items on an identity field" "description": "Button text to display within inline menu when there are no matching items on an identity field"
}, },
"addNewIdentityItemAria": { "addNewIdentityItemAria": {
@ -3404,7 +3404,7 @@
"message": "Contraseña de archivo no válida. Por favor utilice la contraseña que introdujo cuando creó el archivo de exportación." "message": "Contraseña de archivo no válida. Por favor utilice la contraseña que introdujo cuando creó el archivo de exportación."
}, },
"destination": { "destination": {
"message": "Destination" "message": "Destino"
}, },
"learnAboutImportOptions": { "learnAboutImportOptions": {
"message": "Aprende sobre tus opciones de importación" "message": "Aprende sobre tus opciones de importación"
@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verificación requerida por el sitio inicial. Esta característica aún no está implementada para cuentas sin contraseña maestra." "message": "Verificación requerida por el sitio inicial. Esta característica aún no está implementada para cuentas sin contraseña maestra."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "¿Iniciar sesión con clave de acceso?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Ya existe una clave de acceso para esta aplicación." "message": "Ya existe una clave de acceso para esta aplicación."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "No tiene un inicio de sesión que coincida para este sitio." "message": "No tiene un inicio de sesión que coincida para este sitio."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirmar" "message": "Confirmar"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Guardar clave de acceso como nuevo inicio de sesión" "message": "Guardar clave de acceso como nuevo inicio de sesión"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Elija un inicio de sesión para guardar esta clave de acceso" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Elemento de clave de acceso" "message": "Elemento de clave de acceso"
@ -4053,7 +4059,7 @@
} }
}, },
"enableAnimations": { "enableAnimations": {
"message": "Enable animations" "message": "Activar animaciones"
}, },
"addAccount": { "addAccount": {
"message": "Añadir cuenta" "message": "Añadir cuenta"
@ -4062,14 +4068,14 @@
"message": "Cargando" "message": "Cargando"
}, },
"data": { "data": {
"message": "Data" "message": "Datos"
}, },
"passkeys": { "passkeys": {
"message": "Passkeys", "message": "Passkeys",
"description": "A section header for a list of passkeys." "description": "A section header for a list of passkeys."
}, },
"passwords": { "passwords": {
"message": "Passwords", "message": "Contraseñas",
"description": "A section header for a list of passwords." "description": "A section header for a list of passwords."
}, },
"logInWithPasskeyAriaLabel": { "logInWithPasskeyAriaLabel": {
@ -4098,16 +4104,16 @@
} }
}, },
"addField": { "addField": {
"message": "Add field" "message": "Añadir campo"
}, },
"add": { "add": {
"message": "Add" "message": "Añadir"
}, },
"fieldType": { "fieldType": {
"message": "Field type" "message": "Tipo de campo"
}, },
"fieldLabel": { "fieldLabel": {
"message": "Field label" "message": "Etiqueta de campo"
}, },
"textHelpText": { "textHelpText": {
"message": "Use text fields for data like security questions" "message": "Use text fields for data like security questions"
@ -4268,7 +4274,7 @@
} }
}, },
"itemLocation": { "itemLocation": {
"message": "Item Location" "message": "Ubicación del elemento"
}, },
"fileSends": { "fileSends": {
"message": "File Sends" "message": "File Sends"
@ -4277,13 +4283,13 @@
"message": "Text Sends" "message": "Text Sends"
}, },
"bitwardenNewLook": { "bitwardenNewLook": {
"message": "Bitwarden has a new look!" "message": "Bitwarden tiene un aspecto nuevo."
}, },
"bitwardenNewLookDesc": { "bitwardenNewLookDesc": {
"message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!"
}, },
"accountActions": { "accountActions": {
"message": "Account actions" "message": "Acciones de cuenta"
}, },
"showNumberOfAutofillSuggestions": { "showNumberOfAutofillSuggestions": {
"message": "Show number of login autofill suggestions on extension icon" "message": "Show number of login autofill suggestions on extension icon"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Elementos en la papelera"
},
"noItemsInTrash": {
"message": "Ningún elemento en la papelera"
},
"noItemsInTrashDesc": {
"message": "Los elementos que elimine aparecerán aquí y se eliminarán permanentemente al cabo de 30 días"
},
"trashWarning": {
"message": "Los elementos que permanezcan más de 30 días en la papelera se eliminarán de forma automática"
},
"restore": {
"message": "Restaurar"
},
"deleteForever": {
"message": "Eliminar para siempre"
},
"noEditPermissions": {
"message": "No tiene permiso de editar este elemento"
} }
} }

View File

@ -231,7 +231,7 @@
"message": "Ülemparooli saab muuta Bitwardeni veebirakenduses." "message": "Ülemparooli saab muuta Bitwardeni veebirakenduses."
}, },
"fingerprintPhrase": { "fingerprintPhrase": {
"message": "Sõrmejälje fraas", "message": "Unikaalne sõnajada",
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
}, },
"yourAccountsFingerprint": { "yourAccountsFingerprint": {
@ -2849,10 +2849,10 @@
"message": "Bitwardeni rakenduse seadistuses peab olema konfigureeritud sisselogimine läbi seadme. Vajad teist valikut?" "message": "Bitwardeni rakenduse seadistuses peab olema konfigureeritud sisselogimine läbi seadme. Vajad teist valikut?"
}, },
"fingerprintPhraseHeader": { "fingerprintPhraseHeader": {
"message": "Sõrmejälje fraas" "message": "Unikaalne sõnajada"
}, },
"fingerprintMatchInfo": { "fingerprintMatchInfo": {
"message": "Veendu, et hoidla on lahti lukustatud ja sõrmejälje fraasid seadmete vahel ühtivad." "message": "Veendu, et hoidla on lahti lukustatud ja unikaalne sõnajada ühtib teiste seadmetega."
}, },
"resendNotification": { "resendNotification": {
"message": "Saada märguanne uuesti" "message": "Saada märguanne uuesti"
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Berretsi" "message": "Berretsi"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "تأیید توسط سایت آغازگر الزامی است. این ویژگی هنوز برای حساب‌های بدون کلمه عبور اصلی اجرا نشده است." "message": "تأیید توسط سایت آغازگر الزامی است. این ویژگی هنوز برای حساب‌های بدون کلمه عبور اصلی اجرا نشده است."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "با کلید عبور وارد می‌شوید؟" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "یک کلید عبور از قبل برای این برنامه وجود دارد." "message": "یک کلید عبور از قبل برای این برنامه وجود دارد."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "شما هیچ ورود مشابهی برای این سایت ندارید." "message": "شما هیچ ورود مشابهی برای این سایت ندارید."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "تأیید" "message": "تأیید"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "کلید عبور را به عنوان ورود جدید ذخیره کن" "message": "کلید عبور را به عنوان ورود جدید ذخیره کن"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "یک ورود برای ذخیره این کلید عبور انتخاب کنید" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "مورد کلید عبور" "message": "مورد کلید عبور"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -308,13 +308,13 @@
"message": "Kansion nimi" "message": "Kansion nimi"
}, },
"folderHintText": { "folderHintText": {
"message": "Luo alikansio lisäämällä olemassa olevan kansion nimi \"/\"-merkin jälkeen. Esim: Some/Foorumit." "message": "Luo alikansio lisäämällä olemassa olevan kansion nimi \"/\"-merkin edelle. Esim: Some/Foorumit."
}, },
"noFoldersAdded": { "noFoldersAdded": {
"message": "Kansioita ei ole lisätty" "message": "Kansioita ei ole lisätty"
}, },
"createFoldersToOrganize": { "createFoldersToOrganize": {
"message": "Lajittele holvisi kohteita luomalla kansioita" "message": "Järjestä holvisi kohteita luomalla kansioita"
}, },
"deleteFolderPermanently": { "deleteFolderPermanently": {
"message": "Haluatko varmasti poistaa kansion pysyvästi?" "message": "Haluatko varmasti poistaa kansion pysyvästi?"
@ -400,7 +400,7 @@
"description": "deprecated. Use specialCharactersLabel instead." "description": "deprecated. Use specialCharactersLabel instead."
}, },
"include": { "include": {
"message": "Include", "message": "Sisällytys",
"description": "Card header for password generator include block" "description": "Card header for password generator include block"
}, },
"uppercaseDescription": { "uppercaseDescription": {
@ -408,19 +408,19 @@
"description": "Tooltip for the password generator uppercase character checkbox" "description": "Tooltip for the password generator uppercase character checkbox"
}, },
"uppercaseLabel": { "uppercaseLabel": {
"message": "A-Ö", "message": "A-Z",
"description": "Label for the password generator uppercase character checkbox" "description": "Label for the password generator uppercase character checkbox"
}, },
"lowercaseDescription": { "lowercaseDescription": {
"message": "ytä pieniä kirjaimia", "message": "Sisällytä pieniä kirjaimia",
"description": "Full description for the password generator lowercase character checkbox" "description": "Full description for the password generator lowercase character checkbox"
}, },
"lowercaseLabel": { "lowercaseLabel": {
"message": "a-ö", "message": "a-z",
"description": "Label for the password generator lowercase character checkbox" "description": "Label for the password generator lowercase character checkbox"
}, },
"numbersDescription": { "numbersDescription": {
"message": "ytä numeroita", "message": "Sisällytä numeroita",
"description": "Full description for the password generator numbers checkbox" "description": "Full description for the password generator numbers checkbox"
}, },
"numbersLabel": { "numbersLabel": {
@ -428,7 +428,7 @@
"description": "Label for the password generator numbers checkbox" "description": "Label for the password generator numbers checkbox"
}, },
"specialCharactersDescription": { "specialCharactersDescription": {
"message": "ytä erikoismerkkejä", "message": "Sisällytä erikoismerkkejä",
"description": "Full description for the password generator special characters checkbox" "description": "Full description for the password generator special characters checkbox"
}, },
"specialCharactersLabel": { "specialCharactersLabel": {
@ -684,10 +684,10 @@
"message": "Uusi käyttäjätilisi on luotu! Voit nyt kirjautua sisään." "message": "Uusi käyttäjätilisi on luotu! Voit nyt kirjautua sisään."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Uusi tilisi on luotu!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Sinut on kirjattu sisään!"
}, },
"youSuccessfullyLoggedIn": { "youSuccessfullyLoggedIn": {
"message": "Kirjautuminen onnistui" "message": "Kirjautuminen onnistui"
@ -1903,7 +1903,7 @@
"message": "Käytä tätä käyttäjätunnusta" "message": "Käytä tätä käyttäjätunnusta"
}, },
"securePasswordGenerated": { "securePasswordGenerated": {
"message": "Turvallinen salasana luotiin! Muista päivittää salasana myös verkkosivustolla." "message": "Turvallinen salasana luotiin! Muista vaihtaa se myös verkkosivuston tiliasetuksiin."
}, },
"useGeneratorHelpTextPartOne": { "useGeneratorHelpTextPartOne": {
"message": "Käytä generaattoria", "message": "Käytä generaattoria",
@ -2135,10 +2135,10 @@
"message": "Poista käyttäjän lukitus työpöytäsovelluksesta ja yritä uudelleen." "message": "Poista käyttäjän lukitus työpöytäsovelluksesta ja yritä uudelleen."
}, },
"biometricsNotAvailableTitle": { "biometricsNotAvailableTitle": {
"message": "Biometric unlock unavailable" "message": "Biometrinen avaus ei ole käytettävissä"
}, },
"biometricsNotAvailableDesc": { "biometricsNotAvailableDesc": {
"message": "Biometric unlock is currently unavailable. Please try again later." "message": "Biometrinen avaus ei tällä hetkellä ole käytettävissä. Yritä myöhemmin uudelleen."
}, },
"biometricsFailedTitle": { "biometricsFailedTitle": {
"message": "Biometria epäonnistui" "message": "Biometria epäonnistui"
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Käynnistänyt sivusto edellyttää vahvistusta. Ominaisuutta ei ole vielä toteutettu tileille, joilla ei ole pääsalasanaa." "message": "Käynnistänyt sivusto edellyttää vahvistusta. Ominaisuutta ei ole vielä toteutettu tileille, joilla ei ole pääsalasanaa."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Kirjaudutaanko pääsyavaimella?" "message": "Kirjaudutaanko pääsyavaimella?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Holvissasi ei ole tälle sivustolle sopivaa kirjautumistietoa." "message": "Holvissasi ei ole tälle sivustolle sopivaa kirjautumistietoa."
}, },
"noMatchingLoginsForSite": {
"message": "Ei tälle sivustolle sopivia kirjautumistietoja"
},
"confirm": { "confirm": {
"message": "Vahvista" "message": "Vahvista"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Tallenna pääsyavain uuteen kirjautumistietoon" "message": "Tallenna pääsyavain uuteen kirjautumistietoon"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Valitse kirjautumistieto, johon pääsyavain tallennetaan" "message": "Valitse kirjautumistieto, johon pääsyavain tallennetaan"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Valitse pääsyavain, jolla kirjaudutaan"
},
"passkeyItem": { "passkeyItem": {
"message": "Pääsyavainkohde" "message": "Pääsyavainkohde"
}, },
@ -3705,7 +3711,7 @@
"description": "Notification message for when updating credentials has succeeded." "description": "Notification message for when updating credentials has succeeded."
}, },
"passwordUpdated": { "passwordUpdated": {
"message": "Salasana päivitettiin!", "message": "Salasana vaihdettiin!",
"description": "Notification message for when updating credentials has succeeded." "description": "Notification message for when updating credentials has succeeded."
}, },
"saveCipherAttemptFailed": { "saveCipherAttemptFailed": {
@ -3722,10 +3728,10 @@
"message": "Pääsyavain poistettiin" "message": "Pääsyavain poistettiin"
}, },
"autofillSuggestions": { "autofillSuggestions": {
"message": "Automaattitäytä ehdotukset" "message": "Automaattitäytön ehdotukset"
}, },
"autofillSuggestionsTip": { "autofillSuggestionsTip": {
"message": "Tallenna sivustolle kirjautumiskohde automaattista täyttöä varten" "message": "Tallenna tälle sivustolle automaattisesti täytettävä kirjautumistieto."
}, },
"yourVaultIsEmpty": { "yourVaultIsEmpty": {
"message": "Holvisi on tyhjä" "message": "Holvisi on tyhjä"
@ -3787,7 +3793,7 @@
} }
}, },
"autofillTitle": { "autofillTitle": {
"message": "Automaattitäyt - $ITEMNAME$", "message": "Automaattitäytä - $ITEMNAME$",
"description": "Title for a button that autofills a login item.", "description": "Title for a button that autofills a login item.",
"placeholders": { "placeholders": {
"itemname": { "itemname": {
@ -4295,6 +4301,27 @@
"message": "Yrityskäytännön vaatimuksia on sovellettu tähän asetukseen" "message": "Yrityskäytännön vaatimuksia on sovellettu tähän asetukseen"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Lisää sisältöä on saatavilla"
},
"itemsInTrash": {
"message": "Roskakorin kohteet"
},
"noItemsInTrash": {
"message": "Roskakorissa ei ole kohteita"
},
"noItemsInTrashDesc": {
"message": "Poistamasi kohteet näkyvät täällä ja poistetaan pysyvästi 30 päivän kuluttua."
},
"trashWarning": {
"message": "Roskakorissa yli 30 päivää olleet kohteet poistetaan automaattisesti"
},
"restore": {
"message": "Palauta"
},
"deleteForever": {
"message": "Poista pysyvästi"
},
"noEditPermissions": {
"message": "Sinulla ei ole oikeutta muokata tätä kohdetta"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Vérification requise par le site initiateur. Cette fonctionnalité n'est pas encore implémentée pour les comptes sans mot de passe principal." "message": "Vérification requise par le site initiateur. Cette fonctionnalité n'est pas encore implémentée pour les comptes sans mot de passe principal."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Se connecter avec une clé d'identification (passkey) ?" "message": "Se connecter avec une clé d'accès ?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Une clé d'identification (passkey) existe déjà pour cette application." "message": "Une clé d'identification (passkey) existe déjà pour cette application."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Vous n'avez pas d'identifiant correspondant à ce site." "message": "Vous n'avez pas d'identifiant correspondant à ce site."
}, },
"noMatchingLoginsForSite": {
"message": "Aucun identifiant correspondant pour ce site"
},
"confirm": { "confirm": {
"message": "Confirmer" "message": "Confirmer"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Enregistrer la clé d'identification (passkey) comme nouvel identifiant" "message": "Enregistrer la clé d'identification (passkey) comme nouvel identifiant"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choisissez cette clé d'identification (passkey) pour l'enregistrer avec cet identifiant" "message": "Choisissez un identifiant ou enregistrer cette clé d'accès"
},
"chooseCipherForPasskeyAuth": {
"message": "Choisissez une clé d'accès pour vous connecter"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Élément clé d'identification (passkey)" "message": "Élément clé d'identification (passkey)"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Du contenu supplémentaire est disponible" "message": "Du contenu supplémentaire est disponible"
},
"itemsInTrash": {
"message": "Éléments dans la corbeille"
},
"noItemsInTrash": {
"message": "Aucun élément dans la corbeille"
},
"noItemsInTrashDesc": {
"message": "Les éléments que vous supprimez apparaîtront ici et seront définitivement supprimés au bout de 30 jours"
},
"trashWarning": {
"message": "Les éléments qui se trouvent dans la corbeille depuis plus de 30 jours sont automatiquement supprimés"
},
"restore": {
"message": "Restaurer"
},
"deleteForever": {
"message": "Supprimer définitivement"
},
"noEditPermissions": {
"message": "Vous n'êtes pas autorisé à modifier cet élément"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -400,11 +400,11 @@
"description": "deprecated. Use specialCharactersLabel instead." "description": "deprecated. Use specialCharactersLabel instead."
}, },
"include": { "include": {
"message": "Include", "message": "Uključi",
"description": "Card header for password generator include block" "description": "Card header for password generator include block"
}, },
"uppercaseDescription": { "uppercaseDescription": {
"message": "Include uppercase characters", "message": "Uključi velika slova",
"description": "Tooltip for the password generator uppercase character checkbox" "description": "Tooltip for the password generator uppercase character checkbox"
}, },
"uppercaseLabel": { "uppercaseLabel": {
@ -412,7 +412,7 @@
"description": "Label for the password generator uppercase character checkbox" "description": "Label for the password generator uppercase character checkbox"
}, },
"lowercaseDescription": { "lowercaseDescription": {
"message": "Include lowercase characters", "message": "Uključi mala slova",
"description": "Full description for the password generator lowercase character checkbox" "description": "Full description for the password generator lowercase character checkbox"
}, },
"lowercaseLabel": { "lowercaseLabel": {
@ -420,7 +420,7 @@
"description": "Label for the password generator lowercase character checkbox" "description": "Label for the password generator lowercase character checkbox"
}, },
"numbersDescription": { "numbersDescription": {
"message": "Include numbers", "message": "Uključi brojeve",
"description": "Full description for the password generator numbers checkbox" "description": "Full description for the password generator numbers checkbox"
}, },
"numbersLabel": { "numbersLabel": {
@ -428,7 +428,7 @@
"description": "Label for the password generator numbers checkbox" "description": "Label for the password generator numbers checkbox"
}, },
"specialCharactersDescription": { "specialCharactersDescription": {
"message": "Include special characters", "message": "Uključi posebne znakove",
"description": "Full description for the password generator special characters checkbox" "description": "Full description for the password generator special characters checkbox"
}, },
"specialCharactersLabel": { "specialCharactersLabel": {
@ -459,7 +459,7 @@
"description": "deprecated. Use avoidAmbiguous instead." "description": "deprecated. Use avoidAmbiguous instead."
}, },
"avoidAmbiguous": { "avoidAmbiguous": {
"message": "Avoid ambiguous characters", "message": "Izbjegavaj dvosmislene znakove",
"description": "Label for the avoid ambiguous characters checkbox." "description": "Label for the avoid ambiguous characters checkbox."
}, },
"searchVault": { "searchVault": {
@ -684,10 +684,10 @@
"message": "Tvoj novi račun je stvoren! Sada se možeš prijaviti." "message": "Tvoj novi račun je stvoren! Sada se možeš prijaviti."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Tvoj novi račun je stvoren!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Prijava uspješna!"
}, },
"youSuccessfullyLoggedIn": { "youSuccessfullyLoggedIn": {
"message": "Prijava uspješna" "message": "Prijava uspješna"
@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Ishodišna stranica zahtijeva verifikaciju. Ova značajka još nije implementirana za račune bez glavne lozinke." "message": "Ishodišna stranica zahtijeva verifikaciju. Ova značajka još nije implementirana za račune bez glavne lozinke."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Prijava pristupnim ključem?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Za ovu aplikaciju već postoji pristupni ključ." "message": "Za ovu aplikaciju već postoji pristupni ključ."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Nema odgovarajuće prijavu za ovu stranicu." "message": "Nema odgovarajuće prijavu za ovu stranicu."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Autoriziraj" "message": "Autoriziraj"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Spremi pristupni ključ kao novu prijavu" "message": "Spremi pristupni ključ kao novu prijavu"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Odaberi prijavu za spremanje ovog pristupnog ključa" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Stavka pristupnog ključa" "message": "Stavka pristupnog ključa"
@ -4295,6 +4301,27 @@
"message": "Pravila tvrtke primijenjena su na ovu postavku" "message": "Pravila tvrtke primijenjena su na ovu postavku"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Dostupan je dodatni sadržaj"
},
"itemsInTrash": {
"message": "Stavke u smeću"
},
"noItemsInTrash": {
"message": "Nema stavki u smeću"
},
"noItemsInTrashDesc": {
"message": "Stavke koje obrišeš biti će premještene ovdje, a nakon 30 dana biti će trajno izbrisane"
},
"trashWarning": {
"message": "Stavke koje se nalaze u Smeću duže od 30 dana će biti automatski izbrisane"
},
"restore": {
"message": "Vrati"
},
"deleteForever": {
"message": "Izbriši zauvijek"
},
"noEditPermissions": {
"message": "Nemaš prava za uređivanje ove stavke"
} }
} }

View File

@ -684,10 +684,10 @@
"message": "Felhasználódat létrehoztuk. Most már be tudsz jelentkezni." "message": "Felhasználódat létrehoztuk. Most már be tudsz jelentkezni."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Az új fiók létrrejött."
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Megtörtént a bejelentkezés!"
}, },
"youSuccessfullyLoggedIn": { "youSuccessfullyLoggedIn": {
"message": "A bejelentkezés sikeres volt." "message": "A bejelentkezés sikeres volt."
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "A kezdeményező hely által megkövetelt ellenőrzés. Ez a szolgáltatás még nincs megvalósítva mesterjelszó nélküli fiókok esetén." "message": "A kezdeményező hely által megkövetelt ellenőrzés. Ez a szolgáltatás még nincs megvalósítva mesterjelszó nélküli fiókok esetén."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Bejelentkezés hozzáférési kulccsal?" "message": "Bejelentkezés hozzáférési kulccsal?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Nincs megfelelő bejelentkezés ehhez a webhelyhez." "message": "Nincs megfelelő bejelentkezés ehhez a webhelyhez."
}, },
"noMatchingLoginsForSite": {
"message": "Nincsenek egyező bejelentkezések ehhez a webhelyhez."
},
"confirm": { "confirm": {
"message": "Megerősítés" "message": "Megerősítés"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Hozzáférési kulcs mentése új bejelentkezésként" "message": "Hozzáférési kulcs mentése új bejelentkezésként"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Bejelentkezés választás a hozzáférési kulcs mentéséhez" "message": "Bejelentkezés választás a hozzáférési kulcs mentéséhez"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Hozzáférési kulcs választás a bejelentkezéshez"
},
"passkeyItem": { "passkeyItem": {
"message": "Hozzáférési kulcs elem" "message": "Hozzáférési kulcs elem"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "elem van a lomtárban."
},
"noItemsInTrash": {
"message": "Nincs elem a lomtárban."
},
"noItemsInTrashDesc": {
"message": "A törölt elemek itt jelennek meg és 30 nap elteltével véglegesen törlődnek."
},
"trashWarning": {
"message": "A 30 napnál régebben lomtárba került elemek automatikusan törlésre kerülnek."
},
"restore": {
"message": "Visszaállítás"
},
"deleteForever": {
"message": "Végleges törlés"
},
"noEditPermissions": {
"message": "Nincs jogosulltság ezen elem szerkesztéséheu."
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "開始サイトでの認証が必要です。この機能はマスターパスワードのないアカウントではまだ対応していません。" "message": "開始サイトでの認証が必要です。この機能はマスターパスワードのないアカウントではまだ対応していません。"
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "パスキーでログインしますか?" "message": "パスキーでログインしますか?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "このサイトに一致するログイン情報がありません。" "message": "このサイトに一致するログイン情報がありません。"
}, },
"noMatchingLoginsForSite": {
"message": "このサイトに一致するログイン情報がありません"
},
"confirm": { "confirm": {
"message": "確認" "message": "確認"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "パスキーを新しいログイン情報として保存" "message": "パスキーを新しいログイン情報として保存"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "このパスキーを保存するログイン情報を選択してください" "message": "このパスキーを保存するログイン情報を選択してください"
}, },
"chooseCipherForPasskeyAuth": {
"message": "ログインに使うパスキーを選択してください"
},
"passkeyItem": { "passkeyItem": {
"message": "パスキーアイテム" "message": "パスキーアイテム"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "追加コンテンツが利用可能です" "message": "追加コンテンツが利用可能です"
},
"itemsInTrash": {
"message": "ゴミ箱にあるアイテム"
},
"noItemsInTrash": {
"message": "ゴミ箱にアイテムはありません"
},
"noItemsInTrashDesc": {
"message": "削除したアイテムはここに表示され、30日後に完全に削除されます"
},
"trashWarning": {
"message": "30日以上ゴミ箱にあったアイテムは自動的に削除されます"
},
"restore": {
"message": "復元"
},
"deleteForever": {
"message": "完全に削除"
},
"noEditPermissions": {
"message": "このアイテムを編集する権限がありません"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "사이트에서 인증을 요구합니다. 이 기능은 비밀번호가 없는 계정에서는 아직 지원하지 않습니다." "message": "사이트에서 인증을 요구합니다. 이 기능은 비밀번호가 없는 계정에서는 아직 지원하지 않습니다."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "패스키로 로그인하시겠어요?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "이미 이 애플리케이션에 해당하는 패스키가 있습니다." "message": "이미 이 애플리케이션에 해당하는 패스키가 있습니다."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "사이트와 일치하는 로그인이 없습니다." "message": "사이트와 일치하는 로그인이 없습니다."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "새 로그인으로 패스키 저장" "message": "새 로그인으로 패스키 저장"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "패스키를 저장할 로그인 선택하기" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "패스키 항목" "message": "패스키 항목"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -754,19 +754,19 @@
"message": "Pieteikšanās sesija ir beigusies." "message": "Pieteikšanās sesija ir beigusies."
}, },
"logIn": { "logIn": {
"message": "Log in" "message": "Pieteikties"
}, },
"restartRegistration": { "restartRegistration": {
"message": "Restart registration" "message": "Sākt reģistrēšanos no jauna"
}, },
"expiredLink": { "expiredLink": {
"message": "Expired link" "message": "Saitei beidzies derīgums"
}, },
"pleaseRestartRegistrationOrTryLoggingIn": { "pleaseRestartRegistrationOrTryLoggingIn": {
"message": "Please restart registration or try logging in." "message": "Lūgums sākt reģistrēšanos no jauna vai mēģināt pieteikties."
}, },
"youMayAlreadyHaveAnAccount": { "youMayAlreadyHaveAnAccount": {
"message": "You may already have an account" "message": "Tev jau varētu būt konts"
}, },
"logOutConfirmation": { "logOutConfirmation": {
"message": "Vai tiešām atteikties?" "message": "Vai tiešām atteikties?"
@ -2036,7 +2036,7 @@
"message": "Jaunā galvenā parole neatbilst nosacījumu prasībām." "message": "Jaunā galvenā parole neatbilst nosacījumu prasībām."
}, },
"receiveMarketingEmailsV2": { "receiveMarketingEmailsV2": {
"message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." "message": "Iegūt savā iesūtnē padomus, paziņojumus un izpētes iespējas no Bitwarden."
}, },
"unsubscribe": { "unsubscribe": {
"message": "Atteikt abonēšanu" "message": "Atteikt abonēšanu"
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Vietne, kurā tika uzsākta darbība, pieprasa pārbaudi. Šī iespēja vēl nav īstenota kontiem, kuriem nav galvenās paroles." "message": "Vietne, kurā tika uzsākta darbība, pieprasa pārbaudi. Šī iespēja vēl nav īstenota kontiem, kuriem nav galvenās paroles."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Pieteikties ar piekļuves atslēgu?" "message": "Pieteikties ar piekļuves atslēgu?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Nav šai vietnei atbilstoša pieteikšanās vienuma." "message": "Nav šai vietnei atbilstoša pieteikšanās vienuma."
}, },
"noMatchingLoginsForSite": {
"message": "Šai vietnei nav atbilstošu pieteikšanās vietnumu"
},
"confirm": { "confirm": {
"message": "Apstiprināt" "message": "Apstiprināt"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Saglabāt piekļuves atslēgu kā jaunu pieteikšanās vienumu" "message": "Saglabāt piekļuves atslēgu kā jaunu pieteikšanās vienumu"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Izvēlēties pieteikšanās vienumu, kurā saglabāt šo piekļuves atslēgu" "message": "Izvēlēties pieteikšanās vienumu, kurā saglabāt šo piekļuves atslēgu"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Izvēlēties piekļuves atslēgu, ar kuru pieteikties"
},
"passkeyItem": { "passkeyItem": {
"message": "Piekļuves atslēgas vienums" "message": "Piekļuves atslēgas vienums"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Ir pieejams papildu saturs" "message": "Ir pieejams papildu saturs"
},
"itemsInTrash": {
"message": "Vienumi atkritnē"
},
"noItemsInTrash": {
"message": "Atkritnē nav vienumu"
},
"noItemsInTrashDesc": {
"message": "Izdzēstie vienumi parādīsies šeit, un tie tiks neatgriezeniski izdzēsti pēc 30 dienām"
},
"trashWarning": {
"message": "Vienumi, kas atkritnē atrodas vairāk nekā 30 dienas, tiks automatiski izdzēsti"
},
"restore": {
"message": "Atjaunot"
},
"deleteForever": {
"message": "Izdzēst pavisam"
},
"noEditPermissions": {
"message": "Nav nepieciešamo atļauju, lai labotu šo vienumu"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Du har ikke en samsvarende innlogging for dette nettstedet." "message": "Du har ikke en samsvarende innlogging for dette nettstedet."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Bekreft" "message": "Bekreft"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "De initiërende site vereist verificatie. Deze functie is nog niet geïmplementeerd voor accounts zonder hoofdwachtwoord." "message": "De initiërende site vereist verificatie. Deze functie is nog niet geïmplementeerd voor accounts zonder hoofdwachtwoord."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Inloggen met passkey?" "message": "Inloggen met passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Je hebt geen overeenkomende login voor deze site." "message": "Je hebt geen overeenkomende login voor deze site."
}, },
"noMatchingLoginsForSite": {
"message": "Geen overeenkomende logins voor deze site"
},
"confirm": { "confirm": {
"message": "Bevestigen" "message": "Bevestigen"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Passkey als nieuwe login opslaan" "message": "Passkey als nieuwe login opslaan"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Kies een login om deze passkey bij op te slaan" "message": "Kies een login om deze passkey bij op te slaan"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Kies een passkey om mee in te loggen"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey-Item" "message": "Passkey-Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Extra inhoud beschikbaar" "message": "Extra inhoud beschikbaar"
},
"itemsInTrash": {
"message": "Items in prullenbak"
},
"noItemsInTrash": {
"message": "Geen items in prullenbak"
},
"noItemsInTrashDesc": {
"message": "Items die je verwijdert verschijnen hier en worden na 30 dagen definitief verwijderd"
},
"trashWarning": {
"message": "Items die meer dan 30 dagen in de prullenbak zitten worden automatisch verwijderd"
},
"restore": {
"message": "Herstellen"
},
"deleteForever": {
"message": "Definitief verwijderen"
},
"noEditPermissions": {
"message": "Je hebt geen toestemming om dit item te bewerken"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Weryfikacja jest wymagana przez stronę inicjującą. Ta funkcja nie jest jeszcze zaimplementowana dla kont bez hasła głównego." "message": "Weryfikacja jest wymagana przez stronę inicjującą. Ta funkcja nie jest jeszcze zaimplementowana dla kont bez hasła głównego."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Zaloguj się za pomocą passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Passkey już istnieje dla tej aplikacji." "message": "Passkey już istnieje dla tej aplikacji."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Nie masz pasujących danych logowania do tej witryny." "message": "Nie masz pasujących danych logowania do tej witryny."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Potwierdź" "message": "Potwierdź"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Zapisz passkey jako nowe dane logowania" "message": "Zapisz passkey jako nowe dane logowania"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Wybierz dane logowania do których przypisać passkey" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Element Passkey" "message": "Element Passkey"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verificação requerida pelo site que a iniciou. Esse recurso ainda não está implementado para contas sem senha mestra." "message": "Verificação requerida pelo site que a iniciou. Esse recurso ainda não está implementado para contas sem senha mestra."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Fazer login com chave de acesso?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Uma chave de acesso já existe para este aplicativo." "message": "Uma chave de acesso já existe para este aplicativo."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Você não tem um login correspondente para este site." "message": "Você não tem um login correspondente para este site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirmar" "message": "Confirmar"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Salvar chave de acesso como um novo login" "message": "Salvar chave de acesso como um novo login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Escolha um login para salvar esta chave de acesso" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Item de chave de acesso" "message": "Item de chave de acesso"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verificação exigida pelo site inicial. Esta funcionalidade ainda não está implementada para contas sem palavra-passe mestra." "message": "Verificação exigida pelo site inicial. Esta funcionalidade ainda não está implementada para contas sem palavra-passe mestra."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Iniciar sessão com a chave de acesso?" "message": "Iniciar sessão com a chave de acesso?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Não tem uma credencial correspondente para este site." "message": "Não tem uma credencial correspondente para este site."
}, },
"noMatchingLoginsForSite": {
"message": "Sem credenciais correspondentes para este site"
},
"confirm": { "confirm": {
"message": "Confirmar" "message": "Confirmar"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Guardar a chave de acesso como uma nova credencial" "message": "Guardar a chave de acesso como uma nova credencial"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Escolha uma credencial para guardar esta chave de acesso" "message": "Escolha uma credencial para guardar esta chave de acesso"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Escolha uma chave de acesso para iniciar sessão"
},
"passkeyItem": { "passkeyItem": {
"message": "Item da chave de acesso" "message": "Item da chave de acesso"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Estão disponíveis conteúdos adicionais" "message": "Estão disponíveis conteúdos adicionais"
},
"itemsInTrash": {
"message": "Itens no lixo"
},
"noItemsInTrash": {
"message": "Nenhum item no lixo"
},
"noItemsInTrashDesc": {
"message": "Os itens que eliminar aparecerão aqui e serão permanentemente eliminados após 30 dias"
},
"trashWarning": {
"message": "Os itens que estiverem no lixo há mais de 30 dias serão automaticamente eliminados"
},
"restore": {
"message": "Restaurar"
},
"deleteForever": {
"message": "Eliminar para sempre"
},
"noEditPermissions": {
"message": "Não tem permissão para editar este item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -684,10 +684,10 @@
"message": "Ваш аккаунт создан! Теперь вы можете войти в систему." "message": "Ваш аккаунт создан! Теперь вы можете войти в систему."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Ваш новый аккаунт создан!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Вы авторизовались!"
}, },
"youSuccessfullyLoggedIn": { "youSuccessfullyLoggedIn": {
"message": "Вы успешно авторизовались" "message": "Вы успешно авторизовались"
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Необходима верификация со стороны инициирующего сайта. Для аккаунтов без мастер-пароля эта возможность пока не реализована." "message": "Необходима верификация со стороны инициирующего сайта. Для аккаунтов без мастер-пароля эта возможность пока не реализована."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Войти с passkey?" "message": "Войти с passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "У вас нет подходящего логина для этого сайта." "message": "У вас нет подходящего логина для этого сайта."
}, },
"noMatchingLoginsForSite": {
"message": "Нет подходящих логинов для этого сайта"
},
"confirm": { "confirm": {
"message": "Подтвердить" "message": "Подтвердить"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Сохранить passkey как новый логин" "message": "Сохранить passkey как новый логин"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Выберите логин, для которого будет сохранен данный passkey" "message": "Выберите логин, для которого будет сохранен данный passkey"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Выберите passkey для авторизации"
},
"passkeyItem": { "passkeyItem": {
"message": "Элемент passkey" "message": "Элемент passkey"
}, },
@ -4295,6 +4301,27 @@
"message": "К этой настройке были применены требования корпоративной политики" "message": "К этой настройке были применены требования корпоративной политики"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Дополнительный контент доступен"
},
"itemsInTrash": {
"message": "Элементы в корзине"
},
"noItemsInTrash": {
"message": "Нет элементов в корзине"
},
"noItemsInTrashDesc": {
"message": "Элементы, которые вы удаляете, появятся здесь и будут удалены навсегда через 30 дней"
},
"trashWarning": {
"message": "Элементы, которые были в корзине более 30 дней, будут автоматически удалены"
},
"restore": {
"message": "Восстановить"
},
"deleteForever": {
"message": "Удалить навсегда"
},
"noEditPermissions": {
"message": "У вас нет разрешения на редактирование этого элемента"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Overenie požadované iniciujúcim webom. Táto funkcia zatiaľ nie je implementovaná pre účty bez hlavného hesla." "message": "Overenie požadované iniciujúcim webom. Táto funkcia zatiaľ nie je implementovaná pre účty bez hlavného hesla."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Prihlásiť sa s prístupovým kľúčom?" "message": "Prihlásiť sa s prístupovým kľúčom?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Pre túto stránku nemáte zodpovedajúce prihlasovacie údaje." "message": "Pre túto stránku nemáte zodpovedajúce prihlasovacie údaje."
}, },
"noMatchingLoginsForSite": {
"message": "Pre túto stránku sa nenašli prihlasovacie údaje"
},
"confirm": { "confirm": {
"message": "Potvrdiť" "message": "Potvrdiť"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Uložiť prístupový kľúč ako nové prihlasovacie údaje" "message": "Uložiť prístupový kľúč ako nové prihlasovacie údaje"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Vyberte prihlasovacie údaje, do ktorých chcete uložiť prístupový kľúč" "message": "Vyberte prihlasovacie údaje, do ktorých chcete uložiť prístupový kľúč"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Vyberte prístupový kľúč, pomocou ktorého sa chcete prihlásiť"
},
"passkeyItem": { "passkeyItem": {
"message": "Položka prístupového kľúča" "message": "Položka prístupového kľúča"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "K dispozícii je ďalší obsah" "message": "K dispozícii je ďalší obsah"
},
"itemsInTrash": {
"message": "Položky v koši"
},
"noItemsInTrash": {
"message": "V koši nie sú žiadne položky"
},
"noItemsInTrashDesc": {
"message": "Položky, ktoré odstránite, sa zobrazia tu a po 30 dňoch sa odstránia natrvalo"
},
"trashWarning": {
"message": "Položky, ktoré boli v koši viac ako 30 dní budú automaticky odstránené"
},
"restore": {
"message": "Obnoviť"
},
"deleteForever": {
"message": "Natrvalo odstrániť"
},
"noEditPermissions": {
"message": "Na úpravu tejto položky nemáte oprávnenie"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -684,10 +684,10 @@
"message": "Ваш налог је креиран! Сада се можете пријавити." "message": "Ваш налог је креиран! Сада се можете пријавити."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Ваш нови налог је направљен!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Пријављени сте!"
}, },
"youSuccessfullyLoggedIn": { "youSuccessfullyLoggedIn": {
"message": "Успешно сте се пријавили" "message": "Успешно сте се пријавили"
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Верификацију захтева сајт који покреће. Ова функција још увек није имплементирана за налоге без главне лозинке." "message": "Верификацију захтева сајт који покреће. Ова функција још увек није имплементирана за налоге без главне лозинке."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Пријавите се са приступачним кључем?" "message": "Пријавите се са приступачним кључем?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Немате одговарајућу пријаву за овај сајт." "message": "Немате одговарајућу пријаву за овај сајт."
}, },
"noMatchingLoginsForSite": {
"message": "Нема одговарајућих пријава за овај сајт"
},
"confirm": { "confirm": {
"message": "Потврди" "message": "Потврди"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Сачувати приступни кључ као нову пријаву" "message": "Сачувати приступни кључ као нову пријаву"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Изаберите пријаву да бисте сачували овај приступни кључ" "message": "Изаберите пријаву да бисте сачували овај приступни кључ"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Изаберите приступни кључ за пријаву"
},
"passkeyItem": { "passkeyItem": {
"message": "Ставка приступачног кључа" "message": "Ставка приступачног кључа"
}, },
@ -4295,6 +4301,27 @@
"message": "Захтеви политике предузећа су примењени на ово подешавање" "message": "Захтеви политике предузећа су примењени на ово подешавање"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Додатни садржај је доступан"
},
"itemsInTrash": {
"message": "Ставке у смећу"
},
"noItemsInTrash": {
"message": "Нема ставки у смећу"
},
"noItemsInTrashDesc": {
"message": "Ставке које избришете ће се појавити овде и биће трајно избрисане након 30 дана"
},
"trashWarning": {
"message": "Ставке које су биле у смећу више од 30 дана биће аутоматски избрисане"
},
"restore": {
"message": "Поврати"
},
"deleteForever": {
"message": "Уклонити заувек"
},
"noEditPermissions": {
"message": "Немате дозволу да уређујете ову ставку"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verifiering krävs av den initierande webbplatsen. Denna funktion är ännu inte implementerad för konton utan huvudlösenord." "message": "Verifiering krävs av den initierande webbplatsen. Denna funktion är ännu inte implementerad för konton utan huvudlösenord."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Logga in med lösennyckel?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "En lösennyckel finns redan för detta program." "message": "En lösennyckel finns redan för detta program."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Det finns ingen matchande inloggning för denna webbplats." "message": "Det finns ingen matchande inloggning för denna webbplats."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Bekräfta" "message": "Bekräfta"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Spara lösennyckel som ny inloggning" "message": "Spara lösennyckel som ny inloggning"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Välj en inloggning för att spara denna lösennyckel till" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Lösennyckelobjekt" "message": "Lösennyckelobjekt"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Log in with passkey?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "You do not have a matching login for this site." "message": "You do not have a matching login for this site."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Confirm" "message": "Confirm"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Save passkey as new login" "message": "Save passkey as new login"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Choose a login to save this passkey to" "message": "Choose a login to save this passkey to"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
},
"passkeyItem": { "passkeyItem": {
"message": "Passkey Item" "message": "Passkey Item"
}, },
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Site kimlik doğrulaması gerektiriyor. Bu özellik henüz ana parolası olmayan hesaplarda kullanılamaz." "message": "Site kimlik doğrulaması gerektiriyor. Bu özellik henüz ana parolası olmayan hesaplarda kullanılamaz."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Geçiş anahtarı ile giriş yapılsın mı?" "message": "Geçiş anahtarı ile giriş yapılsın mı?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Bu siteyle eşleşen hiç hesabınız yok." "message": "Bu siteyle eşleşen hiç hesabınız yok."
}, },
"noMatchingLoginsForSite": {
"message": "Bu siteyle eşleşen hesap bulunamadı"
},
"confirm": { "confirm": {
"message": "Onayla" "message": "Onayla"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Geçiş anahtarını yeni hesap olarak kaydet" "message": "Geçiş anahtarını yeni hesap olarak kaydet"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Bu geçiş anahtarının kaydedileceği hesabı seçin" "message": "Bu geçiş anahtarının kaydedileceği hesabı seçin"
}, },
"chooseCipherForPasskeyAuth": {
"message": "Giriş yapılacak geçiş anahtarını seçin"
},
"passkeyItem": { "passkeyItem": {
"message": "Geçiş anahtarı kaydı" "message": "Geçiş anahtarı kaydı"
}, },
@ -4295,6 +4301,27 @@
"message": "Bu ayara kurumsal ilke gereksinimleri uygulandı" "message": "Bu ayara kurumsal ilke gereksinimleri uygulandı"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Ek içerikler mevcut"
},
"itemsInTrash": {
"message": "Çöp kutusundaki kayıtlar"
},
"noItemsInTrash": {
"message": "Çöp kutusunda hiç kayıt yok"
},
"noItemsInTrashDesc": {
"message": "Sildiğiniz kayıtlar burada görünecek ve 30 gün sonra kalıcı olarak silinecektir"
},
"trashWarning": {
"message": "30 günden uzun süre çöp kutusunda duran kayıtlar otomatik olarak silinecektir"
},
"restore": {
"message": "Geri yükle"
},
"deleteForever": {
"message": "Kalıcı olarak sil"
},
"noEditPermissions": {
"message": "Bu kaydı düzenleme yetkisine sahip değilsiniz"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Сайт ініціює обов'язкову верифікацію. Ця функція ще не реалізована для облікових записів без головного пароля." "message": "Сайт ініціює обов'язкову верифікацію. Ця функція ще не реалізована для облікових записів без головного пароля."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Увійти з ключем доступу?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Ключ доступу для цієї програми вже існує." "message": "Ключ доступу для цієї програми вже існує."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "У вас немає відповідних записів для цього сайту." "message": "У вас немає відповідних записів для цього сайту."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Підтвердити" "message": "Підтвердити"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Зберегти ключ доступу як новий запис" "message": "Зберегти ключ доступу як новий запис"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Виберіть запис для збереження цього ключа доступу" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Ключ доступу" "message": "Ключ доступу"
@ -4295,6 +4301,27 @@
"message": "До цього налаштування застосовано вимоги політики компанії" "message": "До цього налаштування застосовано вимоги політики компанії"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Доступний додатковий вміст"
},
"itemsInTrash": {
"message": "Записи в смітнику"
},
"noItemsInTrash": {
"message": "Немає записів у смітнику"
},
"noItemsInTrashDesc": {
"message": "Видалені записи з'являтимуться тут і будуть остаточно видалені через 30 днів"
},
"trashWarning": {
"message": "Записи, що знаходяться в смітнику понад 30 днів, автоматично видалятимуться"
},
"restore": {
"message": "Відновити"
},
"deleteForever": {
"message": "Видалити остаточно"
},
"noEditPermissions": {
"message": "Вам не дозволено редагувати цей запис"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Trang web yêu cầu xác minh. Tính năng này hiện chưa được hỗ trợ cho tài khoản không có mật khẩu chính." "message": "Trang web yêu cầu xác minh. Tính năng này hiện chưa được hỗ trợ cho tài khoản không có mật khẩu chính."
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "Đăng nhập bằng mã khoá?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Ứng dụng này đã có mã khoá." "message": "Ứng dụng này đã có mã khoá."
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "Bạn không có thông tin đăng nhập phù hợp cho trang web này." "message": "Bạn không có thông tin đăng nhập phù hợp cho trang web này."
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "Xác nhận" "message": "Xác nhận"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Lưu mã khoá như đăng nhập mới" "message": "Lưu mã khoá như đăng nhập mới"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "Chọn thông tin đăng nhập để lưu mã khoá này vào" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Mục mã khoá" "message": "Mục mã khoá"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -2586,7 +2586,7 @@
"message": "您的会话已超时。请返回然后尝试重新登录。" "message": "您的会话已超时。请返回然后尝试重新登录。"
}, },
"exportingPersonalVaultTitle": { "exportingPersonalVaultTitle": {
"message": "导出个人密码库" "message": "正在导出个人密码库"
}, },
"exportingIndividualVaultDescription": { "exportingIndividualVaultDescription": {
"message": "仅会导出与 $EMAIL$ 关联的个人密码库项目,不包括组织密码库项目。仅会导出密码库项目信息,不包括关联的附件。", "message": "仅会导出与 $EMAIL$ 关联的个人密码库项目,不包括组织密码库项目。仅会导出密码库项目信息,不包括关联的附件。",
@ -3477,7 +3477,7 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "启动站点需要验证。对于没有主密码的账户,此功能尚未实现。" "message": "启动站点需要验证。对于没有主密码的账户,此功能尚未实现。"
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "使用通行密钥登录吗?" "message": "使用通行密钥登录吗?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "不存在匹配此站点的登录项目。" "message": "不存在匹配此站点的登录项目。"
}, },
"noMatchingLoginsForSite": {
"message": "此站点没有匹配的登录项目"
},
"confirm": { "confirm": {
"message": "确认" "message": "确认"
}, },
@ -3498,9 +3501,12 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "作为新的登录项目保存通行密钥" "message": "作为新的登录项目保存通行密钥"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "选择一个用于保存此通行密钥的登录项目" "message": "选择一个用于保存此通行密钥的登录项目"
}, },
"chooseCipherForPasskeyAuth": {
"message": "选择一个用于登录的通行密钥"
},
"passkeyItem": { "passkeyItem": {
"message": "通行密钥项目" "message": "通行密钥项目"
}, },
@ -4295,6 +4301,27 @@
"message": "企业策略要求已应用于此设置" "message": "企业策略要求已应用于此设置"
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "其他内容可用"
},
"itemsInTrash": {
"message": "回收站中的项目"
},
"noItemsInTrash": {
"message": "回收站中没有项目"
},
"noItemsInTrashDesc": {
"message": "您删除的项目将显示在这里,并在 30 天后永久删除"
},
"trashWarning": {
"message": "回收站中超过 30 天的项目将被自动删除"
},
"restore": {
"message": "恢复"
},
"deleteForever": {
"message": "永久删除"
},
"noEditPermissions": {
"message": "您没有编辑此项目的权限"
} }
} }

View File

@ -3477,8 +3477,8 @@
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "發起站點需要驗證。對於沒有主密碼的帳戶,此功能尚未實現。" "message": "發起站點需要驗證。對於沒有主密碼的帳戶,此功能尚未實現。"
}, },
"logInWithPasskey": { "logInWithPasskeyQuestion": {
"message": "使用密碼金鑰登入?" "message": "Log in with passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "用於這個應用程式的密碼金鑰已經存在。" "message": "用於這個應用程式的密碼金鑰已經存在。"
@ -3489,6 +3489,9 @@
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "您沒有適用於此網站的登入項目。" "message": "您沒有適用於此網站的登入項目。"
}, },
"noMatchingLoginsForSite": {
"message": "No matching logins for this site"
},
"confirm": { "confirm": {
"message": "確認" "message": "確認"
}, },
@ -3498,8 +3501,11 @@
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "儲存密碼金鑰為新登入項目" "message": "儲存密碼金鑰為新登入項目"
}, },
"choosePasskey": { "chooseCipherForPasskeySave": {
"message": "選擇一個用於儲存此密碼金鑰的登入項目" "message": "Choose a login to save this passkey to"
},
"chooseCipherForPasskeyAuth": {
"message": "Choose a passkey to log in with"
}, },
"passkeyItem": { "passkeyItem": {
"message": "密碼金鑰項目" "message": "密碼金鑰項目"
@ -4296,5 +4302,26 @@
}, },
"additionalContentAvailable": { "additionalContentAvailable": {
"message": "Additional content is available" "message": "Additional content is available"
},
"itemsInTrash": {
"message": "Items in trash"
},
"noItemsInTrash": {
"message": "No items in trash"
},
"noItemsInTrashDesc": {
"message": "Items you delete will appear here and be permanently deleted after 30 days"
},
"trashWarning": {
"message": "Items that have been in trash more than 30 days will automatically be deleted"
},
"restore": {
"message": "Restore"
},
"deleteForever": {
"message": "Delete forever"
},
"noEditPermissions": {
"message": "You don't have permission to edit this item"
} }
} }

View File

@ -2,11 +2,17 @@ import { EVENTS } from "@bitwarden/common/autofill/constants";
import AutofillPageDetails from "../models/autofill-page-details"; import AutofillPageDetails from "../models/autofill-page-details";
import AutofillScript from "../models/autofill-script"; import AutofillScript from "../models/autofill-script";
import { SubmitLoginButtonNames } from "../services/autofill-constants";
import { CollectAutofillContentService } from "../services/collect-autofill-content.service"; import { CollectAutofillContentService } from "../services/collect-autofill-content.service";
import DomElementVisibilityService from "../services/dom-element-visibility.service"; import DomElementVisibilityService from "../services/dom-element-visibility.service";
import { DomQueryService } from "../services/dom-query.service"; import { DomQueryService } from "../services/dom-query.service";
import InsertAutofillContentService from "../services/insert-autofill-content.service"; import InsertAutofillContentService from "../services/insert-autofill-content.service";
import { elementIsInputElement, nodeIsFormElement, sendExtensionMessage } from "../utils"; import {
elementIsInputElement,
getSubmitButtonKeywordsSet,
nodeIsFormElement,
sendExtensionMessage,
} from "../utils";
(function (globalContext) { (function (globalContext) {
const domQueryService = new DomQueryService(); const domQueryService = new DomQueryService();
@ -19,17 +25,6 @@ import { elementIsInputElement, nodeIsFormElement, sendExtensionMessage } from "
domElementVisibilityService, domElementVisibilityService,
collectAutofillContentService, collectAutofillContentService,
); );
const loginKeywords = [
"login",
"log in",
"log-in",
"signin",
"sign in",
"sign-in",
"submit",
"continue",
"next",
];
let autoSubmitLoginTimeout: number | NodeJS.Timeout; let autoSubmitLoginTimeout: number | NodeJS.Timeout;
init(); init();
@ -194,26 +189,41 @@ import { elementIsInputElement, nodeIsFormElement, sendExtensionMessage } from "
element: HTMLElement, element: HTMLElement,
lastFieldIsPasswordInput = false, lastFieldIsPasswordInput = false,
): boolean { ): boolean {
const genericSubmitElement = domQueryService.deepQueryElements<HTMLButtonElement>( const genericSubmitElement = querySubmitButtonElement(element, "[type='submit']");
element, if (genericSubmitElement) {
"[type='submit']", clickSubmitElement(genericSubmitElement, lastFieldIsPasswordInput);
);
if (genericSubmitElement[0]) {
clickSubmitElement(genericSubmitElement[0], lastFieldIsPasswordInput);
return true; return true;
} }
const buttons = domQueryService.deepQueryElements<HTMLButtonElement>(element, "button"); const buttonElement = querySubmitButtonElement(element, "button, [type='button']");
for (let i = 0; i < buttons.length; i++) { if (buttonElement) {
if (isLoginButton(buttons[i])) { clickSubmitElement(buttonElement, lastFieldIsPasswordInput);
clickSubmitElement(buttons[i], lastFieldIsPasswordInput); return true;
return true;
}
} }
return false; return false;
} }
/**
* Queries the element for a submit button element. If an element is found and has keywords
* that indicate a login action, the element is returned.
*
* @param element - The element to query for submit buttons
* @param selector - The selector to query for submit buttons
*/
function querySubmitButtonElement(element: HTMLElement, selector: string) {
const submitButtonElements = domQueryService.deepQueryElements<HTMLButtonElement>(
element,
selector,
);
for (let index = 0; index < submitButtonElements.length; index++) {
const submitElement = submitButtonElements[index];
if (isLoginButton(submitElement)) {
return submitElement;
}
}
}
/** /**
* Handles clicking the submit element and optionally triggering * Handles clicking the submit element and optionally triggering
* a completion action for multistep login forms. * a completion action for multistep login forms.
@ -236,21 +246,10 @@ import { elementIsInputElement, nodeIsFormElement, sendExtensionMessage } from "
* @param element - The element to check * @param element - The element to check
*/ */
function isLoginButton(element: HTMLElement) { function isLoginButton(element: HTMLElement) {
const keywordValues = [ const keywordsSet = getSubmitButtonKeywordsSet(element);
element.textContent, const keywordValues = Array.from(keywordsSet).join(",");
element.getAttribute("value"),
element.getAttribute("aria-label"),
element.getAttribute("aria-labelledby"),
element.getAttribute("aria-describedby"),
element.getAttribute("title"),
element.getAttribute("id"),
element.getAttribute("name"),
element.getAttribute("class"),
]
.join(",")
.toLowerCase();
return loginKeywords.some((keyword) => keywordValues.includes(keyword)); return SubmitLoginButtonNames.some((keyword) => keywordValues.indexOf(keyword) > -1);
} }
/** /**

View File

@ -13,6 +13,7 @@ export type SubmitButtonKeywordsMap = WeakMap<HTMLElement, string>;
export interface InlineMenuFieldQualificationService { export interface InlineMenuFieldQualificationService {
isUsernameField(field: AutofillField): boolean; isUsernameField(field: AutofillField): boolean;
isCurrentPasswordField(field: AutofillField): boolean;
isNewPasswordField(field: AutofillField): boolean; isNewPasswordField(field: AutofillField): boolean;
isEmailField(field: AutofillField): boolean; isEmailField(field: AutofillField): boolean;
isFieldForLoginForm(field: AutofillField, pageDetails: AutofillPageDetails): boolean; isFieldForLoginForm(field: AutofillField, pageDetails: AutofillPageDetails): boolean;

View File

@ -90,6 +90,7 @@ export class CreditCardAutoFillConstants {
"data-stripe", "data-stripe",
"htmlName", "htmlName",
"htmlID", "htmlID",
"title",
"label-tag", "label-tag",
"placeholder", "placeholder",
"label-left", "label-left",
@ -299,6 +300,54 @@ export class CreditCardAutoFillConstants {
"cb-type", "cb-type",
]; ];
static readonly CardExpiryDateDelimiters: string[] = ["/", "-", ".", " "];
// Note, these are expressions of user-guidance for the expected expiry date format to be used
static readonly CardExpiryDateFormats: CardExpiryDateFormat[] = [
// English
{
Month: "mm",
MonthShort: "m",
Year: "yyyy",
YearShort: "yy",
},
// Danish
{
Month: "mm",
MonthShort: "m",
Year: "åååå",
YearShort: "åå",
},
// German/Dutch
{
Month: "mm",
MonthShort: "m",
Year: "jjjj",
YearShort: "jj",
},
// French/Spanish/Italian
{
Month: "mm",
MonthShort: "m",
Year: "aa",
YearShort: "aa",
},
// Russian
{
Month: "мм",
MonthShort: "м",
Year: "гггг",
YearShort: "гг",
},
// Portuguese
{
Month: "mm",
MonthShort: "m",
Year: "rrrr",
YearShort: "rr",
},
];
// Each index represents a language. These three arrays should all be the same length. // Each index represents a language. These three arrays should all be the same length.
// 0: English, 1: Danish, 2: German/Dutch, 3: French/Spanish/Italian, 4: Russian, 5: Portuguese // 0: English, 1: Danish, 2: German/Dutch, 3: French/Spanish/Italian, 4: Russian, 5: Portuguese
static readonly MonthAbbr = ["mm", "mm", "mm", "mm", "мм", "mm"]; static readonly MonthAbbr = ["mm", "mm", "mm", "mm", "мм", "mm"];
@ -306,6 +355,13 @@ export class CreditCardAutoFillConstants {
static readonly YearAbbrLong = ["yyyy", "åååå", "jjjj", "aa", "гггг", "rrrr"]; static readonly YearAbbrLong = ["yyyy", "åååå", "jjjj", "aa", "гггг", "rrrr"];
} }
export type CardExpiryDateFormat = {
Month: string;
MonthShort: string;
Year: string;
YearShort: string;
};
export class IdentityAutoFillConstants { export class IdentityAutoFillConstants {
static readonly IdentityAttributes: string[] = [ static readonly IdentityAttributes: string[] = [
"autoCompleteType", "autoCompleteType",

View File

@ -87,6 +87,11 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ
destroyAutofillInlineMenuListeners: () => this.destroy(), destroyAutofillInlineMenuListeners: () => this.destroy(),
getFormFieldDataForNotification: () => this.handleGetFormFieldDataForNotificationMessage(), getFormFieldDataForNotification: () => this.handleGetFormFieldDataForNotificationMessage(),
}; };
private readonly loginFieldQualifiers: Record<string, CallableFunction> = {
[AutofillFieldQualifier.username]: this.inlineMenuFieldQualificationService.isUsernameField,
[AutofillFieldQualifier.password]:
this.inlineMenuFieldQualificationService.isCurrentPasswordField,
};
private readonly cardFieldQualifiers: Record<string, CallableFunction> = { private readonly cardFieldQualifiers: Record<string, CallableFunction> = {
[AutofillFieldQualifier.cardholderName]: [AutofillFieldQualifier.cardholderName]:
this.inlineMenuFieldQualificationService.isFieldForCardholderName, this.inlineMenuFieldQualificationService.isFieldForCardholderName,
@ -781,12 +786,14 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ
* @param autofillFieldData - Autofill field data captured from the form field element. * @param autofillFieldData - Autofill field data captured from the form field element.
*/ */
private qualifyUserFilledLoginField(autofillFieldData: AutofillField) { private qualifyUserFilledLoginField(autofillFieldData: AutofillField) {
if (autofillFieldData.type === "password") { for (const [fieldQualifier, fieldQualifierFunction] of Object.entries(
autofillFieldData.fieldQualifier = AutofillFieldQualifier.password; this.loginFieldQualifiers,
return; )) {
if (fieldQualifierFunction(autofillFieldData)) {
autofillFieldData.fieldQualifier = fieldQualifier as AutofillFieldQualifierType;
return;
}
} }
autofillFieldData.fieldQualifier = AutofillFieldQualifier.username;
} }
/** /**

View File

@ -2475,10 +2475,10 @@ describe("AutofillService", () => {
options.cipher.card = mock<CardView>(); options.cipher.card = mock<CardView>();
}); });
it("returns null if the passed options contains a cipher with no card view", () => { it("returns null if the passed options contains a cipher with no card view", async () => {
options.cipher.card = undefined; options.cipher.card = undefined;
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2499,7 +2499,7 @@ describe("AutofillService", () => {
untrustedIframe: false, untrustedIframe: false,
}; };
it("returns an unmodified fill script when the field is a `span` field", () => { it("returns an unmodified fill script when the field is a `span` field", async () => {
const spanField = createAutofillFieldMock({ const spanField = createAutofillFieldMock({
opid: "span-field", opid: "span-field",
form: "validFormId", form: "validFormId",
@ -2510,7 +2510,7 @@ describe("AutofillService", () => {
pageDetails.fields = [spanField]; pageDetails.fields = [spanField];
jest.spyOn(AutofillService, "isExcludedFieldType"); jest.spyOn(AutofillService, "isExcludedFieldType");
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2522,7 +2522,7 @@ describe("AutofillService", () => {
}); });
AutoFillConstants.ExcludedAutofillTypes.forEach((excludedType) => { AutoFillConstants.ExcludedAutofillTypes.forEach((excludedType) => {
it(`returns an unmodified fill script when the field has a '${excludedType}' type`, () => { it(`returns an unmodified fill script when the field has a '${excludedType}' type`, async () => {
const invalidField = createAutofillFieldMock({ const invalidField = createAutofillFieldMock({
opid: `${excludedType}-field`, opid: `${excludedType}-field`,
form: "validFormId", form: "validFormId",
@ -2533,7 +2533,7 @@ describe("AutofillService", () => {
pageDetails.fields = [invalidField]; pageDetails.fields = [invalidField];
jest.spyOn(AutofillService, "isExcludedFieldType"); jest.spyOn(AutofillService, "isExcludedFieldType");
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2548,7 +2548,7 @@ describe("AutofillService", () => {
}); });
}); });
it("returns an unmodified fill script when the field is not viewable", () => { it("returns an unmodified fill script when the field is not viewable", async () => {
const notViewableField = createAutofillFieldMock({ const notViewableField = createAutofillFieldMock({
opid: "invalid-field", opid: "invalid-field",
form: "validFormId", form: "validFormId",
@ -2561,7 +2561,7 @@ describe("AutofillService", () => {
jest.spyOn(AutofillService, "forCustomFieldsOnly"); jest.spyOn(AutofillService, "forCustomFieldsOnly");
jest.spyOn(AutofillService, "isExcludedFieldType"); jest.spyOn(AutofillService, "isExcludedFieldType");
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2663,8 +2663,8 @@ describe("AutofillService", () => {
jest.spyOn(autofillService as any, "makeScriptActionWithValue"); jest.spyOn(autofillService as any, "makeScriptActionWithValue");
}); });
it("returns a fill script containing all of the passed card fields", () => { it("returns a fill script containing all of the passed card fields", async () => {
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2745,11 +2745,11 @@ describe("AutofillService", () => {
options.cipher.card.expMonth = "05"; options.cipher.card.expMonth = "05";
}); });
it("returns an expiration month parsed from found select options within the field", () => { it("returns an expiration month parsed from found select options within the field", async () => {
const testValue = "sometestvalue"; const testValue = "sometestvalue";
expMonthField.selectInfo.options[4] = ["May", testValue]; expMonthField.selectInfo.options[4] = ["May", testValue];
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2759,12 +2759,12 @@ describe("AutofillService", () => {
expect(value.script[2]).toStrictEqual(["fill_by_opid", expMonthField.opid, testValue]); expect(value.script[2]).toStrictEqual(["fill_by_opid", expMonthField.opid, testValue]);
}); });
it("returns an expiration month parsed from found select options within the field when the select field has an empty option at the end of the list of options", () => { it("returns an expiration month parsed from found select options within the field when the select field has an empty option at the end of the list of options", async () => {
const testValue = "sometestvalue"; const testValue = "sometestvalue";
expMonthField.selectInfo.options[4] = ["May", testValue]; expMonthField.selectInfo.options[4] = ["May", testValue];
expMonthField.selectInfo.options.push(["", ""]); expMonthField.selectInfo.options.push(["", ""]);
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2774,12 +2774,12 @@ describe("AutofillService", () => {
expect(value.script[2]).toStrictEqual(["fill_by_opid", expMonthField.opid, testValue]); expect(value.script[2]).toStrictEqual(["fill_by_opid", expMonthField.opid, testValue]);
}); });
it("returns an expiration month parsed from found select options within the field when the select field has an empty option at the start of the list of options", () => { it("returns an expiration month parsed from found select options within the field when the select field has an empty option at the start of the list of options", async () => {
const testValue = "sometestvalue"; const testValue = "sometestvalue";
expMonthField.selectInfo.options[4] = ["May", testValue]; expMonthField.selectInfo.options[4] = ["May", testValue];
expMonthField.selectInfo.options.unshift(["", ""]); expMonthField.selectInfo.options.unshift(["", ""]);
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2789,13 +2789,13 @@ describe("AutofillService", () => {
expect(value.script[2]).toStrictEqual(["fill_by_opid", expMonthField.opid, testValue]); expect(value.script[2]).toStrictEqual(["fill_by_opid", expMonthField.opid, testValue]);
}); });
it("returns an expiration month with a zero attached if the field requires two characters, and the vault item has only one character", () => { it("returns an expiration month with a zero attached if the field requires two characters, and the vault item has only one character", async () => {
options.cipher.card.expMonth = "5"; options.cipher.card.expMonth = "5";
expMonthField.selectInfo = null; expMonthField.selectInfo = null;
expMonthField.placeholder = "mm"; expMonthField.placeholder = "mm";
expMonthField.maxLength = 2; expMonthField.maxLength = 2;
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2830,12 +2830,12 @@ describe("AutofillService", () => {
options.cipher.card.expYear = "2024"; options.cipher.card.expYear = "2024";
}); });
it("returns an expiration year parsed from the select options if an exact match is found for either the select option text or value", () => { it("returns an expiration year parsed from the select options if an exact match is found for either the select option text or value", async () => {
const someTestValue = "sometestvalue"; const someTestValue = "sometestvalue";
expYearField.selectInfo.options[1] = ["2024", someTestValue]; expYearField.selectInfo.options[1] = ["2024", someTestValue];
options.cipher.card.expYear = someTestValue; options.cipher.card.expYear = someTestValue;
let value = autofillService["generateCardFillScript"]( let value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2846,7 +2846,7 @@ describe("AutofillService", () => {
expYearField.selectInfo.options[1] = [someTestValue, "2024"]; expYearField.selectInfo.options[1] = [someTestValue, "2024"];
value = autofillService["generateCardFillScript"]( value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2856,12 +2856,12 @@ describe("AutofillService", () => {
expect(value.script[2]).toStrictEqual(["fill_by_opid", expYearField.opid, someTestValue]); expect(value.script[2]).toStrictEqual(["fill_by_opid", expYearField.opid, someTestValue]);
}); });
it("returns an expiration year parsed from the select options if the value of an option contains only two characters and the vault item value contains four characters", () => { it("returns an expiration year parsed from the select options if the value of an option contains only two characters and the vault item value contains four characters", async () => {
const yearValue = "26"; const yearValue = "26";
expYearField.selectInfo.options.push(["The year 2026", yearValue]); expYearField.selectInfo.options.push(["The year 2026", yearValue]);
options.cipher.card.expYear = "2026"; options.cipher.card.expYear = "2026";
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2871,13 +2871,13 @@ describe("AutofillService", () => {
expect(value.script[2]).toStrictEqual(["fill_by_opid", expYearField.opid, yearValue]); expect(value.script[2]).toStrictEqual(["fill_by_opid", expYearField.opid, yearValue]);
}); });
it("returns an expiration year parsed from the select options if the vault of an option is separated by a colon", () => { it("returns an expiration year parsed from the select options if the vault of an option is separated by a colon", async () => {
const yearValue = "26"; const yearValue = "26";
const colonSeparatedYearValue = `2:0${yearValue}`; const colonSeparatedYearValue = `2:0${yearValue}`;
expYearField.selectInfo.options.push(["The year 2026", colonSeparatedYearValue]); expYearField.selectInfo.options.push(["The year 2026", colonSeparatedYearValue]);
options.cipher.card.expYear = yearValue; options.cipher.card.expYear = yearValue;
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2891,14 +2891,14 @@ describe("AutofillService", () => {
]); ]);
}); });
it("returns an expiration year with `20` prepended to the vault item value if the field to be filled expects a `yyyy` format but the vault item only has two characters", () => { it("returns an expiration year with `20` prepended to the vault item value if the field to be filled expects a `yyyy` format but the vault item only has two characters", async () => {
const yearValue = "26"; const yearValue = "26";
expYearField.selectInfo = null; expYearField.selectInfo = null;
expYearField.placeholder = "yyyy"; expYearField.placeholder = "yyyy";
expYearField.maxLength = 4; expYearField.maxLength = 4;
options.cipher.card.expYear = yearValue; options.cipher.card.expYear = yearValue;
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2912,14 +2912,14 @@ describe("AutofillService", () => {
]); ]);
}); });
it("returns an expiration year with only the last two values if the field to be filled expects a `yy` format but the vault item contains four characters", () => { it("returns an expiration year with only the last two values if the field to be filled expects a `yy` format but the vault item contains four characters", async () => {
const yearValue = "26"; const yearValue = "26";
expYearField.selectInfo = null; expYearField.selectInfo = null;
expYearField.placeholder = "yy"; expYearField.placeholder = "yy";
expYearField.maxLength = 2; expYearField.maxLength = 2;
options.cipher.card.expYear = `20${yearValue}`; options.cipher.card.expYear = `20${yearValue}`;
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2930,11 +2930,26 @@ describe("AutofillService", () => {
}); });
}); });
const expectedDateFormats = [
["mm/yyyy", "05/2024"],
["mm/yy", "05/24"],
["yyyy/mm", "2024/05"],
["yy/mm", "24/05"],
["mm-yyyy", "05-2024"],
["mm-yy", "05-24"],
["yyyy-mm", "2024-05"],
["yy-mm", "24-05"],
["yyyymm", "202405"],
["yymm", "2405"],
["mmyyyy", "052024"],
["mmyy", "0524"],
];
describe("given a generic expiration date field", () => { describe("given a generic expiration date field", () => {
let expirationDateField: AutofillField; let expirationDateField: AutofillField;
let expirationDateFieldView: FieldView; let expirationDateFieldView: FieldView;
beforeEach(() => { beforeEach(() => {
configService.getFeatureFlag.mockResolvedValue(false);
expirationDateField = createAutofillFieldMock({ expirationDateField = createAutofillFieldMock({
opid: "expirationDate", opid: "expirationDate",
form: "validFormId", form: "validFormId",
@ -2949,23 +2964,11 @@ describe("AutofillService", () => {
options.cipher.card.expYear = "2024"; options.cipher.card.expYear = "2024";
}); });
const expectedDateFormats = [
["mm/yyyy", "05/2024"],
["mm/yy", "05/24"],
["yyyy/mm", "2024/05"],
["yy/mm", "24/05"],
["mm-yyyy", "05-2024"],
["mm-yy", "05-24"],
["yyyy-mm", "2024-05"],
["yy-mm", "24-05"],
["yyyymm", "202405"],
["yymm", "2405"],
["mmyyyy", "052024"],
["mmyy", "0524"],
];
expectedDateFormats.forEach((dateFormat, index) => { expectedDateFormats.forEach((dateFormat, index) => {
it(`returns an expiration date format matching '${dateFormat[0]}'`, () => { it(`returns an expiration date format matching '${dateFormat[0]}'`, async () => {
expirationDateField.placeholder = dateFormat[0]; expirationDateField.placeholder = dateFormat[0];
// test alternate stored cipher value formats
if (index === 0) { if (index === 0) {
options.cipher.card.expYear = "24"; options.cipher.card.expYear = "24";
} }
@ -2973,7 +2976,13 @@ describe("AutofillService", () => {
options.cipher.card.expMonth = "5"; options.cipher.card.expMonth = "5";
} }
const value = autofillService["generateCardFillScript"]( const enableNewCardCombinedExpiryAutofill = await configService.getFeatureFlag(
FeatureFlag.EnableNewCardCombinedExpiryAutofill,
);
expect(enableNewCardCombinedExpiryAutofill).toEqual(false);
const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
@ -2984,17 +2993,128 @@ describe("AutofillService", () => {
}); });
}); });
it("returns an expiration date format matching `yyyy-mm` if no valid format can be identified", () => { it("returns an expiration date format matching `yyyy-mm` if no valid format can be identified", async () => {
const value = autofillService["generateCardFillScript"]( const value = await autofillService["generateCardFillScript"](
fillScript, fillScript,
pageDetails, pageDetails,
filledFields, filledFields,
options, options,
); );
const enableNewCardCombinedExpiryAutofill = await configService.getFeatureFlag(
FeatureFlag.EnableNewCardCombinedExpiryAutofill,
);
expect(enableNewCardCombinedExpiryAutofill).toEqual(false);
expect(value.script[2]).toStrictEqual(["fill_by_opid", "expirationDate", "2024-05"]); expect(value.script[2]).toStrictEqual(["fill_by_opid", "expirationDate", "2024-05"]);
}); });
}); });
const extraExpectedDateFormats = [
...expectedDateFormats,
["m yy", "5 24"],
["m yyyy", "5 2024"],
["m-yy", "5-24"],
["m-yyyy", "5-2024"],
["m.yy", "5.24"],
["m.yyyy", "5.2024"],
["m/yy", "5/24"],
["m/yyyy", "5/2024"],
["mm åååå", "05 2024"],
["mm yy", "05 24"],
["mm yyyy", "05 2024"],
["mm.yy", "05.24"],
["mm.yyyy", "05.2024"],
["myy", "524"],
["myyyy", "52024"],
["yy m", "24 5"],
["yy mm", "24 05"],
["yy mm", "24 05"],
["yy-m", "24-5"],
["yy.m", "24.5"],
["yy.mm", "24.05"],
["yy/m", "24/5"],
["yym", "245"],
["yyyy m", "2024 5"],
["yyyy mm", "2024 05"],
["yyyy-m", "2024-5"],
["yyyy.m", "2024.5"],
["yyyy.mm", "2024.05"],
["yyyy/m", "2024/5"],
["yyyym", "20245"],
["мм гг", "05 24"],
];
describe("given a generic expiration date field with the `enable-new-card-combined-expiry-autofill` feature-flag enabled", () => {
let expirationDateField: AutofillField;
let expirationDateFieldView: FieldView;
beforeEach(() => {
configService.getFeatureFlag.mockResolvedValue(true);
expirationDateField = createAutofillFieldMock({
opid: "expirationDate",
form: "validFormId",
elementNumber: 3,
htmlName: "expiration-date",
});
filledFields["exp-field"] = expirationDateField;
expirationDateFieldView = mock<FieldView>({ name: "exp" });
pageDetails.fields = [expirationDateField];
options.cipher.fields = [expirationDateFieldView];
options.cipher.card.expMonth = "05";
options.cipher.card.expYear = "2024";
});
afterEach(() => {
configService.getFeatureFlag.mockResolvedValue(false);
});
extraExpectedDateFormats.forEach((dateFormat, index) => {
it(`feature-flagged logic returns an expiration date format matching '${dateFormat[0]}'`, async () => {
expirationDateField.placeholder = dateFormat[0];
// test alternate stored cipher value formats
if (index === 0) {
options.cipher.card.expYear = "24";
}
if (index === 1) {
options.cipher.card.expMonth = "05";
}
const enableNewCardCombinedExpiryAutofill = await configService.getFeatureFlag(
FeatureFlag.EnableNewCardCombinedExpiryAutofill,
);
expect(enableNewCardCombinedExpiryAutofill).toEqual(true);
const value = await autofillService["generateCardFillScript"](
fillScript,
pageDetails,
filledFields,
options,
);
expect(value.script[2]).toStrictEqual(["fill_by_opid", "expirationDate", dateFormat[1]]);
});
});
it("feature-flagged logic returns an expiration date format matching `mm/yy` if no valid format can be identified", async () => {
const value = await autofillService["generateCardFillScript"](
fillScript,
pageDetails,
filledFields,
options,
);
const enableNewCardCombinedExpiryAutofill = await configService.getFeatureFlag(
FeatureFlag.EnableNewCardCombinedExpiryAutofill,
);
expect(enableNewCardCombinedExpiryAutofill).toEqual(true);
expect(value.script[2]).toStrictEqual(["fill_by_opid", "expirationDate", "05/24"]);
});
});
}); });
describe("inUntrustedIframe", () => { describe("inUntrustedIframe", () => {

View File

@ -26,6 +26,7 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi
import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service";
import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; import { FieldType, CipherType } from "@bitwarden/common/vault/enums";
import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type";
import { CardView } from "@bitwarden/common/vault/models/view/card.view";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view";
import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view"; import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view";
@ -50,6 +51,7 @@ import {
} from "./abstractions/autofill.service"; } from "./abstractions/autofill.service";
import { import {
AutoFillConstants, AutoFillConstants,
CardExpiryDateFormat,
CreditCardAutoFillConstants, CreditCardAutoFillConstants,
IdentityAutoFillConstants, IdentityAutoFillConstants,
} from "./autofill-constants"; } from "./autofill-constants";
@ -721,7 +723,12 @@ export default class AutofillService implements AutofillServiceInterface {
); );
break; break;
case CipherType.Card: case CipherType.Card:
fillScript = this.generateCardFillScript(fillScript, pageDetails, filledFields, options); fillScript = await this.generateCardFillScript(
fillScript,
pageDetails,
filledFields,
options,
);
break; break;
case CipherType.Identity: case CipherType.Identity:
fillScript = await this.generateIdentityFillScript( fillScript = await this.generateIdentityFillScript(
@ -937,12 +944,12 @@ export default class AutofillService implements AutofillServiceInterface {
* @returns {AutofillScript|null} * @returns {AutofillScript|null}
* @private * @private
*/ */
private generateCardFillScript( private async generateCardFillScript(
fillScript: AutofillScript, fillScript: AutofillScript,
pageDetails: AutofillPageDetails, pageDetails: AutofillPageDetails,
filledFields: { [id: string]: AutofillField }, filledFields: { [id: string]: AutofillField },
options: GenerateFillScriptOptions, options: GenerateFillScriptOptions,
): AutofillScript | null { ): Promise<AutofillScript | null> {
if (!options.cipher.card) { if (!options.cipher.card) {
return null; return null;
} }
@ -1027,6 +1034,7 @@ export default class AutofillService implements AutofillServiceInterface {
this.makeScriptAction(fillScript, card, fillFields, filledFields, "code"); this.makeScriptAction(fillScript, card, fillFields, filledFields, "code");
this.makeScriptAction(fillScript, card, fillFields, filledFields, "brand"); this.makeScriptAction(fillScript, card, fillFields, filledFields, "brand");
// There is an expiration month field and the cipher has an expiration month value
if (fillFields.expMonth && AutofillService.hasValue(card.expMonth)) { if (fillFields.expMonth && AutofillService.hasValue(card.expMonth)) {
let expMonth: string = card.expMonth; let expMonth: string = card.expMonth;
@ -1065,6 +1073,7 @@ export default class AutofillService implements AutofillServiceInterface {
AutofillService.fillByOpid(fillScript, fillFields.expMonth, expMonth); AutofillService.fillByOpid(fillScript, fillFields.expMonth, expMonth);
} }
// There is an expiration year field and the cipher has an expiration year value
if (fillFields.expYear && AutofillService.hasValue(card.expYear)) { if (fillFields.expYear && AutofillService.hasValue(card.expYear)) {
let expYear: string = card.expYear; let expYear: string = card.expYear;
if (fillFields.expYear.selectInfo && fillFields.expYear.selectInfo.options) { if (fillFields.expYear.selectInfo && fillFields.expYear.selectInfo.options) {
@ -1111,142 +1120,174 @@ export default class AutofillService implements AutofillServiceInterface {
AutofillService.fillByOpid(fillScript, fillFields.expYear, expYear); AutofillService.fillByOpid(fillScript, fillFields.expYear, expYear);
} }
// There is a single expiry date field (combined values) and the cipher has both expiration month and year
if ( if (
fillFields.exp && fillFields.exp &&
AutofillService.hasValue(card.expMonth) && AutofillService.hasValue(card.expMonth) &&
AutofillService.hasValue(card.expYear) AutofillService.hasValue(card.expYear)
) { ) {
const fullMonth = ("0" + card.expMonth).slice(-2); let combinedExpiryFillValue = null;
let fullYear: string = card.expYear; const enableNewCardCombinedExpiryAutofill = await this.configService.getFeatureFlag(
let partYear: string = null; FeatureFlag.EnableNewCardCombinedExpiryAutofill,
if (fullYear.length === 2) { );
partYear = fullYear;
fullYear = normalizeExpiryYearFormat(fullYear);
} else if (fullYear.length === 4) {
partYear = fullYear.substr(2, 2);
}
let exp: string = null; if (enableNewCardCombinedExpiryAutofill) {
for (let i = 0; i < CreditCardAutoFillConstants.MonthAbbr.length; i++) { combinedExpiryFillValue = this.generateCombinedExpiryValue(card, fillFields.exp);
if ( } else {
this.fieldAttrsContain( const fullMonth = ("0" + card.expMonth).slice(-2);
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] + let fullYear: string = card.expYear;
"/" + let partYear: string = null;
CreditCardAutoFillConstants.YearAbbrLong[i], if (fullYear.length === 2) {
) partYear = fullYear;
) { fullYear = normalizeExpiryYearFormat(fullYear);
exp = fullMonth + "/" + fullYear; } else if (fullYear.length === 4) {
} else if ( partYear = fullYear.substr(2, 2);
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
"/" +
CreditCardAutoFillConstants.YearAbbrShort[i],
) &&
partYear != null
) {
exp = fullMonth + "/" + partYear;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrLong[i] +
"/" +
CreditCardAutoFillConstants.MonthAbbr[i],
)
) {
exp = fullYear + "/" + fullMonth;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrShort[i] +
"/" +
CreditCardAutoFillConstants.MonthAbbr[i],
) &&
partYear != null
) {
exp = partYear + "/" + fullMonth;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
"-" +
CreditCardAutoFillConstants.YearAbbrLong[i],
)
) {
exp = fullMonth + "-" + fullYear;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
"-" +
CreditCardAutoFillConstants.YearAbbrShort[i],
) &&
partYear != null
) {
exp = fullMonth + "-" + partYear;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrLong[i] +
"-" +
CreditCardAutoFillConstants.MonthAbbr[i],
)
) {
exp = fullYear + "-" + fullMonth;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrShort[i] +
"-" +
CreditCardAutoFillConstants.MonthAbbr[i],
) &&
partYear != null
) {
exp = partYear + "-" + fullMonth;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrLong[i] + CreditCardAutoFillConstants.MonthAbbr[i],
)
) {
exp = fullYear + fullMonth;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrShort[i] + CreditCardAutoFillConstants.MonthAbbr[i],
) &&
partYear != null
) {
exp = partYear + fullMonth;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.YearAbbrLong[i],
)
) {
exp = fullMonth + fullYear;
} else if (
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.YearAbbrShort[i],
) &&
partYear != null
) {
exp = fullMonth + partYear;
} }
if (exp != null) { for (let i = 0; i < CreditCardAutoFillConstants.MonthAbbr.length; i++) {
break; if (
// mm/yyyy
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
"/" +
CreditCardAutoFillConstants.YearAbbrLong[i],
)
) {
combinedExpiryFillValue = fullMonth + "/" + fullYear;
} else if (
// mm/yy
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
"/" +
CreditCardAutoFillConstants.YearAbbrShort[i],
) &&
partYear != null
) {
combinedExpiryFillValue = fullMonth + "/" + partYear;
} else if (
// yyyy/mm
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrLong[i] +
"/" +
CreditCardAutoFillConstants.MonthAbbr[i],
)
) {
combinedExpiryFillValue = fullYear + "/" + fullMonth;
} else if (
// yy/mm
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrShort[i] +
"/" +
CreditCardAutoFillConstants.MonthAbbr[i],
) &&
partYear != null
) {
combinedExpiryFillValue = partYear + "/" + fullMonth;
} else if (
// mm-yyyy
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
"-" +
CreditCardAutoFillConstants.YearAbbrLong[i],
)
) {
combinedExpiryFillValue = fullMonth + "-" + fullYear;
} else if (
// mm-yy
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
"-" +
CreditCardAutoFillConstants.YearAbbrShort[i],
) &&
partYear != null
) {
combinedExpiryFillValue = fullMonth + "-" + partYear;
} else if (
// yyyy-mm
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrLong[i] +
"-" +
CreditCardAutoFillConstants.MonthAbbr[i],
)
) {
combinedExpiryFillValue = fullYear + "-" + fullMonth;
} else if (
// yy-mm
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrShort[i] +
"-" +
CreditCardAutoFillConstants.MonthAbbr[i],
) &&
partYear != null
) {
combinedExpiryFillValue = partYear + "-" + fullMonth;
} else if (
// yyyymm
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrLong[i] +
CreditCardAutoFillConstants.MonthAbbr[i],
)
) {
combinedExpiryFillValue = fullYear + fullMonth;
} else if (
// yymm
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.YearAbbrShort[i] +
CreditCardAutoFillConstants.MonthAbbr[i],
) &&
partYear != null
) {
combinedExpiryFillValue = partYear + fullMonth;
} else if (
// mmyyyy
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
CreditCardAutoFillConstants.YearAbbrLong[i],
)
) {
combinedExpiryFillValue = fullMonth + fullYear;
} else if (
// mmyy
this.fieldAttrsContain(
fillFields.exp,
CreditCardAutoFillConstants.MonthAbbr[i] +
CreditCardAutoFillConstants.YearAbbrShort[i],
) &&
partYear != null
) {
combinedExpiryFillValue = fullMonth + partYear;
}
if (combinedExpiryFillValue != null) {
break;
}
}
// If none of the previous cases applied, set as default
if (combinedExpiryFillValue == null) {
combinedExpiryFillValue = fullYear + "-" + fullMonth;
} }
} }
if (exp == null) { this.makeScriptActionWithValue(
exp = fullYear + "-" + fullMonth; fillScript,
} combinedExpiryFillValue,
fillFields.exp,
this.makeScriptActionWithValue(fillScript, exp, fillFields.exp, filledFields); filledFields,
);
} }
return fillScript; return fillScript;
@ -1287,28 +1328,169 @@ export default class AutofillService implements AutofillServiceInterface {
* Used when handling autofill on credit card fields. Determines whether * Used when handling autofill on credit card fields. Determines whether
* the field has an attribute that matches the given value. * the field has an attribute that matches the given value.
* @param {AutofillField} field * @param {AutofillField} field
* @param {string} containsVal * @param {string} containsValue
* @returns {boolean} * @returns {boolean}
* @private * @private
*/ */
private fieldAttrsContain(field: AutofillField, containsVal: string): boolean { private fieldAttrsContain(field: AutofillField, containsValue: string): boolean {
if (!field) { if (!field) {
return false; return false;
} }
let doesContain = false; let doesContainValue = false;
CreditCardAutoFillConstants.CardAttributesExtended.forEach((attr) => { CreditCardAutoFillConstants.CardAttributesExtended.forEach((attributeName) => {
// eslint-disable-next-line // eslint-disable-next-line no-prototype-builtins
if (doesContain || !field.hasOwnProperty(attr) || !field[attr]) { if (doesContainValue || !field[attributeName]) {
return; return;
} }
let val = field[attr]; let fieldValue = field[attributeName];
val = val.replace(/ /g, "").toLowerCase(); fieldValue = fieldValue.replace(/ /g, "").toLowerCase();
doesContain = val.indexOf(containsVal) > -1; doesContainValue = fieldValue.indexOf(containsValue) > -1;
}); });
return doesContain; return doesContainValue;
}
/**
* Returns a string value representation of the combined card expiration month and year values
* in a format matching discovered guidance within the field attributes (typically provided for users).
*
* @param {CardView} cardCipher
* @param {AutofillField} field
*/
private generateCombinedExpiryValue(cardCipher: CardView, field: AutofillField): string {
/*
Some expectations of the passed stored card cipher view:
- At the time of writing, the stored card expiry year value (`expYear`)
can be any arbitrary string (no format validation). We may attempt some format
normalization here, but expect the user to have entered a string of integers
with a length of 2 or 4
- the `expiration` property cannot be used for autofill as it is an opinionated
format
- `expMonth` a stringified integer stored with no zero-padding and is not
zero-indexed (e.g. January is "1", not "01" or 0)
*/
// Expiry format options
let useMonthPadding = true;
let useYearFull = false;
let delimiter = "/";
let orderByYear = false;
// Because users are allowed to store truncated years, we need to make assumptions
// about the full year format when called for
const currentCentury = `${new Date().getFullYear()}`.slice(0, 2);
// Note, we construct the output rather than doing string replacement against the
// format guidance pattern to avoid edge cases that would output invalid values
const [
// The guidance parsed from the field properties regarding expiry format
expectedExpiryDateFormat,
// The (localized) date pattern set that was used to parse the expiry format guidance
expiryDateFormatPatterns,
] = this.getExpectedExpiryDateFormat(field);
if (expectedExpiryDateFormat) {
const { Month, MonthShort, Year } = expiryDateFormatPatterns;
const expiryDateDelimitersPattern =
"\\" + CreditCardAutoFillConstants.CardExpiryDateDelimiters.join("\\");
// assign the delimiter from the expected format string
delimiter =
expectedExpiryDateFormat.match(new RegExp(`[${expiryDateDelimitersPattern}]`, "g"))?.[0] ||
"";
// check if the expected format starts with a month form
// order matters here; check long form first, since short form will match against long
if (expectedExpiryDateFormat.indexOf(Month + delimiter) === 0) {
useMonthPadding = true;
orderByYear = false;
} else if (expectedExpiryDateFormat.indexOf(MonthShort + delimiter) === 0) {
useMonthPadding = false;
orderByYear = false;
} else {
orderByYear = true;
// short form can match against long form, but long won't match against short
const containsLongMonthPattern = new RegExp(`${Month}`, "i");
useMonthPadding = containsLongMonthPattern.test(expectedExpiryDateFormat);
}
const containsLongYearPattern = new RegExp(`${Year}`, "i");
useYearFull = containsLongYearPattern.test(expectedExpiryDateFormat);
}
const month = useMonthPadding
? // Ensure zero-padding
("0" + cardCipher.expMonth).slice(-2)
: // Handle zero-padded stored month values, even though they are not _expected_ to be as such
cardCipher.expMonth.replaceAll("0", "");
// Note: assumes the user entered an `expYear` value with a length of either 2 or 4
const year = (currentCentury + cardCipher.expYear).slice(useYearFull ? -4 : -2);
const combinedExpiryFillValue = (orderByYear ? [year, month] : [month, year]).join(delimiter);
return combinedExpiryFillValue;
}
/**
* Returns a string value representation of discovered guidance for a combined month and year expiration value from the field attributes
*
* @param {AutofillField} field
*/
private getExpectedExpiryDateFormat(
field: AutofillField,
): [string | null, CardExpiryDateFormat | null] {
let expectedDateFormat = null;
let dateFormatPatterns = null;
const expiryDateDelimitersPattern =
"\\" + CreditCardAutoFillConstants.CardExpiryDateDelimiters.join("\\");
CreditCardAutoFillConstants.CardExpiryDateFormats.find((dateFormat) => {
dateFormatPatterns = dateFormat;
const { Month, MonthShort, YearShort, Year } = dateFormat;
// Non-exhaustive coverage of field guidances. Some uncovered edge cases: ". " delimiter, space-delimited delimiters ("mm / yyyy").
// We should consider if added whitespace is for improved readability of user-guidance or actually desired in the filled value.
// e.g. "/((mm|m)[\/\-\.\ ]{0,1}(yyyy|yy))|((yyyy|yy)[\/\-\.\ ]{0,1}(mm|m))/gi"
const dateFormatPattern = new RegExp(
`((${Month}|${MonthShort})[${expiryDateDelimitersPattern}]{0,1}(${Year}|${YearShort}))|((${Year}|${YearShort})[${expiryDateDelimitersPattern}]{0,1}(${Month}|${MonthShort}))`,
"gi",
);
return CreditCardAutoFillConstants.CardAttributesExtended.find((attributeName) => {
const fieldAttributeValue = field[attributeName];
const fieldAttributeMatch = fieldAttributeValue?.match(dateFormatPattern);
// break find as soon as a match is found
if (fieldAttributeMatch?.length) {
expectedDateFormat = fieldAttributeMatch[0];
// remove any irrelevant characters
const irrelevantExpiryCharactersPattern = new RegExp(
// "or digits" to ensure numbers are removed from guidance pattern, which aren't covered by ^\w
`[^\\w${expiryDateDelimitersPattern}]|[\\d]`,
"gi",
);
expectedDateFormat.replaceAll(irrelevantExpiryCharactersPattern, "");
return true;
}
return false;
});
});
return [expectedDateFormat, dateFormatPatterns];
} }
/** /**

View File

@ -644,6 +644,10 @@ export class CollectAutofillContentService implements CollectAutofillContentServ
} }
const tableDataElementIndex = tableDataElement.cellIndex; const tableDataElementIndex = tableDataElement.cellIndex;
if (tableDataElementIndex < 0) {
return null;
}
const parentSiblingTableRowElement = tableDataElement.closest("tr") const parentSiblingTableRowElement = tableDataElement.closest("tr")
?.previousElementSibling as HTMLTableRowElement; ?.previousElementSibling as HTMLTableRowElement;

View File

@ -21,12 +21,29 @@ describe("InlineMenuFieldQualificationService", () => {
}); });
describe("isFieldForLoginForm", () => { describe("isFieldForLoginForm", () => {
it("disqualifies totp fields", () => {
const field = mock<AutofillField>({
type: "text",
autoCompleteType: "one-time-code",
htmlName: "totp",
htmlID: "totp",
placeholder: "totp",
});
expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe(
false,
);
});
describe("qualifying a password field for a login form", () => { describe("qualifying a password field for a login form", () => {
describe("an invalid password field", () => { describe("an invalid password field", () => {
it("has a `new-password` autoCompleteType", () => { it("has a `new-password` autoCompleteType", () => {
const field = mock<AutofillField>({ const field = mock<AutofillField>({
type: "password", type: "password",
autoCompleteType: "new-password", autoCompleteType: "new-password",
htmlName: "input-password",
htmlID: "input-password",
placeholder: "input-password",
}); });
expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe(
@ -39,6 +56,8 @@ describe("InlineMenuFieldQualificationService", () => {
type: "password", type: "password",
placeholder: "create account password", placeholder: "create account password",
autoCompleteType: "", autoCompleteType: "",
htmlName: "input-password",
htmlID: "input-password",
}); });
expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe(

View File

@ -1,6 +1,6 @@
import AutofillField from "../models/autofill-field"; import AutofillField from "../models/autofill-field";
import AutofillPageDetails from "../models/autofill-page-details"; import AutofillPageDetails from "../models/autofill-page-details";
import { sendExtensionMessage } from "../utils"; import { getSubmitButtonKeywordsSet, sendExtensionMessage } from "../utils";
import { import {
AutofillKeywordsMap, AutofillKeywordsMap,
@ -125,6 +125,7 @@ export class InlineMenuFieldQualificationService
this.identityCompanyAutocompleteValue, this.identityCompanyAutocompleteValue,
this.identityPostalCodeAutocompleteValue, this.identityPostalCodeAutocompleteValue,
]); ]);
private totpFieldAutocompleteValue = "one-time-code";
private inlineMenuFieldQualificationFlagSet = false; private inlineMenuFieldQualificationFlagSet = false;
constructor() { constructor() {
@ -145,6 +146,11 @@ export class InlineMenuFieldQualificationService
return this.isFieldForLoginFormFallback(field); return this.isFieldForLoginFormFallback(field);
} }
const isTotpField = this.isTotpField(field);
if (isTotpField) {
return false;
}
const isCurrentPasswordField = this.isCurrentPasswordField(field); const isCurrentPasswordField = this.isCurrentPasswordField(field);
if (isCurrentPasswordField) { if (isCurrentPasswordField) {
return this.isPasswordFieldForLoginForm(field, pageDetails); return this.isPasswordFieldForLoginForm(field, pageDetails);
@ -838,7 +844,7 @@ export class InlineMenuFieldQualificationService
* *
* @param field - The field to validate * @param field - The field to validate
*/ */
private isCurrentPasswordField = (field: AutofillField): boolean => { isCurrentPasswordField = (field: AutofillField): boolean => {
if ( if (
this.fieldContainsAutocompleteValues(field, this.newPasswordAutoCompleteValue) || this.fieldContainsAutocompleteValues(field, this.newPasswordAutoCompleteValue) ||
this.keywordsFoundInFieldData(field, this.accountCreationFieldKeywords) this.keywordsFoundInFieldData(field, this.accountCreationFieldKeywords)
@ -875,7 +881,8 @@ export class InlineMenuFieldQualificationService
if ( if (
(!isInputPasswordType && (!isInputPasswordType &&
this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet)) || this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet)) ||
this.fieldHasDisqualifyingAttributeValue(field) this.fieldHasDisqualifyingAttributeValue(field) ||
this.isTotpField(field)
) { ) {
return false; return false;
} }
@ -923,6 +930,22 @@ export class InlineMenuFieldQualificationService
return !(this.passwordFieldExcludeListString.indexOf(cleanedValue) > -1); return !(this.passwordFieldExcludeListString.indexOf(cleanedValue) > -1);
} }
/**
* Validates whether the provided field is a TOTP field.
*
* @param field - The field to validate
*/
private isTotpField = (field: AutofillField): boolean => {
if (this.fieldContainsAutocompleteValues(field, this.totpFieldAutocompleteValue)) {
return true;
}
return (
!this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet) &&
this.keywordsFoundInFieldData(field, AutoFillConstants.TotpFieldNames)
);
};
/** /**
* Validates the provided field to indicate if the field has a * Validates the provided field to indicate if the field has a
* disqualifying attribute that would impede autofill entirely. * disqualifying attribute that would impede autofill entirely.
@ -1014,34 +1037,7 @@ export class InlineMenuFieldQualificationService
*/ */
private getSubmitButtonKeywords(element: HTMLElement): string { private getSubmitButtonKeywords(element: HTMLElement): string {
if (!this.submitButtonKeywordsMap.has(element)) { if (!this.submitButtonKeywordsMap.has(element)) {
const keywords = [ const keywordsSet = getSubmitButtonKeywordsSet(element);
element.textContent,
element.getAttribute("value"),
element.getAttribute("aria-label"),
element.getAttribute("aria-labelledby"),
element.getAttribute("aria-describedby"),
element.getAttribute("title"),
element.getAttribute("id"),
element.getAttribute("name"),
element.getAttribute("class"),
];
const keywordsSet = new Set<string>();
for (let i = 0; i < keywords.length; i++) {
if (typeof keywords[i] === "string") {
keywords[i]
.toLowerCase()
.replace(/[-\s]/g, "")
.replace(/[^a-zA-Z0-9]+/g, "|")
.split("|")
.forEach((keyword) => {
if (keyword) {
keywordsSet.add(keyword);
}
});
}
}
this.submitButtonKeywordsMap.set(element, Array.from(keywordsSet).join(",")); this.submitButtonKeywordsMap.set(element, Array.from(keywordsSet).join(","));
} }

View File

@ -360,3 +360,43 @@ export function throttle(callback: (_args: any) => any, limit: number) {
} }
}; };
} }
/**
* Gathers and normalizes keywords from a potential submit button element. Used
* to verify if the element submits a login or change password form.
*
* @param element - The element to gather keywords from.
*/
export function getSubmitButtonKeywordsSet(element: HTMLElement): Set<string> {
const keywords = [
element.textContent,
element.getAttribute("type"),
element.getAttribute("value"),
element.getAttribute("aria-label"),
element.getAttribute("aria-labelledby"),
element.getAttribute("aria-describedby"),
element.getAttribute("title"),
element.getAttribute("id"),
element.getAttribute("name"),
element.getAttribute("class"),
];
const keywordsSet = new Set<string>();
for (let i = 0; i < keywords.length; i++) {
if (typeof keywords[i] === "string") {
// Iterate over all keywords metadata and split them by non-letter characters.
// This ensures we check against individual words and not the entire string.
keywords[i]
.toLowerCase()
.replace(/[-\s]/g, "")
.split(/[^\p{L}]+/gu)
.forEach((keyword) => {
if (keyword) {
keywordsSet.add(keyword);
}
});
}
}
return keywordsSet;
}

View File

@ -782,6 +782,8 @@ export default class MainBackground {
this.authService, this.authService,
); );
this.bulkEncryptService = new FallbackBulkEncryptService(this.encryptService);
this.cipherService = new CipherService( this.cipherService = new CipherService(
this.cryptoService, this.cryptoService,
this.domainSettingsService, this.domainSettingsService,
@ -1463,7 +1465,14 @@ export default class MainBackground {
}); });
if (needStorageReseed) { if (needStorageReseed) {
await this.reseedStorage(); await this.reseedStorage(
await firstValueFrom(
this.configService.userCachedFeatureFlag$(
FeatureFlag.StorageReseedRefactor,
userBeingLoggedOut,
),
),
);
} }
if (BrowserApi.isManifestVersion(3)) { if (BrowserApi.isManifestVersion(3)) {
@ -1518,7 +1527,7 @@ export default class MainBackground {
await SafariApp.sendMessageToApp("showPopover", null, true); await SafariApp.sendMessageToApp("showPopover", null, true);
} }
async reseedStorage() { async reseedStorage(doFillBuffer: boolean) {
if ( if (
!this.platformUtilsService.isChrome() && !this.platformUtilsService.isChrome() &&
!this.platformUtilsService.isVivaldi() && !this.platformUtilsService.isVivaldi() &&
@ -1527,7 +1536,11 @@ export default class MainBackground {
return; return;
} }
await this.storageService.reseed(); if (doFillBuffer) {
await this.storageService.fillBuffer();
} else {
await this.storageService.reseed();
}
} }
async clearClipboard(clipboardValue: string, clearMs: number) { async clearClipboard(clipboardValue: string, clearMs: number) {

View File

@ -1,4 +1,4 @@
import { firstValueFrom, map, mergeMap } from "rxjs"; import { firstValueFrom, map, mergeMap, of, switchMap } from "rxjs";
import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
@ -272,9 +272,25 @@ export default class RuntimeBackground {
await this.main.refreshBadge(); await this.main.refreshBadge();
await this.main.refreshMenu(); await this.main.refreshMenu();
break; break;
case "bgReseedStorage": case "bgReseedStorage": {
await this.main.reseedStorage(); const doFillBuffer = await firstValueFrom(
this.accountService.activeAccount$.pipe(
switchMap((account) => {
if (account == null) {
return of(false);
}
return this.configService.userCachedFeatureFlag$(
FeatureFlag.StorageReseedRefactor,
account.id,
);
}),
),
);
await this.main.reseedStorage(doFillBuffer);
break; break;
}
case "authResult": { case "authResult": {
const env = await firstValueFrom(this.environmentService.environment$); const env = await firstValueFrom(this.environmentService.environment$);
const vaultUrl = env.getWebVaultUrl(); const vaultUrl = env.getWebVaultUrl();

View File

@ -1,4 +1,5 @@
<html> <!doctype html>
<html>
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
</head> </head>

View File

@ -32,6 +32,46 @@ export default class BrowserLocalStorageService extends AbstractChromeStorageSer
} }
} }
async fillBuffer() {
// Write 4MB of data in chrome.storage.local, log files will hold 4MB of data (by default)
// before forcing a compaction. To force a compaction and have it remove previously saved data,
// we want to fill it's buffer so that anything newly marked for deletion is gone.
// https://github.com/google/leveldb/blob/main/doc/impl.md#log-files
// It's important that if Google uses a different buffer length that we match that, as far as I can tell
// Google uses the default value in Chromium:
// https://github.com/chromium/chromium/blob/148774efa6b3a047369af6179a4248566b39d68f/components/value_store/lazy_leveldb.cc#L65-L66
const fakeData = "0".repeat(1024 * 1024); // 1MB of data
await new Promise<void>((resolve, reject) => {
this.chromeStorageApi.set(
{
fake_data_1: fakeData,
fake_data_2: fakeData,
fake_data_3: fakeData,
fake_data_4: fakeData,
},
() => {
if (chrome.runtime.lastError) {
return reject(chrome.runtime.lastError);
}
resolve();
},
);
});
await new Promise<void>((resolve, reject) => {
this.chromeStorageApi.remove(
["fake_data_1", "fake_data_2", "fake_data_3", "fake_data_4"],
() => {
if (chrome.runtime.lastError) {
return reject(chrome.runtime.lastError);
}
resolve();
},
);
});
}
override async get<T>(key: string): Promise<T> { override async get<T>(key: string): Promise<T> {
await this.awaitReseed(); await this.awaitReseed();
return super.get(key); return super.get(key);

View File

@ -202,6 +202,9 @@ export const routerTransition = trigger("routerTransition", [
transition("vault-settings => trash", inSlideLeft), transition("vault-settings => trash", inSlideLeft),
transition("trash => vault-settings", outSlideRight), transition("trash => vault-settings", outSlideRight),
transition("trash => view-cipher", inSlideLeft),
transition("view-cipher => trash", outSlideRight),
// Appearance settings // Appearance settings
transition("tabs => appearance", inSlideLeft), transition("tabs => appearance", inSlideLeft),
transition("appearance => tabs", outSlideRight), transition("appearance => tabs", outSlideRight),

View File

@ -33,7 +33,7 @@
type="button" type="button"
buttonType="danger" buttonType="danger"
bitIconButton="bwi-trash" bitIconButton="bwi-trash"
[appA11yTitle]="'delete' | i18n" [appA11yTitle]="(cipher.isDeleted ? 'deleteForever' : 'delete') | i18n"
></button> ></button>
</popup-footer> </popup-footer>
</popup-page> </popup-page>

View File

@ -57,6 +57,8 @@ export class TrashListItemsContainerComponent {
async restore(cipher: CipherView) { async restore(cipher: CipherView) {
try { try {
await this.cipherService.restoreWithServer(cipher.id); await this.cipherService.restoreWithServer(cipher.id);
await this.router.navigate(["/vault"]);
this.toastService.showToast({ this.toastService.showToast({
variant: "success", variant: "success",
title: null, title: null,
@ -86,10 +88,12 @@ export class TrashListItemsContainerComponent {
try { try {
await this.cipherService.deleteWithServer(cipher.id); await this.cipherService.deleteWithServer(cipher.id);
await this.router.navigate(["/vault"]);
this.toastService.showToast({ this.toastService.showToast({
variant: "success", variant: "success",
title: null, title: null,
message: this.i18nService.t("deletedItem"), message: this.i18nService.t("permanentlyDeletedItem"),
}); });
} catch (e) { } catch (e) {
this.logService.error(e); this.logService.error(e);

View File

@ -118,10 +118,10 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Name" xml:space="preserve"> <data name="Name" xml:space="preserve">
<value>Bitwarden Password Manager</value> <value>Bitwardeni Paroolihaldur</value>
</data> </data>
<data name="Summary" xml:space="preserve"> <data name="Summary" xml:space="preserve">
<value>At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.</value> <value>Kodus, tööl ja teel - Bitwarden hoiustab imelihtsalt kõik su paroolid, pääsuvõtmed ja tundliku info.</value>
</data> </data>
<data name="Description" xml:space="preserve"> <data name="Description" xml:space="preserve">
<value>Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! <value>Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more!
@ -169,7 +169,7 @@ End-to-end encrypted credential management solutions from Bitwarden empower orga
</value> </value>
</data> </data>
<data name="AssetTitle" xml:space="preserve"> <data name="AssetTitle" xml:space="preserve">
<value>At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.</value> <value>Kodus, tööl ja teel - Bitwarden hoiustab imelihtsalt kõik su paroolid, pääsuvõtmed ja tundliku info.</value>
</data> </data>
<data name="ScreenshotSync" xml:space="preserve"> <data name="ScreenshotSync" xml:space="preserve">
<value>Sünkroniseeri ja halda oma kontot erinevates seadmetes</value> <value>Sünkroniseeri ja halda oma kontot erinevates seadmetes</value>

View File

@ -118,7 +118,7 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Name" xml:space="preserve"> <data name="Name" xml:space="preserve">
<value>Bitwarden Password Manager</value> <value>Trình quản lý mật khẩu Bitwarden</value>
</data> </data>
<data name="Summary" xml:space="preserve"> <data name="Summary" xml:space="preserve">
<value>At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.</value> <value>At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.</value>

View File

@ -1,5 +1,3 @@
{ {
"flags": { "flags": {}
"enableCipherKeyEncryption": false
}
} }

View File

@ -1,5 +1,3 @@
{ {
"flags": { "flags": {}
"enableCipherKeyEncryption": false
}
} }

View File

@ -1,6 +1,4 @@
{ {
"devFlags": {}, "devFlags": {},
"flags": { "flags": {}
"enableCipherKeyEncryption": false
}
} }

View File

@ -1,6 +1,4 @@
{ {
"devFlags": {}, "devFlags": {},
"flags": { "flags": {}
"enableCipherKeyEncryption": false
}
} }

View File

@ -1,5 +1,3 @@
{ {
"flags": { "flags": {}
"enableCipherKeyEncryption": false
}
} }

View File

@ -555,6 +555,7 @@ version = "0.0.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"desktop_core", "desktop_core",
"embed_plist",
"futures", "futures",
"log", "log",
"simplelog", "simplelog",
@ -614,6 +615,12 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
[[package]]
name = "embed_plist"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
[[package]] [[package]]
name = "endi" name = "endi"
version = "1.1.0" version = "1.1.0"

View File

@ -14,3 +14,6 @@ log = "0.4.21"
simplelog = "0.12.2" simplelog = "0.12.2"
tokio = { version = "1.38.0", features = ["io-std", "io-util", "macros", "rt"] } tokio = { version = "1.38.0", features = ["io-std", "io-util", "macros", "rt"] }
tokio-util = { version = "0.7.11", features = ["codec"] } tokio-util = { version = "0.7.11", features = ["codec"] }
[target.'cfg(target_os = "macos")'.dependencies]
embed_plist = "1.2.2"

View File

@ -5,6 +5,9 @@ use futures::{SinkExt, StreamExt};
use log::*; use log::*;
use tokio_util::codec::LengthDelimitedCodec; use tokio_util::codec::LengthDelimitedCodec;
#[cfg(target_os = "macos")]
embed_plist::embed_info_plist!("../../../resources/info.desktop_proxy.plist");
fn init_logging(log_path: &Path, level: log::LevelFilter) { fn init_logging(log_path: &Path, level: log::LevelFilter) {
use simplelog::{ColorChoice, CombinedLogger, Config, SharedLogger, TermLogger, TerminalMode}; use simplelog::{ColorChoice, CombinedLogger, Config, SharedLogger, TermLogger, TerminalMode};

View File

@ -2,10 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.application-identifier</key> <key>com.apple.security.app-sandbox</key>
<string>LTZ2PFU5D6.com.bitwarden.desktop</string> <true/>
<key>com.apple.developer.team-identifier</key>
<string>LTZ2PFU5D6</string>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array> <array>
<string>LTZ2PFU5D6.com.bitwarden.desktop</string> <string>LTZ2PFU5D6.com.bitwarden.desktop</string>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>com.bitwarden.desktop</string>
</dict>
</plist>

View File

@ -33,13 +33,32 @@ async function run(context) {
} }
if (["darwin", "mas"].includes(context.electronPlatformName)) { if (["darwin", "mas"].includes(context.electronPlatformName)) {
const identities = getIdentities(process.env.CSC_NAME ?? ""); const is_mas = context.electronPlatformName === "mas";
if (identities.length === 0) { const is_mas_dev = context.targets.some((e) => e.name === "mas-dev");
throw new Error("No valid identities found");
}
const id = identities[0].id;
console.log("Signing proxy binary before the main bundle, using identity", id); let id;
// Only use the Bitwarden Identities on CI
if (process.env.GITHUB_ACTIONS === "true") {
if (is_mas) {
id = is_mas_dev
? "E7C9978F6FBCE0553429185C405E61F5380BE8EB"
: "3rd Party Mac Developer Application: Bitwarden Inc";
} else {
id = "Developer ID Application: 8bit Solutions LLC";
}
// Locally, use the first valid code signing identity, unless CSC_NAME is set
} else if (process.env.CSC_NAME) {
id = process.env.CSC_NAME;
} else {
const identities = getIdentities();
if (identities.length === 0) {
throw new Error("No valid identities found");
}
id = identities[0].id;
}
console.log(`Signing proxy binary before the main bundle, using identity '${id}'`);
const appName = context.packager.appInfo.productFilename; const appName = context.packager.appInfo.productFilename;
const appPath = `${context.appOutDir}/${appName}.app`; const appPath = `${context.appOutDir}/${appName}.app`;
@ -49,7 +68,7 @@ async function run(context) {
const entitlementsName = "entitlements.desktop_proxy.plist"; const entitlementsName = "entitlements.desktop_proxy.plist";
const entitlementsPath = path.join(__dirname, "..", "resources", entitlementsName); const entitlementsPath = path.join(__dirname, "..", "resources", entitlementsName);
child_process.execSync( child_process.execSync(
`codesign -s ${id} -i ${packageId} -f --timestamp --options runtime --entitlements ${entitlementsPath} ${proxyPath}`, `codesign -s '${id}' -i ${packageId} -f --timestamp --options runtime --entitlements ${entitlementsPath} ${proxyPath}`,
); );
} }
} }
@ -66,7 +85,7 @@ const appleCertificatePrefixes = [
"Apple Development:", "Apple Development:",
]; ];
function getIdentities(csc_name) { function getIdentities() {
const ids = child_process const ids = child_process
.execSync("/usr/bin/security find-identity -v -p codesigning") .execSync("/usr/bin/security find-identity -v -p codesigning")
.toString(); .toString();
@ -81,7 +100,6 @@ function getIdentities(csc_name) {
} }
return false; return false;
}) })
.filter((line) => line.includes(csc_name))
.map((line) => { .map((line) => {
const split = line.trim().split(" "); const split = line.trim().split(" ");
const id = split[1]; const id = split[1];

View File

@ -604,10 +604,10 @@
"message": "Yeni hesabınız yaradıldı! İndi giriş edə bilərsiniz." "message": "Yeni hesabınız yaradıldı! İndi giriş edə bilərsiniz."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Yeni hesabınız yaradıldı!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Giriş etdiniz!"
}, },
"masterPassSent": { "masterPassSent": {
"message": "Ana parol məsləhətini ehtiva edən bir e-poçt göndərdik." "message": "Ana parol məsləhətini ehtiva edən bir e-poçt göndərdik."
@ -3060,6 +3060,6 @@
"message": "Mətn \"Send\"ləri" "message": "Mətn \"Send\"ləri"
}, },
"ssoError": { "ssoError": {
"message": "No free ports could be found for the sso login." "message": "SSO giriş üçün açıq port tapıla bilmədi."
} }
} }

View File

@ -604,10 +604,10 @@
"message": "Ο λογαριασμός σας έχει δημιουργηθεί! Τώρα μπορείτε να συνδεθείτε." "message": "Ο λογαριασμός σας έχει δημιουργηθεί! Τώρα μπορείτε να συνδεθείτε."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Ο νέος σας λογαριασμός έχει δημιουργηθεί!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Έχετε συνδεθεί!"
}, },
"masterPassSent": { "masterPassSent": {
"message": "Σας στείλαμε ένα email με την υπόδειξη του κύριου κωδικού." "message": "Σας στείλαμε ένα email με την υπόδειξη του κύριου κωδικού."
@ -3060,6 +3060,6 @@
"message": "Send κειμένων" "message": "Send κειμένων"
}, },
"ssoError": { "ssoError": {
"message": "No free ports could be found for the sso login." "message": "Δεν βρέθηκαν ελεύθερες θύρες για τη σύνδεση sso."
} }
} }

View File

@ -6,7 +6,7 @@
"message": "Filtriloj" "message": "Filtriloj"
}, },
"allItems": { "allItems": {
"message": "Ĉiuj Eroj" "message": "Ĉiuj eroj"
}, },
"favorites": { "favorites": {
"message": "Plej ŝatataj" "message": "Plej ŝatataj"
@ -15,13 +15,13 @@
"message": "Tipoj" "message": "Tipoj"
}, },
"typeLogin": { "typeLogin": {
"message": "Saluto" "message": "Ensaluti"
}, },
"typeCard": { "typeCard": {
"message": "Karto" "message": "Karto"
}, },
"typeIdentity": { "typeIdentity": {
"message": "Idento" "message": "Identeco"
}, },
"typeSecureNote": { "typeSecureNote": {
"message": "Sekura noto" "message": "Sekura noto"
@ -33,22 +33,22 @@
"message": "Kolektoj" "message": "Kolektoj"
}, },
"searchVault": { "searchVault": {
"message": "Traserĉu trezorejon" "message": "Traserĉi trezorejon"
}, },
"addItem": { "addItem": {
"message": "Aldoni elementon" "message": "Aldoni eron"
}, },
"shared": { "shared": {
"message": "Kundividita" "message": "Konigita"
}, },
"share": { "share": {
"message": "Kundividi" "message": "Konigi"
}, },
"moveToOrganization": { "moveToOrganization": {
"message": "Movu al organizo" "message": "Movi al organizaĵo"
}, },
"movedItemToOrg": { "movedItemToOrg": {
"message": "$ITEMNAME$ moviĝis al $ORGNAME$", "message": "$ITEMNAME$ movita al $ORGNAME$",
"placeholders": { "placeholders": {
"itemname": { "itemname": {
"content": "$1", "content": "$1",
@ -61,13 +61,13 @@
} }
}, },
"moveToOrgDesc": { "moveToOrgDesc": {
"message": "Elektu organizon kun kiu vi volas dividi ĉi tiun eron. Dividado transdonas posedon de la ero al la organizo. Vi ne plu estos la rekta posedanto de ĉi tiu ero post kiam ĝi estos dividita." "message": "Elektu organizaĵon, al kiu vi volas movi ĉi tiun eron. Movado al organizaĵo transdonas la posedon de la ero al tiu organizaĵo. Vi ne plu estos la rekta posedanto de la ero post kiam ĝi estos movita."
}, },
"attachments": { "attachments": {
"message": "Aldonaĵoj" "message": "Aldonaĵoj"
}, },
"viewItem": { "viewItem": {
"message": "Vidi la elementon" "message": "Vidi la eron"
}, },
"name": { "name": {
"message": "Nomo" "message": "Nomo"
@ -98,10 +98,10 @@
"message": "Pasfrazo" "message": "Pasfrazo"
}, },
"editItem": { "editItem": {
"message": "Redakti la elementon" "message": "Redakti la eron"
}, },
"emailAddress": { "emailAddress": {
"message": "Retpoŝta adreso" "message": "Retpoŝtadreso"
}, },
"verificationCodeTotp": { "verificationCodeTotp": {
"message": "Kontrola kodo (TOTP)" "message": "Kontrola kodo (TOTP)"
@ -116,10 +116,10 @@
"message": "Propraj kampoj" "message": "Propraj kampoj"
}, },
"launch": { "launch": {
"message": "Lanĉo" "message": "Lanĉi"
}, },
"copyValue": { "copyValue": {
"message": "Kopii valoron", "message": "Kopii la valoron",
"description": "Copy value to clipboard" "description": "Copy value to clipboard"
}, },
"minimizeOnCopyToClipboard": { "minimizeOnCopyToClipboard": {
@ -151,7 +151,7 @@
"message": "Kodo de sekureco" "message": "Kodo de sekureco"
}, },
"identityName": { "identityName": {
"message": "Nomo de la identilo" "message": "Identecnomo"
}, },
"company": { "company": {
"message": "Kompanio" "message": "Kompanio"
@ -166,10 +166,10 @@
"message": "License number" "message": "License number"
}, },
"email": { "email": {
"message": "Email" "message": "Retpoŝtadreso"
}, },
"phone": { "phone": {
"message": "Telefono" "message": "Telefonnumero"
}, },
"address": { "address": {
"message": "Adreso" "message": "Adreso"
@ -184,7 +184,7 @@
"message": "An error has occurred." "message": "An error has occurred."
}, },
"error": { "error": {
"message": "Error" "message": "Eraro"
}, },
"january": { "january": {
"message": "januaro" "message": "januaro"
@ -211,19 +211,19 @@
"message": "aŭgusto" "message": "aŭgusto"
}, },
"september": { "september": {
"message": "September" "message": "septembro"
}, },
"october": { "october": {
"message": "October" "message": "oktobro"
}, },
"november": { "november": {
"message": "November" "message": "novembro"
}, },
"december": { "december": {
"message": "December" "message": "decembro"
}, },
"ex": { "ex": {
"message": "ex.", "message": "ekz.",
"description": "Short abbreviation for 'example'." "description": "Short abbreviation for 'example'."
}, },
"title": { "title": {
@ -239,7 +239,7 @@
"message": "S-ino" "message": "S-ino"
}, },
"mx": { "mx": {
"message": "Mx" "message": "Ges-ro"
}, },
"dr": { "dr": {
"message": "Dr-o" "message": "Dr-o"
@ -251,16 +251,16 @@
"message": "Expiration year" "message": "Expiration year"
}, },
"select": { "select": {
"message": "Select" "message": "Elekti"
}, },
"other": { "other": {
"message": "Other" "message": "Alia"
}, },
"generatePassword": { "generatePassword": {
"message": "Generate password" "message": "Generate password"
}, },
"type": { "type": {
"message": "Type" "message": "Tipo"
}, },
"firstName": { "firstName": {
"message": "First name" "message": "First name"
@ -272,16 +272,16 @@
"message": "Last name" "message": "Last name"
}, },
"fullName": { "fullName": {
"message": "Full name" "message": "Plena nomo"
}, },
"address1": { "address1": {
"message": "Address 1" "message": "Adreso 1"
}, },
"address2": { "address2": {
"message": "Address 2" "message": "Adreso 2"
}, },
"address3": { "address3": {
"message": "Address 3" "message": "Adreso 3"
}, },
"cityTown": { "cityTown": {
"message": "City / Town" "message": "City / Town"
@ -290,25 +290,25 @@
"message": "State / Province" "message": "State / Province"
}, },
"zipPostalCode": { "zipPostalCode": {
"message": "Zip / Postal code" "message": "Poŝtkodo"
}, },
"country": { "country": {
"message": "Country" "message": "Lando"
}, },
"save": { "save": {
"message": "Save" "message": "Konservi"
}, },
"cancel": { "cancel": {
"message": "Cancel" "message": "Nuligi"
}, },
"delete": { "delete": {
"message": "Delete" "message": "Forigi"
}, },
"favorite": { "favorite": {
"message": "Favorite" "message": "Favorite"
}, },
"edit": { "edit": {
"message": "Edit" "message": "Redakti"
}, },
"authenticatorKeyTotp": { "authenticatorKeyTotp": {
"message": "Authenticator key (TOTP)" "message": "Authenticator key (TOTP)"
@ -320,22 +320,22 @@
"message": "New custom field" "message": "New custom field"
}, },
"value": { "value": {
"message": "Value" "message": "Valoro"
}, },
"dragToSort": { "dragToSort": {
"message": "Drag to sort" "message": "Drag to sort"
}, },
"cfTypeText": { "cfTypeText": {
"message": "Text" "message": "Teksto"
}, },
"cfTypeHidden": { "cfTypeHidden": {
"message": "Hidden" "message": "Kaŝita"
}, },
"cfTypeBoolean": { "cfTypeBoolean": {
"message": "Boolean" "message": "Bulea"
}, },
"cfTypeLinked": { "cfTypeLinked": {
"message": "Linked", "message": "Ligita",
"description": "This describes a field that is 'linked' (related) to another field." "description": "This describes a field that is 'linked' (related) to another field."
}, },
"linkedValue": { "linkedValue": {
@ -343,7 +343,7 @@
"description": "This describes a value that is 'linked' (related) to another value." "description": "This describes a value that is 'linked' (related) to another value."
}, },
"remove": { "remove": {
"message": "Remove" "message": "Forigi"
}, },
"nameRequired": { "nameRequired": {
"message": "Name is required." "message": "Name is required."
@ -432,7 +432,7 @@
"message": "Include number" "message": "Include number"
}, },
"close": { "close": {
"message": "Close" "message": "Fermi"
}, },
"minNumbers": { "minNumbers": {
"message": "Minimum numbers" "message": "Minimum numbers"
@ -470,7 +470,7 @@
"message": "Attachment saved" "message": "Attachment saved"
}, },
"file": { "file": {
"message": "File" "message": "Dosiero"
}, },
"selectFile": { "selectFile": {
"message": "Select a file" "message": "Select a file"
@ -506,7 +506,7 @@
"message": "Finish creating your account by setting a password" "message": "Finish creating your account by setting a password"
}, },
"logIn": { "logIn": {
"message": "Log in" "message": "Ensaluti"
}, },
"submit": { "submit": {
"message": "Submit" "message": "Submit"
@ -558,7 +558,7 @@
"message": "Finish joining this organization by setting a master password." "message": "Finish joining this organization by setting a master password."
}, },
"settings": { "settings": {
"message": "Settings" "message": "Agordoj"
}, },
"passwordHint": { "passwordHint": {
"message": "Password hint" "message": "Password hint"
@ -646,7 +646,7 @@
"message": "Invalid verification code" "message": "Invalid verification code"
}, },
"continue": { "continue": {
"message": "Continue" "message": "Daŭrigi"
}, },
"enterVerificationCodeApp": { "enterVerificationCodeApp": {
"message": "Enter the 6 digit verification code from your authenticator app." "message": "Enter the 6 digit verification code from your authenticator app."
@ -778,13 +778,13 @@
"message": "Environment URLs saved" "message": "Environment URLs saved"
}, },
"ok": { "ok": {
"message": "Ok" "message": "Bone"
}, },
"yes": { "yes": {
"message": "Yes" "message": "Jes"
}, },
"no": { "no": {
"message": "No" "message": "Ne"
}, },
"overwritePassword": { "overwritePassword": {
"message": "Overwrite password" "message": "Overwrite password"
@ -796,7 +796,7 @@
"message": "Feature unavailable" "message": "Feature unavailable"
}, },
"loggedOut": { "loggedOut": {
"message": "Adiaŭita" "message": "Elsalutinta"
}, },
"loggedOutDesc": { "loggedOutDesc": {
"message": "You have been logged out of your account." "message": "You have been logged out of your account."
@ -820,25 +820,25 @@
"message": "Are you sure you want to log out?" "message": "Are you sure you want to log out?"
}, },
"logOut": { "logOut": {
"message": "Adiaŭi" "message": "Elsaluti"
}, },
"addNewLogin": { "addNewLogin": {
"message": "New login" "message": "New login"
}, },
"addNewItem": { "addNewItem": {
"message": "New item" "message": "Nova ero"
}, },
"addNewFolder": { "addNewFolder": {
"message": "New folder" "message": "New folder"
}, },
"view": { "view": {
"message": "View" "message": "Vido"
}, },
"account": { "account": {
"message": "Account" "message": "Konto"
}, },
"loading": { "loading": {
"message": "Loading..." "message": "Ŝargado..."
}, },
"lockVault": { "lockVault": {
"message": "Lock vault" "message": "Lock vault"
@ -859,10 +859,10 @@
"message": "File a bug report" "message": "File a bug report"
}, },
"blog": { "blog": {
"message": "Blog" "message": "Blogo"
}, },
"followUs": { "followUs": {
"message": "Follow us" "message": "Sekvi nin"
}, },
"syncVault": { "syncVault": {
"message": "Sync vault" "message": "Sync vault"
@ -900,13 +900,13 @@
"message": "Syncing failed" "message": "Syncing failed"
}, },
"yourVaultIsLocked": { "yourVaultIsLocked": {
"message": "Your vault is locked. Verify your identity to continue." "message": "Via trezorejo estas ŝlosita. Kontrolu vian identecon por daŭrigi."
}, },
"unlock": { "unlock": {
"message": "Unlock" "message": "Malŝlosi"
}, },
"loggedInAsOn": { "loggedInAsOn": {
"message": "Logged in as $EMAIL$ on $HOSTNAME$.", "message": "Ensalutinta kiel $EMAIL$ ĉe $HOSTNAME$.",
"placeholders": { "placeholders": {
"email": { "email": {
"content": "$1", "content": "$1",
@ -934,37 +934,37 @@
"message": "Choose when your vault will take the vault timeout action." "message": "Choose when your vault will take the vault timeout action."
}, },
"immediately": { "immediately": {
"message": "Immediately" "message": "Tuj"
}, },
"tenSeconds": { "tenSeconds": {
"message": "10 seconds" "message": "10 sekundoj"
}, },
"twentySeconds": { "twentySeconds": {
"message": "20 seconds" "message": "20 sekundoj"
}, },
"thirtySeconds": { "thirtySeconds": {
"message": "30 seconds" "message": "30 sekundoj"
}, },
"oneMinute": { "oneMinute": {
"message": "1 minute" "message": "1 minuto"
}, },
"twoMinutes": { "twoMinutes": {
"message": "2 minutes" "message": "2 minutoj"
}, },
"fiveMinutes": { "fiveMinutes": {
"message": "5 minutes" "message": "5 minutoj"
}, },
"fifteenMinutes": { "fifteenMinutes": {
"message": "15 minutes" "message": "15 minutoj"
}, },
"thirtyMinutes": { "thirtyMinutes": {
"message": "30 minutes" "message": "30 minutoj"
}, },
"oneHour": { "oneHour": {
"message": "1 hour" "message": "1 horo"
}, },
"fourHours": { "fourHours": {
"message": "4 hours" "message": "4 horoj"
}, },
"onIdle": { "onIdle": {
"message": "On system idle" "message": "On system idle"
@ -979,10 +979,10 @@
"message": "On restart" "message": "On restart"
}, },
"never": { "never": {
"message": "Never" "message": "Neniam"
}, },
"security": { "security": {
"message": "Security" "message": "Sekureco"
}, },
"clearClipboard": { "clearClipboard": {
"message": "Clear clipboard", "message": "Clear clipboard",
@ -1059,27 +1059,27 @@
"message": "Turning off this setting will also turn off all other tray related settings." "message": "Turning off this setting will also turn off all other tray related settings."
}, },
"language": { "language": {
"message": "Language" "message": "Lingvo"
}, },
"languageDesc": { "languageDesc": {
"message": "Change the language used by the application. Restart is required." "message": "Change the language used by the application. Restart is required."
}, },
"theme": { "theme": {
"message": "Theme" "message": "Etoso"
}, },
"themeDesc": { "themeDesc": {
"message": "Change the application's color theme." "message": "Change the application's color theme."
}, },
"dark": { "dark": {
"message": "Dark", "message": "Malhela",
"description": "Dark color" "description": "Dark color"
}, },
"light": { "light": {
"message": "Light", "message": "Hela",
"description": "Light color" "description": "Light color"
}, },
"copy": { "copy": {
"message": "Copy", "message": "Kopii",
"description": "Copy to clipboard" "description": "Copy to clipboard"
}, },
"checkForUpdates": { "checkForUpdates": {
@ -1116,7 +1116,7 @@
"message": "Restart" "message": "Restart"
}, },
"later": { "later": {
"message": "Later" "message": "Poste"
}, },
"noUpdatesAvailable": { "noUpdatesAvailable": {
"message": "No updates are currently available. You are using the latest version." "message": "No updates are currently available. You are using the latest version."
@ -1125,7 +1125,7 @@
"message": "Update error" "message": "Update error"
}, },
"unknown": { "unknown": {
"message": "Unknown" "message": "Nekonata"
}, },
"copyUsername": { "copyUsername": {
"message": "Copy username" "message": "Copy username"
@ -1202,7 +1202,7 @@
"message": "Refresh complete" "message": "Refresh complete"
}, },
"passwordHistory": { "passwordHistory": {
"message": "Password history" "message": "Pasvorta historio"
}, },
"clear": { "clear": {
"message": "Clear", "message": "Clear",
@ -1212,27 +1212,27 @@
"message": "There are no passwords to list." "message": "There are no passwords to list."
}, },
"undo": { "undo": {
"message": "Undo" "message": "Malfari"
}, },
"redo": { "redo": {
"message": "Redo" "message": "Refari"
}, },
"cut": { "cut": {
"message": "Cut", "message": "Eltondi",
"description": "Cut to clipboard" "description": "Cut to clipboard"
}, },
"paste": { "paste": {
"message": "Paste", "message": "Alglui",
"description": "Paste from clipboard" "description": "Paste from clipboard"
}, },
"selectAll": { "selectAll": {
"message": "Select all" "message": "Elekti ĉion"
}, },
"zoomIn": { "zoomIn": {
"message": "Zoom in" "message": "Zomi"
}, },
"zoomOut": { "zoomOut": {
"message": "Zoom out" "message": "Malzomi"
}, },
"resetZoom": { "resetZoom": {
"message": "Reset zoom" "message": "Reset zoom"
@ -1251,17 +1251,17 @@
"description": "Minimize window" "description": "Minimize window"
}, },
"zoom": { "zoom": {
"message": "Zoom" "message": "Zomi"
}, },
"bringAllToFront": { "bringAllToFront": {
"message": "Bring all to front", "message": "Bring all to front",
"description": "Bring all windows to front (foreground)" "description": "Bring all windows to front (foreground)"
}, },
"aboutBitwarden": { "aboutBitwarden": {
"message": "About Bitwarden" "message": "Pri Bitwarden"
}, },
"services": { "services": {
"message": "Services" "message": "Servoj"
}, },
"hideBitwarden": { "hideBitwarden": {
"message": "Hide Bitwarden" "message": "Hide Bitwarden"
@ -1276,7 +1276,7 @@
"message": "Quit Bitwarden" "message": "Quit Bitwarden"
}, },
"valueCopied": { "valueCopied": {
"message": "$VALUE$ copied", "message": "$VALUE$ kopiita",
"description": "Value has been copied to the clipboard.", "description": "Value has been copied to the clipboard.",
"placeholders": { "placeholders": {
"value": { "value": {
@ -1292,10 +1292,10 @@
"message": "No refresh token or API keys found. Please try logging out and logging back in." "message": "No refresh token or API keys found. Please try logging out and logging back in."
}, },
"help": { "help": {
"message": "Help" "message": "Helpo"
}, },
"window": { "window": {
"message": "Window" "message": "Fenestro"
}, },
"checkPassword": { "checkPassword": {
"message": "Check if password has been exposed." "message": "Check if password has been exposed."
@ -1321,7 +1321,7 @@
"description": "Domain name. Ex. website.com" "description": "Domain name. Ex. website.com"
}, },
"host": { "host": {
"message": "Host", "message": "Gastiganto",
"description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
}, },
"exact": { "exact": {
@ -1350,10 +1350,10 @@
"description": "An entity of multiple related people (ex. a team or business organization)." "description": "An entity of multiple related people (ex. a team or business organization)."
}, },
"default": { "default": {
"message": "Default" "message": "Defaŭlta"
}, },
"exit": { "exit": {
"message": "Exit" "message": "Forlasi"
}, },
"showHide": { "showHide": {
"message": "Show / Hide", "message": "Show / Hide",
@ -1371,7 +1371,7 @@
"description": "ex. Date this item was updated" "description": "ex. Date this item was updated"
}, },
"dateCreated": { "dateCreated": {
"message": "Created", "message": "Kreita",
"description": "ex. Date this item was created" "description": "ex. Date this item was created"
}, },
"datePasswordUpdated": { "datePasswordUpdated": {
@ -1440,7 +1440,7 @@
"message": "Invalid Url" "message": "Invalid Url"
}, },
"done": { "done": {
"message": "Done" "message": "Preta"
}, },
"accessibilityCookieSaved": { "accessibilityCookieSaved": {
"message": "Accessibility cookie saved!" "message": "Accessibility cookie saved!"
@ -1449,7 +1449,7 @@
"message": "No accessibility cookie saved" "message": "No accessibility cookie saved"
}, },
"warning": { "warning": {
"message": "WARNING", "message": "AVERTO",
"description": "WARNING (should stay in capitalized letters if the language permits)" "description": "WARNING (should stay in capitalized letters if the language permits)"
}, },
"confirmVaultExport": { "confirmVaultExport": {
@ -1477,15 +1477,15 @@
"message": "Who owns this item?" "message": "Who owns this item?"
}, },
"strong": { "strong": {
"message": "Strong", "message": "Forta",
"description": "ex. A strong password. Scale: Weak -> Good -> Strong" "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
}, },
"good": { "good": {
"message": "Good", "message": "Bona",
"description": "ex. A good password. Scale: Weak -> Good -> Strong" "description": "ex. A good password. Scale: Weak -> Good -> Strong"
}, },
"weak": { "weak": {
"message": "Weak", "message": "Malforta",
"description": "ex. A weak password. Scale: Weak -> Good -> Strong" "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
}, },
"weakMasterPassword": { "weakMasterPassword": {
@ -1495,7 +1495,7 @@
"message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
}, },
"pin": { "pin": {
"message": "PIN", "message": "PIN-kodo",
"description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
}, },
"unlockWithPin": { "unlockWithPin": {
@ -1529,7 +1529,7 @@
"message": "Authenticate to unlock Bitwarden." "message": "Authenticate to unlock Bitwarden."
}, },
"unlockWithTouchId": { "unlockWithTouchId": {
"message": "Unlock with Touch ID" "message": "Malŝlosi per Touch ID"
}, },
"additionalTouchIdSettings": { "additionalTouchIdSettings": {
"message": "Additional Touch ID settings" "message": "Additional Touch ID settings"
@ -1556,7 +1556,7 @@
"message": "Lock with master password on restart" "message": "Lock with master password on restart"
}, },
"deleteAccount": { "deleteAccount": {
"message": "Forviŝi la konton" "message": "Forigi la konton"
}, },
"deleteAccountDesc": { "deleteAccountDesc": {
"message": "Proceed below to delete your account and all vault data." "message": "Proceed below to delete your account and all vault data."
@ -1565,10 +1565,10 @@
"message": "Deleting your account is permanent. It cannot be undone." "message": "Deleting your account is permanent. It cannot be undone."
}, },
"accountDeleted": { "accountDeleted": {
"message": "Konto forviŝita" "message": "Konto forigita"
}, },
"accountDeletedDesc": { "accountDeletedDesc": {
"message": "Via konto estas fermita, kaj ĉiuj rilataj datumoj estas forviŝitaj." "message": "Via konto estis fermita kaj ĉiuj rilataj datumoj estis forigitaj."
}, },
"preferences": { "preferences": {
"message": "Preferences" "message": "Preferences"
@ -1608,7 +1608,7 @@
"message": "Are you sure you want to leave? If you leave now then your current information will not be saved." "message": "Are you sure you want to leave? If you leave now then your current information will not be saved."
}, },
"unsavedChangesTitle": { "unsavedChangesTitle": {
"message": "Unsaved changes" "message": "Nekonservitaj ŝanĝoj"
}, },
"clone": { "clone": {
"message": "Clone" "message": "Clone"
@ -1629,11 +1629,11 @@
"message": "Set up an unlock method to change your vault timeout action." "message": "Set up an unlock method to change your vault timeout action."
}, },
"lock": { "lock": {
"message": "Lock", "message": "Ŝlosi",
"description": "Verb form: to make secure or inaccesible by" "description": "Verb form: to make secure or inaccesible by"
}, },
"trash": { "trash": {
"message": "Trash", "message": "Rubujo",
"description": "Noun: a special folder to hold deleted items" "description": "Noun: a special folder to hold deleted items"
}, },
"searchTrash": { "searchTrash": {
@ -1742,7 +1742,7 @@
"message": "By continuing, you agree to the" "message": "By continuing, you agree to the"
}, },
"and": { "and": {
"message": "and" "message": "kaj"
}, },
"acceptPolicies": { "acceptPolicies": {
"message": "By checking this box you agree to the following:" "message": "By checking this box you agree to the following:"
@ -1793,7 +1793,7 @@
"message": "By default this setting is ON. Turn OFF only if you experience graphical issues. Restart is required." "message": "By default this setting is ON. Turn OFF only if you experience graphical issues. Restart is required."
}, },
"approve": { "approve": {
"message": "Approve" "message": "Aprobi"
}, },
"verifyBrowserTitle": { "verifyBrowserTitle": {
"message": "Verify browser connection" "message": "Verify browser connection"
@ -1845,10 +1845,10 @@
"description": "'Sends' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." "description": "'Sends' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}, },
"sendTypeFile": { "sendTypeFile": {
"message": "File" "message": "Dosiero"
}, },
"sendTypeText": { "sendTypeText": {
"message": "Text" "message": "Teksto"
}, },
"searchSends": { "searchSends": {
"message": "Search Sends", "message": "Search Sends",
@ -1859,10 +1859,10 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}, },
"myVault": { "myVault": {
"message": "My vault" "message": "Mia trezorejo"
}, },
"text": { "text": {
"message": "Text" "message": "Teksto"
}, },
"deletionDate": { "deletionDate": {
"message": "Deletion date" "message": "Deletion date"
@ -1926,7 +1926,7 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}, },
"newPassword": { "newPassword": {
"message": "New password" "message": "Nova pasvorto"
}, },
"whatTypeOfSend": { "whatTypeOfSend": {
"message": "What type of Send is this?", "message": "What type of Send is this?",
@ -1943,7 +1943,7 @@
"message": "The file you want to send." "message": "The file you want to send."
}, },
"days": { "days": {
"message": "$DAYS$ days", "message": "$DAYS$ tagoj",
"placeholders": { "placeholders": {
"days": { "days": {
"content": "$1", "content": "$1",
@ -1952,10 +1952,10 @@
} }
}, },
"oneDay": { "oneDay": {
"message": "1 day" "message": "1 tago"
}, },
"custom": { "custom": {
"message": "Custom" "message": "Propra"
}, },
"deleteSendConfirmation": { "deleteSendConfirmation": {
"message": "Are you sure you want to delete this Send?", "message": "Are you sure you want to delete this Send?",
@ -1980,7 +1980,7 @@
"message": "Copy link" "message": "Copy link"
}, },
"disabled": { "disabled": {
"message": "Disabled" "message": "Malŝaltita"
}, },
"removePassword": { "removePassword": {
"message": "Remove password" "message": "Remove password"
@ -2079,10 +2079,10 @@
"message": "Resend code" "message": "Resend code"
}, },
"hours": { "hours": {
"message": "Hours" "message": "Horoj"
}, },
"minutes": { "minutes": {
"message": "Minutes" "message": "Minutoj"
}, },
"vaultTimeoutPolicyInEffect": { "vaultTimeoutPolicyInEffect": {
"message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).",
@ -2142,7 +2142,7 @@
"message": "One or more organization policies prevents you from exporting your personal vault." "message": "One or more organization policies prevents you from exporting your personal vault."
}, },
"addAccount": { "addAccount": {
"message": "Add account" "message": "Aldoni konton"
}, },
"removeMasterPassword": { "removeMasterPassword": {
"message": "Remove master password" "message": "Remove master password"
@ -2232,13 +2232,13 @@
} }
}, },
"locked": { "locked": {
"message": "Locked" "message": "Ŝlosita"
}, },
"unlocked": { "unlocked": {
"message": "Unlocked" "message": "Malŝlosita"
}, },
"generator": { "generator": {
"message": "Generator" "message": "Generilo"
}, },
"whatWouldYouLikeToGenerate": { "whatWouldYouLikeToGenerate": {
"message": "What would you like to generate?" "message": "What would you like to generate?"
@ -2269,16 +2269,16 @@
"message": "Use your domain's configured catch-all inbox." "message": "Use your domain's configured catch-all inbox."
}, },
"random": { "random": {
"message": "Random" "message": "Hazarda"
}, },
"randomWord": { "randomWord": {
"message": "Random word" "message": "Hazarda vorto"
}, },
"websiteName": { "websiteName": {
"message": "Website name" "message": "Website name"
}, },
"service": { "service": {
"message": "Service" "message": "Servo"
}, },
"allVaults": { "allVaults": {
"message": "All vaults" "message": "All vaults"
@ -2405,7 +2405,7 @@
"message": "API Access Token" "message": "API Access Token"
}, },
"apiKey": { "apiKey": {
"message": "API key" "message": "API-ŝlosilo"
}, },
"premiumSubcriptionRequired": { "premiumSubcriptionRequired": {
"message": "Premium subscription required" "message": "Premium subscription required"
@ -2490,10 +2490,10 @@
"message": "Device Type" "message": "Device Type"
}, },
"ipAddress": { "ipAddress": {
"message": "IP Address" "message": "IP-adreso"
}, },
"time": { "time": {
"message": "Time" "message": "Tempo"
}, },
"confirmLogIn": { "confirmLogIn": {
"message": "Confirm login" "message": "Confirm login"
@ -2563,7 +2563,7 @@
"message": "No email?" "message": "No email?"
}, },
"goBack": { "goBack": {
"message": "Go back" "message": "Reveni"
}, },
"toEditYourEmailAddress": { "toEditYourEmailAddress": {
"message": "to edit your email address." "message": "to edit your email address."
@ -2629,7 +2629,7 @@
"message": "Approve with master password" "message": "Approve with master password"
}, },
"region": { "region": {
"message": "Region" "message": "Regiono"
}, },
"ssoIdentifierRequired": { "ssoIdentifierRequired": {
"message": "Organization SSO identifier is required." "message": "Organization SSO identifier is required."
@ -2678,7 +2678,7 @@
"message": "required" "message": "required"
}, },
"search": { "search": {
"message": "Search" "message": "Serĉi"
}, },
"inputMinLength": { "inputMinLength": {
"message": "Input must be at least $COUNT$ characters long.", "message": "Input must be at least $COUNT$ characters long.",
@ -2745,7 +2745,7 @@
} }
}, },
"selectPlaceholder": { "selectPlaceholder": {
"message": "-- Select --" "message": "-- Elekti --"
}, },
"multiSelectPlaceholder": { "multiSelectPlaceholder": {
"message": "-- Type to filter --" "message": "-- Type to filter --"
@ -2760,7 +2760,7 @@
"message": "Clear all" "message": "Clear all"
}, },
"plusNMore": { "plusNMore": {
"message": "+ $QUANTITY$ more", "message": "+ $QUANTITY$ pli",
"placeholders": { "placeholders": {
"quantity": { "quantity": {
"content": "$1", "content": "$1",
@ -2769,7 +2769,7 @@
} }
}, },
"submenu": { "submenu": {
"message": "Submenu" "message": "Submenuo"
}, },
"toggleSideNavigation": { "toggleSideNavigation": {
"message": "Toggle side navigation" "message": "Toggle side navigation"
@ -2803,7 +2803,7 @@
"message": "Resolve the errors below and try again." "message": "Resolve the errors below and try again."
}, },
"description": { "description": {
"message": "Description" "message": "Priskribo"
}, },
"importSuccess": { "importSuccess": {
"message": "Data successfully imported" "message": "Data successfully imported"
@ -2854,7 +2854,7 @@
"message": "Invalid file password, please use the password you entered when you created the export file." "message": "Invalid file password, please use the password you entered when you created the export file."
}, },
"destination": { "destination": {
"message": "Destination" "message": "Celo"
}, },
"learnAboutImportOptions": { "learnAboutImportOptions": {
"message": "Learn about your import options" "message": "Learn about your import options"
@ -2983,7 +2983,7 @@
"message": "Try again or look for an email from LastPass to verify it's you." "message": "Try again or look for an email from LastPass to verify it's you."
}, },
"collection": { "collection": {
"message": "Collection" "message": "Kolekto"
}, },
"lastPassYubikeyDesc": { "lastPassYubikeyDesc": {
"message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button."
@ -3027,7 +3027,7 @@
} }
}, },
"backTo": { "backTo": {
"message": "Back to $NAME$", "message": "Reveni al $NAME$",
"description": "Navigate back to a previous folder or collection", "description": "Navigate back to a previous folder or collection",
"placeholders": { "placeholders": {
"name": { "name": {
@ -3037,7 +3037,7 @@
} }
}, },
"back": { "back": {
"message": "Back", "message": "Reveni",
"description": "Button text to navigate back" "description": "Button text to navigate back"
}, },
"removeItem": { "removeItem": {
@ -3051,7 +3051,7 @@
} }
}, },
"data": { "data": {
"message": "Data" "message": "Datumoj"
}, },
"fileSends": { "fileSends": {
"message": "File Sends" "message": "File Sends"

View File

@ -877,11 +877,11 @@
"message": "You can change your master password on the Bitwarden web app." "message": "You can change your master password on the Bitwarden web app."
}, },
"fingerprintPhrase": { "fingerprintPhrase": {
"message": "Sõrmejälje fraas", "message": "Unikaalne sõnajada",
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
}, },
"yourAccountsFingerprint": { "yourAccountsFingerprint": {
"message": "Konto sõrmejälje fraas", "message": "Sinu konto unikaalne sõnajada",
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
}, },
"goToWebVault": { "goToWebVault": {
@ -1781,10 +1781,10 @@
"message": "Paraku ei ole brauseri integratsioon hetkel Linuxi versioonis toetatud." "message": "Paraku ei ole brauseri integratsioon hetkel Linuxi versioonis toetatud."
}, },
"enableBrowserIntegrationFingerprint": { "enableBrowserIntegrationFingerprint": {
"message": "Nõua brauseri integratsiooni ülekinnitamist" "message": "Nõua brauseri ühendamiseks kinnitust"
}, },
"enableBrowserIntegrationFingerprintDesc": { "enableBrowserIntegrationFingerprintDesc": {
"message": "See seadistus võimaldab täiendavat kaitset, küsides brauseriga liidestamisel sõrmejälje fraasi. Sisselülitamisel nõuab see seadistus igakordset kasutaja sekkumist, kui luuakse ühendus brauseri ja töölaua rakenduse vahel." "message": "See seadistus võimaldab täiendavat kaitset, küsides brauseriga ühendamisel teie unikaalset sõnajada. Sisselülitamisel nõuab see seadistus iga kord kasutaja kinnitust, kui luuakse ühendus brauseri ja töölaua rakenduse vahel."
}, },
"enableHardwareAcceleration": { "enableHardwareAcceleration": {
"message": "Use hardware acceleration" "message": "Use hardware acceleration"
@ -1799,7 +1799,7 @@
"message": "Brauseri ühendamise kinnitamine" "message": "Brauseri ühendamise kinnitamine"
}, },
"verifyBrowserDesc": { "verifyBrowserDesc": {
"message": "Veendu, et kuvatav sõrmejälje fraas on identne sellega, mida kuvatakse brauseri lisas." "message": "Veendu, et kuvatav unikaalne sõnajada on identne sellega, mida kuvatakse brauseris."
}, },
"verifyNativeMessagingConnectionTitle": { "verifyNativeMessagingConnectionTitle": {
"message": "$APPID$ soovib Bitwardeniga ühendust luua", "message": "$APPID$ soovib Bitwardeniga ühendust luua",
@ -2456,10 +2456,10 @@
"message": "Sinu seadmesse saadeti teavitus." "message": "Sinu seadmesse saadeti teavitus."
}, },
"fingerprintMatchInfo": { "fingerprintMatchInfo": {
"message": "Veendu, et hoidla on lahti lukustatud ja sõrmejälje fraasid seadmete vahel ühtivad." "message": "Veendu, et sinu hoidla on avatud ja unikaalne sõnajada ühtib teise seadmega."
}, },
"fingerprintPhraseHeader": { "fingerprintPhraseHeader": {
"message": "Sõrmejälje fraas" "message": "Unikaalne sõnajada"
}, },
"needAnotherOption": { "needAnotherOption": {
"message": "Bitwardeni rakenduse seadistuses peab olema konfigureeritud sisselogimine läbi seadme. Vajad teist valikut?" "message": "Bitwardeni rakenduse seadistuses peab olema konfigureeritud sisselogimine läbi seadme. Vajad teist valikut?"

View File

@ -604,10 +604,10 @@
"message": "Uusi käyttäjätilisi on luotu! Voit nyt kirjautua sisään." "message": "Uusi käyttäjätilisi on luotu! Voit nyt kirjautua sisään."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Uusi tilisi on luotu!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Sinut on kirjattu sisään!"
}, },
"masterPassSent": { "masterPassSent": {
"message": "Lähetimme pääsalasanasi vihjeen sinulle sähköpostitse." "message": "Lähetimme pääsalasanasi vihjeen sinulle sähköpostitse."

View File

@ -604,10 +604,10 @@
"message": "Tvoj novi račun je stvoren! Sada se možeš prijaviti." "message": "Tvoj novi račun je stvoren! Sada se možeš prijaviti."
}, },
"newAccountCreated2": { "newAccountCreated2": {
"message": "Your new account has been created!" "message": "Tvoj novi račun je stvoren!"
}, },
"youHaveBeenLoggedIn": { "youHaveBeenLoggedIn": {
"message": "You have been logged in!" "message": "Prijava uspješna!"
}, },
"masterPassSent": { "masterPassSent": {
"message": "Poslali smo e-poštu s podsjetnikom glavne lozinke." "message": "Poslali smo e-poštu s podsjetnikom glavne lozinke."

Some files were not shown because too many files have changed in this diff Show More