1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-20 10:13:31 +00:00

Merged with master and fixed conflicts

This commit is contained in:
gbubemismith
2023-05-08 12:16:25 -04:00
1131 changed files with 52396 additions and 51717 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "@bitwarden/browser",
"version": "2023.3.0",
"version": "2023.4.0",
"scripts": {
"build": "webpack",
"build:mv3": "cross-env MANIFEST_VERSION=3 webpack",

View File

@@ -196,13 +196,13 @@
"message": "المساعدة والتعليقات"
},
"helpCenter": {
"message": "Bitwarden Help center"
"message": "مركز المساعدة Bitwarden"
},
"communityForums": {
"message": "Explore Bitwarden community forums"
"message": "استكشاف منتديات مجتمع Bitwarden"
},
"contactSupport": {
"message": "Contact Bitwarden support"
"message": "اتصل بالدعم Bitwarden"
},
"sync": {
"message": "المزامنة"
@@ -1342,74 +1342,74 @@
"description": "ex. Date this password was updated"
},
"neverLockWarning": {
"message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
"message": "هل أنت متأكد من أنك تريد استخدام خيار \"مطلقا\"؟ إعداد خيارات القفل إلى \"مطلقا\" يخزن مفتاح تشفير المستودع الخاص بك على جهازك. إذا كنت تستخدم هذا الخيار، يجب أن تتأكد من الحفاظ على حماية جهازك بشكل صحيح."
},
"noOrganizationsList": {
"message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
"message": "أنت لا تنتمي إلى أي مؤسسة. تسمح لك المؤسسات بمشاركة العناصر بأمان مع مستخدمين آخرين."
},
"noCollectionsInList": {
"message": "There are no collections to list."
"message": "لا توجد مجموعات لعرضها."
},
"ownership": {
"message": "Ownership"
"message": "المالك"
},
"whoOwnsThisItem": {
"message": "Who owns this item?"
"message": "من يملك هذا العنصر؟"
},
"strong": {
"message": "Strong",
"message": "قوية",
"description": "ex. A strong password. Scale: Weak -> Good -> Strong"
},
"good": {
"message": "Good",
"message": "جيدة",
"description": "ex. A good password. Scale: Weak -> Good -> Strong"
},
"weak": {
"message": "Weak",
"message": "ضعيفة",
"description": "ex. A weak password. Scale: Weak -> Good -> Strong"
},
"weakMasterPassword": {
"message": "Weak master password"
"message": "كلمة المرور الرئيسية ضعيفة"
},
"weakMasterPasswordDesc": {
"message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
"message": "كلمة المرور الرئيسية التي اخترتها ضعيفة. يجب عليك استخدام كلمة مرور رئيسية قوية (أو عبارة مرور) لحماية حساب Bitwarden الخاص بك بشكل صحيح. هل أنت متأكد من أنك تريد استخدام كلمة المرور الرئيسية هذه؟"
},
"pin": {
"message": "PIN",
"message": "رقم التعريف الشخصي",
"description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
},
"unlockWithPin": {
"message": "Unlock with PIN"
"message": "فتح باستخدام رمز PIN"
},
"setYourPinCode": {
"message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
"message": "تعيين رمز PIN الخاص بك لإلغاء قفل Bitwarden. سيتم إعادة تعيين إعدادات PIN الخاصة بك إذا قمت بتسجيل الخروج بالكامل من التطبيق."
},
"pinRequired": {
"message": "PIN code is required."
"message": "رمز PIN مطلوب."
},
"invalidPin": {
"message": "Invalid PIN code."
"message": "رمز PIN غير صالح."
},
"unlockWithBiometrics": {
"message": "Unlock with biometrics"
"message": "فتح باستخدام القياسات الحيوية"
},
"awaitDesktop": {
"message": "Awaiting confirmation from desktop"
"message": "في انتظار التأكيد من سطح المكتب"
},
"awaitDesktopDesc": {
"message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser."
"message": "يرجى التأكد من استخدام القياسات الحيوية في تطبيق سطح المكتب Bitwarden لإعداد القياسات الحيوية للمتصفح."
},
"lockWithMasterPassOnRestart": {
"message": "Lock with master password on browser restart"
"message": "قفل مع كلمة المرور الرئيسية عند إعادة تشغيل المتصفح"
},
"selectOneCollection": {
"message": "You must select at least one collection."
"message": "يجب عليك تحديد مجموعة واحدة على الأقل."
},
"cloneItem": {
"message": "Clone item"
"message": "استنساخ العنصر"
},
"clone": {
"message": "Clone"
"message": "استنساخ"
},
"passwordGeneratorPolicyInEffect": {
"message": "One or more organization policies are affecting your generator settings."
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "تم تغيير كلمة المرور الرئيسية الخاصة بك مؤخرًا من قبل مسؤول في مؤسستك. من أجل الوصول إلى الخزنة، يجب عليك تحديثها الآن. سيتم تسجيل خروجك من الجلسة الحالية، مما يتطلب منك تسجيل الدخول مرة أخرى. قد تظل الجلسات النشطة على أجهزة أخرى نشطة لمدة تصل إلى ساعة واحدة."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "التسجيل التلقائي"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "مهلة خزنتك تتجاوز القيود التي تضعها مؤسستك."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Ana parolu tənzimlə"
},
"currentMasterPass": {
"message": "Hazırkı ana parol"
},
"newMasterPass": {
"message": "Yeni ana parol"
},
"confirmNewMasterPass": {
"message": "Yeni ana parolu təsdiqlə"
},
"masterPasswordPolicyInEffect": {
"message": "Bir və ya daha çox təşkilat siyasəti, aşağıdakı tələbləri qarşılamaq üçün ana parolunuzu tələb edir:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər."
},
"updateWeakMasterPasswordWarning": {
"message": "Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Anbara müraciət üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Avtomatik qeydiyyat"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir. Anbar vaxt bitişi əməliyyatı $ACTION$ olaraq tənzimləndi.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Təşkilatınızın siyasətləri, anbar vaxt bitişi əməliyyatınızı $ACTION$ olaraq tənzimlədi.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Anbar vaxt bitişi, təşkilatınız tərəfindən tənzimlənən məhdudiyyətləri aşır."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Yeni bir pəncərədə açılır"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Прызначыць асноўны пароль"
},
"currentMasterPass": {
"message": "Бягучы асноўны пароль"
},
"newMasterPass": {
"message": "Новы асноўны пароль"
},
"confirmNewMasterPass": {
"message": "Пацвердзіць новы асноўны пароль"
},
"masterPasswordPolicyInEffect": {
"message": "Адна або больш палітык арганізацыі патрабуе, каб ваш асноўны пароль адпавядаў наступным патрабаванням:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Ваш асноўны пароль нядаўна быў зменены адміністратарам арганізацыі. Для таго, каб атрымаць доступ да вашага сховішча, вы павінны абнавіць яго зараз. Гэта прывядзе да завяршэння бягучага сеанса і вам неабходна будзе ўвайсці паўторна. Сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны."
},
"updateWeakMasterPasswordWarning": {
"message": "Ваш асноўны пароль не адпавядае адной або некалькім палітыкам арганізацыі. Для атрымання доступу да сховішча, вы павінны абнавіць яго. Працягваючы, вы выйдзіце з бягучага сеанса і вам неабходна будзе ўвайсці паўторна. Актыўныя сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Аўтаматычная рэгістрацыя"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае гадзін: $HOURS$; хвілін: $MINUTES$. Для часу чакання вашага сховішча прызначана дзеянне $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Палітыкай вашай арганізацыі прызначана дзеянне $ACTION$ для часу чакання вашага сховішча.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Час чакання вашага сховішча перавышае дазволеныя абмежаванні, якія прызначыла ваша арганізацыя."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Адкрываць у новым акне"
}
}

View File

@@ -439,7 +439,7 @@
"message": "Повторното въвеждане на главната парола е задължително."
},
"masterPasswordMinlength": {
"message": "Master password must be at least $VALUE$ characters long.",
"message": "Главната парола трябва да е дълга поне $VALUE$ знака.",
"description": "The Master Password must be at least a specific number of characters long.",
"placeholders": {
"value": {
@@ -976,7 +976,7 @@
"message": "При засичане на формуляр за вписване при зареждането на уеб страницата автоматично да се попълват данните на съответстващата регистрация."
},
"experimentalFeature": {
"message": "Compromised or untrusted websites can exploit auto-fill on page load."
"message": "Компроментирани и измамни уеб сайтове могат да се възползват от автоматичното попълване при зареждане на страницата."
},
"learnMoreAboutAutofill": {
"message": "Научете повече относно автоматичното попълване"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Задаване на главна парола"
},
"currentMasterPass": {
"message": "Текуща главна парола"
},
"newMasterPass": {
"message": "Нова главна парола"
},
"confirmNewMasterPass": {
"message": "Потвърждаване на новата главна парола"
},
"masterPasswordPolicyInEffect": {
"message": "Поне една политика на организация има следните изисквания към главната ви парола:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Вашата главна парола наскоро е била сменена от администратор в организацията Ви. За да получите достъп до трезора, трябва първо да я промените. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час."
},
"updateWeakMasterPasswordWarning": {
"message": "Вашата главна парола не отговаря на една или повече политики на организацията Ви. За да получите достъп до трезора, трябва да промените главната си парола сега. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Автоматично включване"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е $HOURS$ час(а) и $MINUTES$ минута/и. Зададеното действие при изтичане на това време е $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Настройките на организацията Ви задават следното действие при изтичане на времето за достъп до трезора: $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Времето за достъп до трезора Ви превишава ограничението, определено от организацията Ви."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "মূল পাসওয়ার্ড ধার্য করুন"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "এক বা একাধিক সংস্থার নীতিগুলির কারণে নিম্নলিখিত প্রয়োজনসমূহ মূল পাসওয়ার্ডের পূরণ করা প্রয়োজন:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Estableix la contrasenya mestra"
},
"currentMasterPass": {
"message": "Contrasenya mestra actual"
},
"newMasterPass": {
"message": "Contrasenya mestra nova"
},
"confirmNewMasterPass": {
"message": "Confirma la contrasenya mestra nova"
},
"masterPasswordPolicyInEffect": {
"message": "Una o més polítiques dorganització requereixen que la vostra contrasenya principal complisca els requisits següents:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Un administrador de l'organització ha canviat recentment la contrasenya principal. Per accedir a la caixa forta, heu d'actualitzar-la ara. Si continueu, es tancarà la sessió actual i heu de tornar a iniciar-la. És possible que les sessions obertes en altres dispositius continuen actives fins a una hora."
},
"updateWeakMasterPasswordWarning": {
"message": "La vostra contrasenya mestra no compleix una o més de les polítiques de l'organització. Per accedir a la caixa forta, heu d'actualitzar-la ara. Si continueu, es tancarà la sessió actual i us demanarà que torneu a iniciar-la. Les sessions en altres dispositius poden continuar romanent actives fins a una hora."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Inscripció automàtica"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Les polítiques de l'organització afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès de la caixa forta és de $HOURS$ hores i $MINUTES$ minuts. L'acció de temps d'espera de la caixa forta està definida en $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Les polítiques de l'organització han establert l'acció de temps d'espera de la caixa forta a $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "El temps d'espera de la caixa forta supera les restriccions establertes per la vostra organització."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -439,7 +439,7 @@
"message": "Hovedadgangskode kræves angivet igen."
},
"masterPasswordMinlength": {
"message": "Master password must be at least $VALUE$ characters long.",
"message": "Hovedadgangskoden skal udgøre minimum $VALUE$ tegn.",
"description": "The Master Password must be at least a specific number of characters long.",
"placeholders": {
"value": {
@@ -976,10 +976,10 @@
"message": "Hvis der registreres en loginformular, så auto-udfyld, når websiden indlæses."
},
"experimentalFeature": {
"message": "Compromised or untrusted websites can exploit auto-fill on page load."
"message": "Kompromitterede eller ikke-betroede websteder kan udnytte autoudfyldning ved sideindlæsning."
},
"learnMoreAboutAutofill": {
"message": "Learn more about auto-fill"
"message": "Læs mere om autoudfyldning"
},
"defaultAutoFillOnPageLoad": {
"message": "Standardindstilling for autofyld for loginelementer"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Indstil hovedadgangskode"
},
"currentMasterPass": {
"message": "Aktuel hovedadgangskode"
},
"newMasterPass": {
"message": "Ny hovedadgangskode"
},
"confirmNewMasterPass": {
"message": "Bekræft ny hovedadgangskode"
},
"masterPasswordPolicyInEffect": {
"message": "Én eller flere organisationspolitikker kræver, at din hovedadgangskode opfylder flg. krav:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Dit hovedadgangskode blev for nylig ændret af en administrator i din organisation. For at få adgang til boksen skal du opdatere den nu. Hvis du fortsætter, logges du ud af din nuværende session, hvilket kræver, at du logger ind igen. Aktive sessioner på andre enheder kan fortsætte med at være aktive i op til én time."
},
"updateWeakMasterPasswordWarning": {
"message": "Din hovedadgangskode overholder ikke en eller flere organisationspolitikker. For at få adgang til boksen skal hovedadgangskode opdateres nu. Fortsættes, logges du ud af den nuværende session og vil skulle logger ind igen. Aktive sessioner på andre enheder kan forblive aktive i op til én time."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatisk tilmelding"
},
@@ -1863,7 +1875,7 @@
"message": "Minutter"
},
"vaultTimeoutPolicyInEffect": {
"message": "Din organisations politikker påvirker din boks-timeout. Maksimalt tilladt boks-timeout er $HOURS$ time(r) og $MINUTES$ minut(ter)",
"message": "Organisationspolitikker har sat maks. tilladt boks-timeout. til $HOURS$ time(r) og $MINUTES$ minut(ter).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Organisationspolitikkerne påvirker boks-timeout. Maks. tilladt boks-timeout er $HOURS$ time(r) og $MINUTES$ minut(ter). Boks-timeouthandlingen er sat til $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Organisationspolitikkerne har sat boks-timeouthandlingen til $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Din boks-timeout overskrider de begrænsninger, der er fastsat af din organisation."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Åbnes i et nyt vindue"
}
}

View File

@@ -596,13 +596,13 @@
"message": "Karten auf Tab Seite anzeigen"
},
"showCardsCurrentTabDesc": {
"message": "Karten-Einträge auf der Tab Seite anzeigen, um das automatische Ausfüllen zu vereinfachen."
"message": "Karten-Einträge auf der Tab Seite anzeigen, um das Auto-Ausfüllen zu vereinfachen."
},
"showIdentitiesCurrentTab": {
"message": "Identitäten auf Tab Seite anzeigen"
},
"showIdentitiesCurrentTabDesc": {
"message": "Identitäten-Einträge auf der Tab Seite anzeigen, um das automatische Ausfüllen zu vereinfachen."
"message": "Identitäten-Einträge auf der Tab Seite anzeigen, um das Auto-Ausfüllen zu vereinfachen."
},
"clearClipboard": {
"message": "Zwischenablage leeren",
@@ -637,7 +637,7 @@
"message": "Verwende einen zweiten Klick, um auf die Erstellung von Passwörtern und passende Zugangsdaten für die Webseite zuzugreifen. "
},
"defaultUriMatchDetection": {
"message": "Standard-URI-Match-Erkennung",
"message": "Standard URI-Übereinstimmungserkennung",
"description": "Default URI match detection for auto-fill."
},
"defaultUriMatchDetectionDesc": {
@@ -1292,7 +1292,7 @@
"description": "A programming term, also known as 'RegEx'."
},
"matchDetection": {
"message": "Match-Erkennung",
"message": "Übereinstimmungserkennung",
"description": "URI match detection for auto-fill."
},
"defaultMatchDetection": {
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Master-Passwort festlegen"
},
"currentMasterPass": {
"message": "Aktuelles Master-Passwort"
},
"newMasterPass": {
"message": "Neues Master-Passwort"
},
"confirmNewMasterPass": {
"message": "Neues Master-Passwort bestätigen"
},
"masterPasswordPolicyInEffect": {
"message": "Eine oder mehrere Organisationsrichtlinien erfordern, dass dein Masterpasswort die folgenden Anforderungen erfüllt:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Dein Master-Passwort wurde kürzlich von einem Administrator deiner Organisation geändert. Um auf den Tresor zuzugreifen, musst du es jetzt aktualisieren. Wenn du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet und musst dich erneut anmelden. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben."
},
"updateWeakMasterPasswordWarning": {
"message": "Dein Master-Passwort entspricht nicht einer oder mehreren Richtlinien deiner Organisation. Um auf den Tresor zugreifen zu können, musst du dein Master-Passwort jetzt aktualisieren. Wenn du fortfährst, wirst du von deiner aktuellen Sitzung abgemeldet und musst dich erneut anmelden. Aktive Sitzungen auf anderen Geräten können noch bis zu einer Stunde lang aktiv bleiben."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatische Registrierung"
},
@@ -1863,7 +1875,7 @@
"message": "Minuten"
},
"vaultTimeoutPolicyInEffect": {
"message": "Deine Unternehmensrichtlinien beeinflussen dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout ist $HOURS$ Stunde(n) und $MINUTES$ Minute(n)",
"message": "Deine Unternehmensrichtlinien haben das maximal zulässige Tresor-Timeout auf $HOURS$ Stunde(n) und $MINUTES$ Minute(n) festgelegt.",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Deine Organisationsrichtlinien beeinflussen dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout beträgt $HOURS$ Stunde(n) und $MINUTES$ Minute(n). Deine Tresor-Timeout-Aktion ist auf $ACTION$ gesetzt.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Durch deine Organisationsrichtlinien wurde deine Tresor-Timeout-Aktion auf $ACTION$ gesetzt.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Dein Tresor-Timeout überschreitet die von deinem Unternehmen festgelegten Beschränkungen."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Wird in einem neuen Fenster geöffnet"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Ορισμός Κύριου Κωδικού"
},
"currentMasterPass": {
"message": "Τρέχων Κύριος Κωδικός"
},
"newMasterPass": {
"message": "Νέος Κύριος Κωδικός"
},
"confirmNewMasterPass": {
"message": "Επιβεβαίωση Νέου Κύριου Κωδικού"
},
"masterPasswordPolicyInEffect": {
"message": "Σε μία ή περισσότερες πολιτικές του οργανισμού απαιτείται ο κύριος κωδικός να πληρεί τις ακόλουθες απαιτήσεις:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Ο Κύριος Κωδικός Πρόσβασής σας άλλαξε πρόσφατα από διαχειριστή στον οργανισμό σας. Για να αποκτήσετε πρόσβαση στο vault, πρέπει να τον ενημερώσετε τώρα. Η διαδικασία θα σας αποσυνδέσει από την τρέχουσα συνεδρία σας, απαιτώντας από εσάς να συνδεθείτε ξανά. Οι ενεργές συνεδρίες σε άλλες συσκευές ενδέχεται να συνεχίσουν να είναι ενεργές για μία ώρα."
},
"updateWeakMasterPasswordWarning": {
"message": "Ο Κύριος κωδικός πρόσβασης δεν πληροί τις απαιτήσεις πολιτικής αυτού του οργανισμού. Για να έχετε πρόσβαση στο vault, πρέπει να ενημερώσετε τον Κύριο σας κωδικό άμεσα. Η διαδικασία θα σας αποσυνδέσει από την τρέχουσα συνεδρία σας, απαιτώντας από εσάς να συνδεθείτε ξανά. Οι ενεργές συνεδρίες σε άλλες συσκευές ενδέχεται να συνεχίσουν να είναι ενεργές για μία ώρα."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Αυτόματη Εγγραφή"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο λήξης του vault σας. Το μέγιστο επιτρεπόμενο χρονικό όριο λήξης vault είναι $HOURS$ ώρα(ες) και $MINUTES$ λεπτό(ά). H ενέργεια χρονικού ορίου λήξης είναι ορισμένη ως $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Οι πολιτικές του οργανισμού σας έχουν ορίσει την ενέργεια χρονικού ορίου λήξης vault ως $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Το χρονικό όριο του vault σας υπερβαίνει τους περιορισμούς που έχει ορίσει ο οργανισμός σας."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Ανοίγει σε νέο παράθυρο"
}
}

View File

@@ -203,7 +203,7 @@
},
"contactSupport": {
"message": "Contact Bitwarden support"
},
},
"sync": {
"message": "Sync"
},
@@ -1467,6 +1467,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1847,6 +1856,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1866,7 +1878,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1878,6 +1890,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2176,5 +2214,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organisation policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organisation. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organisation policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrolment"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organisation policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organisation."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organisation policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic Enrollment"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Establecer contraseña maestra"
},
"currentMasterPass": {
"message": "Contraseña maestra actual"
},
"newMasterPass": {
"message": "Nueva contraseña maestra"
},
"confirmNewMasterPass": {
"message": "Confirma la nueva contraseña maestra"
},
"masterPasswordPolicyInEffect": {
"message": "Una o más políticas de la organización requieren que su contraseña maestra cumpla con los siguientes requisitos:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Su contraseña maestra ha sido cambiada recientemente por un administrador de su organización. Para acceder a la caja fuerte, debe actualizarla ahora. Proceder le desconectará de su sesión actual, requiriendo que vuelva a iniciar sesión. Las sesiones activas en otros dispositivos pueden seguir estando activas durante una hora."
},
"updateWeakMasterPasswordWarning": {
"message": "Su contraseña maestra no cumple con una o más de las políticas de su organización. Para acceder a la caja fuerte, debe actualizar su contraseña maestra ahora. Proceder le desconectará de su sesión actual, requiriendo que vuelva a iniciar sesión. Las sesiones activas en otros dispositivos pueden seguir estando activas durante hasta una hora."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Inscripción automática"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Las políticas de su organización están afectando al tiempo de espera de tu caja fuerte. El tiempo de espera de tu caja fuerte máximo permitido es de $HOURS$ hora(s) y $MINUTES$ minuto(s). La acción de tiempo de espera de tu caja fuerte está establecida en $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Las políticas de su organización han establecido su acción de tiempo de espera de tu caja fuerte en $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "El tiempo de espera de tu caja fuerte excede las restricciones establecidas por tu organización."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Abre en una nueva ventana"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Määra ülemparool"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "Üks või enam organisatsiooni eeskirja nõuavad, et ülemparool vastaks nendele nõudmistele:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Organisatsiooni administraator muutis hiljuti sinu ülemparooli. Hoidlale ligi pääsemiseks pead seda nüüd uuendama. Jätkates logitakse sind käimasolevast sessioonist välja, misjärel nõutakse uuesti sisselogimist. Teistes seadmetes olevad aktiivsed sessioonid jäävad aktiivseks kuni üheks tunniks."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automaatne liitumine"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Valitud hoidla ajalõpp ei ole organisatsiooni poolt määratud reeglitega kooskõlas."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Avaneb uues aknas"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Ezarri pasahitz nagusia"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "Erakundeko politika batek edo gehiagok pasahitz nagusia behar dute baldintza hauek betetzeko:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Zure erakundeko administratzaile batek pasahitz nagusia aldatu berri du. Kutxa gotorrera sartzeko, pasahitz nagusia orain eguneratu behar duzu. Beraz, oraingo saiotik atera eta saioa hasteko eskatuko zaizu. Beste gailu batzuetako saio aktiboek ordubete iraun dezakete aktibo."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Izen-emate automatikoa"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Zure kutxa gotorreko itxaronaldiak, zure erakundeak ezarritako murrizpenak gainditzen ditu."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "تنظیم کلمه عبور اصلی"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "یک یا چند سیاست سازمانی برای تأمین شرایط زیر به کلمه عبور اصلی شما احتیاج دارد:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "کلمه عبور اصلی شما اخیراً توسط سرپرست سازمان‌تان تغییر کرده است. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "ثبت نام خودکار"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "مهلت زمانی شما بیش از محدودیت های تعیین شده توسط سازمانتان است."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -619,10 +619,10 @@
"message": "Tallenna"
},
"enableChangedPasswordNotification": {
"message": "Kysy päivitetäänkö olemassa oleva kirjautimistieto"
"message": "Kysy päivitetäänkö olemassa oleva kirjautumistieto"
},
"changedPasswordNotificationDesc": {
"message": "Kysy päivitetäänkö kirjautumistiedon salasana, kun sivustolla havaitaan muutos."
"message": "Kysy päivitetäänkö kirjautumistiedon salasana sivustolla havaittua muutosta vastaavaksi."
},
"notificationChangeDesc": {
"message": "Haluatko päivittää salasanan Bitwardeniin?"
@@ -1338,7 +1338,7 @@
"description": "ex. Date this item was created"
},
"datePasswordUpdated": {
"message": "Salasana päivitettiin",
"message": "Salasana vaihdettiin",
"description": "ex. Date this password was updated"
},
"neverLockWarning": {
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Aseta pääsalasana"
},
"currentMasterPass": {
"message": "Nykyinen pääsalasana"
},
"newMasterPass": {
"message": "Uusi pääsalasana"
},
"confirmNewMasterPass": {
"message": "Vahvista uusi pääsalasana"
},
"masterPasswordPolicyInEffect": {
"message": "Yksi tai useampi organisaatiokäytäntö edellyttää, että pääsalasanasi täyttää seuraavat vaatimukset:"
},
@@ -1836,13 +1845,16 @@
"message": "Sinun on vahvistettava sähköpostiosoitteesi käyttääksesi ominaisuutta. Voit vahvistaa osoitteesi verkkoholvissa."
},
"updatedMasterPassword": {
"message": "Pääsalasana päivitettiin"
"message": "Pääsalasanasi on vaihdettu"
},
"updateMasterPassword": {
"message": "Vaihda pääsalasana"
"message": "Päivitä pääsalasana"
},
"updateMasterPasswordWarning": {
"message": "Organisaatiosi ylläpito on hiljattain vaihtanut pääsalasanasi. Käyttääksesi holvia sinun on päivitettävä pääsalasanasi nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan."
"message": "Organisaatiosi ylläpito on hiljattain vaihtanut pääsalasanasi ja käyttääksesi holvia sinun on päivitettävä se nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan."
},
"updateWeakMasterPasswordWarning": {
"message": "Pääsalasanasi ei täytä yhden tai useamman organisaatiokäytännön vaatimuksia ja holvin käyttämiseksi sinun on vaihdettava se nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automaattinen liitos"
@@ -1863,7 +1875,7 @@
"message": "Minuuttia"
},
"vaultTimeoutPolicyInEffect": {
"message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) ja $MINUTES$ minuutti(a).",
"message": "Organisaatiokäytännöt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tunti(a) $MINUTES$ minuutti(a).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) $MINUTES$ minuutti(a). Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Organisaatiokäytännöt ovat määrittäneet holvillesi aikakatkaisutoiminnon $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Holvisi aikakatkaisu ylittää organisaatiosi asettamat rajoitukset."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Itakda ang master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "Isang o higit pang mga patakaran ng organisasyon ay nangangailangan ng iyong master password upang matugunan ang sumusunod na kinakailangan:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Ang iyong master password ay binago kamakailan ng isang administrator sa iyong samahan. Para ma-access ang vault, kailangan mo itong i-update ngayon. Ang proceeding ay mag-log out sa iyong kasalukuyang session, na nangangailangan na mag-log in muli. Ang mga aktibong sesyon sa iba pang mga aparato ay maaaring patuloy na manatiling aktibo hanggang sa isang oras."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Awtomatikong pagpapatala"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Ang iyong vault timeout ay lumalampas sa mga restriksiyon na itinakda ng iyong organisasyon."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -267,7 +267,7 @@
"description": "Make the first letter of a work uppercase."
},
"includeNumber": {
"message": "Inclure le numéro"
"message": "Inclure un nombre"
},
"minNumbers": {
"message": "Minimum de chiffres"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Définir le mot de passe principal"
},
"currentMasterPass": {
"message": "Mot de passe principal actuel"
},
"newMasterPass": {
"message": "Nouveau mot de passe principal"
},
"confirmNewMasterPass": {
"message": "Confirmer le nouveau mot de passe principal"
},
"masterPasswordPolicyInEffect": {
"message": "Une ou plusieurs politiques de sécurité de l'organisation exigent que votre mot de passe principal réponde aux exigences suivantes :"
},
@@ -1504,7 +1513,7 @@
}
},
"masterPasswordPolicyRequirementsNotMet": {
"message": "Votre nouveau mot de passe principal ne répond pas aux exigences en matière de politique de sécurité."
"message": "Votre nouveau mot de passe principal ne répond pas aux exigences de politique de sécurité."
},
"acceptPolicies": {
"message": "En cochant cette case vous acceptez ce qui suit :"
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Votre mot de passe principal a été récemment changé par un administrateur de votre organisation. Pour pouvoir accéder au coffre, vous devez le mettre à jour maintenant. En poursuivant, vous serez déconnecté de votre session actuelle et vous devrez vous reconnecter. Les sessions actives sur d'autres appareils peuvent rester actives pendant encore une heure."
},
"updateWeakMasterPasswordWarning": {
"message": "Votre mot de passe principal ne répond pas aux exigences de politique de sécurité de cette organisation. Pour accéder au coffre, vous devez mettre à jour votre mot de passe principal dès maintenant. En poursuivant, vous serez déconnecté de votre session actuelle et vous devrez vous reconnecter. Les sessions actives sur d'autres appareils peuver rester actives pendant encore une heure."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Inscription automatique"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Les politiques de sécurité de votre organisation affectent le délai d'expiration de votre coffre. Le délai d'expiration autorisé du coffre est de $HOURS$ heure(s) et $MINUTES$ minute(s) maximum",
"message": "Les politiques de sécurité de votre organisation ont défini le délai d'expiration de votre coffre à $HOURS$ heure(s) et $MINUTES$ minute(s) maximum.",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Les politiques de sécurité de votre organisation affectent le délai d'expiration de votre coffre. Le délai autorisé d'expiration du coffre est de $HOURS$ heure(s) et $MINUTES$ minute(s) maximum. L'action après délai d'expiration de votre coffre est fixée à $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Les politiques de sécurité de votre organisation ont défini l'action après délai d'expiration de votre coffre à $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Le délai d'expiration de votre coffre-fort dépasse les restrictions définies par votre organisation."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "S'ouvre dans une nouvelle fenêtre"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "הגדר סיסמה ראשית"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "אחד או יותר מאילוצי המדיניות של הארגון דורשים שהסיסמה הראשית שלך תעמוד בדרישות הבאות:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "הזמן הקצוב לכספת שלך חורג מהמגבלות שנקבעו על ידי הארגון שלך."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "मास्टर पासवर्ड सेट करें"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "एक या एक से अधिक संगठन नीतियों को निम्नलिखित आवश्यकताओं को पूरा करने के लिए आपके मास्टर पासवर्ड की आवश्यकता होती है:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "आपका मास्टर पासवर्ड हाल ही में आपके संगठन के एक व्यवस्थापक द्वारा बदल दिया गया था। तिजोरी तक पहुँचने के लिए, आपको इसे अभी अपडेट करना होगा। ये कार्यवाही आपको अपने वर्तमान सत्र से लॉग आउट कर देगी, जिसके लिए आपको वापस लॉग इन करने की आवश्यकता होगी। अन्य उपकरणों पर सक्रिय सत्र एक घंटे तक सक्रिय रह सकते हैं।"
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "स्वचालित नामांकन"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "आपके तिजोरी टाइमआउट का समय आपके संगठन द्वारा निर्धारित प्रतिबंधों से अधिक है।"
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Postavi glavnu lozinku"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "Jedno ili više pravila organizacije zahtijeva da tvoja glavna lozinka ispunjava sljedeće uvjete:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Tvoju glavnu lozinku je nedavno promijenio administrator tvoje organizacije. Za pristup trezoru, potrebno je ažurirati glavnu lozinku, što će te odjaviti iz trenutne sesije, te ćeš se morati ponovno prijaviti. Aktivne sesije na drugim uređajima mogu ostati aktivne još sat vremena."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatsko učlanjenje"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Vrijeme isteka premašuje ograničenje koje je postavila tvoja organizacija."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Mesterjelszó beállítása"
},
"currentMasterPass": {
"message": "Jelenlegi mesterjelszó"
},
"newMasterPass": {
"message": "Új mesterjelszó"
},
"confirmNewMasterPass": {
"message": "Új mesterjelszó megerősítése"
},
"masterPasswordPolicyInEffect": {
"message": "Egy vagy több szervezeti rendszabályhoz mesterjelszó szükséges a következő követelmények megfeleléséhez:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "A szervezet egyik adminisztrátora nemrég megváltoztatta a mesterjelszót. A széf eléréséhez most frissíteni kell a mesterjelszót. Továbblépéskor kijelentkezés történik a jelenlegi munkamenetből és újra be kell jelentkezni. Ha van aktív munkamenet más eszközön, az még legfeljebb egy óráig aktív maradhat."
},
"updateWeakMasterPasswordWarning": {
"message": "A mesterjelszó nem felel meg egy vagy több szervezeti szabályzatnak. A széf eléréséhez frissíteni kell a meszerjelszót. A továbblépés kijelentkeztet az aktuális munkamenetből és újra be kell jelentkezni. A többi eszközön lévő aktív munkamenetek akár egy óráig is aktívak maradhatnak."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatikus regisztráció"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "A szervezeti házirendek hatással vannak a széf időkorlátjára. A széf időkorlátja legfeljebb $HOURS$ óra és $MINUTES$ perc lehet. A széf időkifutási művelete $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "A szervezeti házirendek által jelenleg beállított időkifutási művelet $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "A széf időkorlátja túllépi a szervezet által beállított korlátozást."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Megnyitás új ablakban"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Atur Kata Sandi Utama"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "Satu atau lebih kebijakan organisasi membutuhkan kata sandi utama Anda untuk memenuhi persyaratan berikut:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Kata Sandi Utama Anda baru-baru ini diubah oleh administrator organisasi Anda. Untuk mengakses brankas tersebut, Anda diharuskan memperbarui Kata Sandi Utama Anda sekarang. Jika Anda melanjutkan, Anda akan keluar dari sesi saat ini, yang mana mengharuskan Anda untuk login kembali. Sesi yang aktif di perangkat lain akan tetap aktif selama satu jam kedepan."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Pendaftaran Otomatis"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -3,11 +3,11 @@
"message": "Bitwarden"
},
"extName": {
"message": "Bitwarden - Gestore di Password Gratuito",
"message": "Bitwarden - Gestore di Password Gratis",
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
},
"extDesc": {
"message": "Un gestore di password sicuro e gratuito per tutti i tuoi dispositivi.",
"message": "Un gestore di password sicuro e gratis per tutti i tuoi dispositivi.",
"description": "Extension description"
},
"loginOrCreateNewAccount": {
@@ -44,7 +44,7 @@
"message": "Un suggerimento per la password principale può aiutarti a ricordarla se la dimentichi."
},
"reTypeMasterPass": {
"message": "Digita nuovamente la password"
"message": "Inserisci password principale di nuovo"
},
"masterPassHint": {
"message": "Suggerimento per la password principale (facoltativo)"
@@ -507,7 +507,7 @@
"message": "Puoi cambiare la tua password principale sulla cassaforte online di bitwarden.com. Vuoi visitare ora il sito?"
},
"twoStepLoginConfirmation": {
"message": "La verifica in due passaggi rende il tuo account più sicuro richiedendoti di verificare il tuo login usando un altro dispositivo come una chiave di sicurezza, applicazione di autenticazione, SMS, telefonata, o email. Può essere abilitata nella cassaforte web su bitwarden.com. Vuoi visitare il sito?"
"message": "La verifica in due passaggi rende il tuo account più sicuro richiedendoti di verificare il tuo login usando un altro dispositivo come una chiave di sicurezza, app di autenticazione, SMS, telefonata, o email. Può essere abilitata nella cassaforte web su bitwarden.com. Vuoi visitare il sito?"
},
"editedFolder": {
"message": "Cartella salvata"
@@ -622,7 +622,7 @@
"message": "Chiedi di aggiornare il login esistente"
},
"changedPasswordNotificationDesc": {
"message": "Chiedi di aggiornare la password di un login quando viene cambiata su un sito web."
"message": "Chiedi di aggiornare la password di un login quando rileviamo che è cambiata su un sito web."
},
"notificationChangeDesc": {
"message": "Vuoi aggiornare questa password in Bitwarden?"
@@ -641,13 +641,13 @@
"description": "Default URI match detection for auto-fill."
},
"defaultUriMatchDetectionDesc": {
"message": "Scegli il modo predefinito in cui il rilevamento della corrispondenza URI viene gestito per i login quando si eseguono azioni come il riempimento automatico."
"message": "Scegli il modo predefinito in cui il rilevamento della corrispondenza URI è gestito per i login quando si eseguono azioni come il riempimento automatico."
},
"theme": {
"message": "Tema"
},
"themeDesc": {
"message": "Cambia lo schema di colori dell'applicazione."
"message": "Cambia lo schema di colori dell'app."
},
"dark": {
"message": "Scuro",
@@ -675,10 +675,10 @@
"message": "Conferma esportazione della cassaforte"
},
"exportWarningDesc": {
"message": "Questa esportazione contiene i dati della tua cassaforte in un formato non cifrato. Non salvare o inviare il file esportato su canali non protetti (come la posta elettronica). Eliminalo immediatamente dopo l'utilizzo."
"message": "Questa esportazione contiene i dati della tua cassaforte in un formato non criptato. Non salvare o inviare il file esportato attraverso canali non protetti (come le email). Eliminalo immediatamente dopo l'utilizzo."
},
"encExportKeyWarningDesc": {
"message": "Questa esportazione cripta i tuoi dati usando la chiave di criptografia del tuo account. Se cambi la chiave di criptografia del tuo account, non sarai più in grado di decifrare il file esportato dovrai eseguire una nuova esportazione."
"message": "Questa esportazione cripta i tuoi dati usando la chiave di criptografia del tuo account. Se cambi la chiave di criptografia del tuo account, non potrai più decifrare il file esportato e dovrai eseguire una nuova esportazione."
},
"encExportAccountWarningDesc": {
"message": "Le chiavi di criptografia dell'account sono uniche per ogni account Bitwarden, quindi non puoi importare un file di esportazione criptato in un account diverso."
@@ -715,7 +715,7 @@
}
},
"moveToOrgDesc": {
"message": "Scegli un'organizzazione in cui vuoi spostare questo elemento. Spostare in un'organizzazione trasferisce la proprietà dell'elemento all'organizzazione. Non sarai più il proprietario diretto di questo elemento una volta spostato."
"message": "Scegli un'organizzazione in cui vuoi spostare questo elemento. Spostarlo in un'organizzazione trasferisce la proprietà dell'elemento all'organizzazione. Una volta spostato, non sarai più il proprietario diretto di questo elemento."
},
"learnMore": {
"message": "Ulteriori informazioni"
@@ -793,7 +793,7 @@
"message": "Sicurezza delle password, integrità dell'account, e rapporti su violazioni di dati per mantenere sicura la tua cassaforte."
},
"ppremiumSignUpTotp": {
"message": "Generatore di codice di verifica TOTP (2FA) per i login nella tua cassaforte."
"message": "Generatore di codici di verifica TOTP (2FA) per i login nella tua cassaforte."
},
"ppremiumSignUpSupport": {
"message": "Supporto clienti prioritario."
@@ -841,7 +841,7 @@
"message": "Passa a Premium per utilizzare questa funzionalità."
},
"enterVerificationCodeApp": {
"message": "Inserisci il codice di verifica a 6 cifre dalla tua applicazione di autenticazione."
"message": "Inserisci il codice di verifica a 6 cifre dalla tua app di autenticazione."
},
"enterVerificationCodeEmail": {
"message": "Inserisci il codice di verifica a 6 cifre inviato a $EMAIL$.",
@@ -865,7 +865,7 @@
"message": "Ricordami"
},
"sendVerificationCodeEmailAgain": {
"message": "Invia nuovamente l'email con il codice di verifica"
"message": "Invia email con codice di verifica di nuovo"
},
"useAnotherTwoStepMethod": {
"message": "Usa un altro metodo di verifica in due passaggi"
@@ -892,7 +892,7 @@
"message": "La verifica in due passaggi è abilitata per il tuo account, ma nessuno dei metodi configurati è supportato da questo browser."
},
"noTwoStepProviders2": {
"message": "Usa un browser web supportato (come Chrome) e/o aggiungi altri metodi che sono supportati meglio da tutti i browser web (come un'applicazione di autenticazione)."
"message": "Usa un browser web supportato (come Chrome) e/o aggiungi altri metodi che sono supportati meglio da tutti i browser web (come un'app di autenticazione)."
},
"twoStepOptions": {
"message": "Opzioni di verifica in due passaggi"
@@ -904,10 +904,10 @@
"message": "Codice di recupero"
},
"authenticatorAppTitle": {
"message": "Applicazione di autenticazione"
"message": "App di autenticazione"
},
"authenticatorAppDesc": {
"message": "Usa un'applicazione di autenticazione (come Authy o Google Authenticator) per generare codici di verifica basati sul tempo.",
"message": "Usa un'app di autenticazione (come Authy o Google Authenticator) per generare codici di verifica basati sul tempo.",
"description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
},
"yubiKeyTitle": {
@@ -917,11 +917,11 @@
"message": "Usa YubiKey per accedere al tuo account. Funziona con YubiKey 4, 4 Nano, 4C, e dispositivi NEO."
},
"duoDesc": {
"message": "Verifica con Duo Security usando l'applicazione Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.",
"message": "Verifica con Duo Security usando l'app Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.",
"description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
},
"duoOrganizationDesc": {
"message": "Verifica con Duo Security per la tua azienda usando l'applicazione Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.",
"message": "Verifica con Duo Security per la tua azienda usando l'app Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.",
"description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
},
"webAuthnTitle": {
@@ -1140,7 +1140,7 @@
"message": "Sig.ra"
},
"dr": {
"message": "Dr."
"message": "Dott"
},
"mx": {
"message": "Mx"
@@ -1267,7 +1267,7 @@
}
},
"passwordSafe": {
"message": "Questa password non è stata trovata in database di violazioni noti. Dovrebbe essere sicura da usare."
"message": "Questa password non è stata trovata in violazioni di dati note. Dovrebbe essere sicura da usare."
},
"baseDomain": {
"message": "Dominio di base",
@@ -1382,7 +1382,7 @@
"message": "Sblocca con PIN"
},
"setYourPinCode": {
"message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le tue impostazioni PIN saranno resettate se esci completamente dall'applicazione."
"message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le tue impostazioni PIN saranno resettate se esci completamente dall'app."
},
"pinRequired": {
"message": "Codice PIN obbligatorio."
@@ -1397,7 +1397,7 @@
"message": "In attesa di conferma dal desktop"
},
"awaitDesktopDesc": {
"message": "Conferma utilizzando l'autenticazione biometrica nell'applicazione Bitwarden Desktop per abilitare l'autenticazione biometrica per il browser."
"message": "Conferma utilizzando l'autenticazione biometrica nell'app Bitwarden Desktop per abilitare l'autenticazione biometrica per il browser."
},
"lockWithMasterPassOnRestart": {
"message": "Blocca con la password principale al riavvio del browser"
@@ -1412,7 +1412,7 @@
"message": "Clona"
},
"passwordGeneratorPolicyInEffect": {
"message": "Una o più politiche dell'organizzazione controllano le tue impostazioni del generatore."
"message": "Una o più politiche dell'organizzazione stanno influenzando le impostazioni del tuo generatore."
},
"vaultTimeoutAction": {
"message": "Azione timeout cassaforte"
@@ -1464,8 +1464,17 @@
"setMasterPassword": {
"message": "Imposta password principale"
},
"currentMasterPass": {
"message": "Password principale attuale"
},
"newMasterPass": {
"message": "Nuova password principale"
},
"confirmNewMasterPass": {
"message": "Conferma nuova password principale"
},
"masterPasswordPolicyInEffect": {
"message": "La password principale deve avere i seguenti requisiti, stabiliti dalle politiche dell'organizzazione:"
"message": "Una o più politiche dell'organizzazione richiedono che la tua password principale soddisfi questi requisiti:"
},
"policyInEffectMinComplexity": {
"message": "Punteggio minimo di complessità di $SCORE$",
@@ -1510,7 +1519,7 @@
"message": "Selezionando questa casella accetti quanto segue:"
},
"acceptPoliciesRequired": {
"message": "I termini di servizio e l'informativa sulla privacy non sono stati accettati."
"message": "I Termini di Servizio e l'Informativa sulla Privacy non sono stati accettati."
},
"termsOfService": {
"message": "Termini di Servizio"
@@ -1528,34 +1537,34 @@
"message": "Verifica sincronizzazione desktop"
},
"desktopIntegrationVerificationText": {
"message": "Verifica che l'applicazione desktop mostri questa impronta: "
"message": "Verifica che l'app desktop mostri questa impronta: "
},
"desktopIntegrationDisabledTitle": {
"message": "L'integrazione del browser non è abilitata"
},
"desktopIntegrationDisabledDesc": {
"message": "L'integrazione del browser non è abilitata nell'applicazione Bitwarden Desktop. Attivala nelle impostazioni all'interno dell'applicazione desktop."
"message": "L'integrazione del browser non è abilitata nell'app Bitwarden Desktop. Attivala nelle impostazioni all'interno dell'app desktop."
},
"startDesktopTitle": {
"message": "Avvia l'applicazione desktop Bitwarden"
"message": "Avvia l'app desktop Bitwarden"
},
"startDesktopDesc": {
"message": "L'applicazione Bitwarden Desktop deve essere avviata prima che l'autenticazione biometrica possa essere usata."
"message": "L'app Bitwarden Desktop deve essere avviata prima che l'autenticazione biometrica possa essere usata."
},
"errorEnableBiometricTitle": {
"message": "Impossibile abilitare autenticazione biometrica"
},
"errorEnableBiometricDesc": {
"message": "L'azione è stata annullata dall'applicazione desktop"
"message": "L'azione è stata annullata dall'app desktop"
},
"nativeMessagingInvalidEncryptionDesc": {
"message": "L'applicazione desktop ha invalidato il canale di comunicazione sicuro. Riprova di nuovo"
"message": "L'app desktop ha invalidato il canale di comunicazione sicuro. Riprova di nuovo"
},
"nativeMessagingInvalidEncryptionTitle": {
"message": "Comunicazione desktop interrotta"
},
"nativeMessagingWrongUserDesc": {
"message": "L'applicazione desktop è collegata a un account diverso. Assicurati che entrambe le applicazioni siano collegate allo stesso account."
"message": "L'app desktop è collegata a un account diverso. Assicurati che entrambe le app siano collegate allo stesso account."
},
"nativeMessagingWrongUserTitle": {
"message": "Account non corrispondono"
@@ -1576,7 +1585,7 @@
"message": "Permesso non fornito"
},
"nativeMessaginPermissionErrorDesc": {
"message": "Senza l'autorizzazione per comunicare con l'applicazione Bitwarden Desktop non è possibile fornire l'autenticazione biometrica nell'estensione del browser. Riprova di nuovo."
"message": "Senza l'autorizzazione per comunicare con l'app desktop di Bitwarden non è possibile fornire l'autenticazione biometrica nell'estensione del browser. Riprova di nuovo."
},
"nativeMessaginPermissionSidebarTitle": {
"message": "Errore richiesta di autorizzazione"
@@ -1641,7 +1650,7 @@
"message": "Protetto da password"
},
"copySendLink": {
"message": "Copia collegamento del Send",
"message": "Copia link del Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"removePassword": {
@@ -1723,7 +1732,7 @@
"message": "Numero massimo di accessi"
},
"maximumAccessCountDesc": {
"message": "Se impostata, gli utenti potranno più accedere a questo Send una volta raggiunto il numero massimo di accessi.",
"message": "Se impostata, gli utenti non potranno più accedere a questo Send una volta raggiunto il numero massimo di accessi.",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendPasswordDesc": {
@@ -1821,13 +1830,13 @@
"message": "Una o più politiche dell'organizzazione stanno influenzando le tue opzioni di Send."
},
"passwordPrompt": {
"message": "Nuova richiesta della password principale"
"message": "Richiedi di inserire la password principale di nuovo per visualizzare questo elemento"
},
"passwordConfirmation": {
"message": "Conferma della password principale"
},
"passwordConfirmationDesc": {
"message": "Questa azione è protetta. Per continuare, inserisci nuovamente la tua password principale per verificare la tua identità."
"message": "Questa azione è protetta. Inserisci la tua password principale di nuovo per verificare la tua identità."
},
"emailVerificationRequired": {
"message": "Verifica email obbligatoria"
@@ -1842,7 +1851,10 @@
"message": "Aggiorna password principale"
},
"updateMasterPasswordWarning": {
"message": "La tua password principale è stata recentemente modificata da un amministratore nella tua organizzazione. Per accedere alla cassaforte, devi aggiornarla ora. Procedendo sarai disconnesso dalla sessione attuale, richiedendo di effettuare nuovamente l'accesso. Le sessioni attive su altri dispositivi possono continuare a rimanere attive per un massimo di un'ora."
"message": "La tua password principale è stata recentemente modificata da un amministratore nella tua organizzazione. Per accedere alla cassaforte, aggiornala ora. Procedere ti farà uscire dalla sessione corrente, richiedendoti di accedere di nuovo. Le sessioni attive su altri dispositivi potrebbero continuare a rimanere attive per un massimo di un'ora."
},
"updateWeakMasterPasswordWarning": {
"message": "La tua password principale non soddisfa uno o più politiche della tua organizzazione. Per accedere alla cassaforte, aggiornala ora. Procedere ti farà uscire dalla sessione corrente, richiedendoti di accedere di nuovo. Le sessioni attive su altri dispositivi potrebbero continuare a rimanere attive per un massimo di un'ora."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Iscrizione automatica"
@@ -1863,7 +1875,7 @@
"message": "Minuti"
},
"vaultTimeoutPolicyInEffect": {
"message": "Le politiche della tua organizzazione stanno influenzando il timeout della tua cassaforte. Il tempo massimo consentito è di $HOURS$ ore e $MINUTES$ minuti",
"message": "Le politiche della tua organizzazione hanno impostato il timeout massimo consentito della tua cassaforte su $HOURS$ ore e $MINUTES$ minuti.",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Le politiche della tua organizzazione stanno influenzando il timeout della tua cassaforte. Il tempo massimo consentito è di $HOURS$ ore e $MINUTES$ minuti. La tua azione di timeout della cassaforte è impostata su $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Le politiche della tua organizzazione hanno impostato l'azione di timeout cassaforte su $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Il timeout della tua cassaforte supera i limiti impostati dalla tua organizzazione."
},
@@ -2076,7 +2114,7 @@
"message": "Assicurati che la tua cassaforte sia sbloccata e che la frase impronta corrisponda sull'altro dispositivo."
},
"resendNotification": {
"message": "Invia nuova notifica"
"message": "Invia notifica di nuovo"
},
"viewAllLoginOptions": {
"message": "Visualizza tutte le opzioni di accesso"
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Si apre in una nuova finestra"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "マスターパスワードを設定"
},
"currentMasterPass": {
"message": "現在のマスターパスワード"
},
"newMasterPass": {
"message": "新しいマスターパスワード"
},
"confirmNewMasterPass": {
"message": "新しいマスターパスワードの確認"
},
"masterPasswordPolicyInEffect": {
"message": "組織が求めるマスターパスワードの要件:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "マスターパスワードは最近組織の管理者によって変更されました。保管庫にアクセスするには、今すぐ更新する必要があります。 続行すると現在のセッションからログアウトし、再度ログインする必要があります。 他のデバイスでのアクティブなセッションは、最大1時間アクティブになり続けることがあります。"
},
"updateWeakMasterPasswordWarning": {
"message": "あなたのマスターパスワードは、組織のポリシーを満たしていません。保管庫にアクセスするには、今すぐマスターパスワードを更新する必要があります。この操作を続けると、現在のセッションがログアウトされ、再ログインする必要があります。他のデバイスでのアクティブなセッションは最大1時間継続する場合があります。"
},
"resetPasswordPolicyAutoEnroll": {
"message": "自動登録"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "組織のポリシーがあなたの保管庫のタイムアウトに影響しす。保管庫の最大許容タイムアウトは$HOURS$時間$MINUTES$分です。保管庫のタイムアウト設定は$ACTION$にあります。",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "あなたの保管庫のタイムアウト設定は、組織のポリシーで決められた$ACTION$にあります。",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "保管庫のタイムアウトが組織によって設定された制限を超えています。"
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "新しいウィンドウで開く"
}
}

View File

@@ -137,7 +137,7 @@
"message": "კოდი გაიგზავნა"
},
"verificationCode": {
"message": "ვერიფიკაციის კოდი"
"message": "ერთჯერადი კოდი"
},
"confirmIdentity": {
"message": "Confirm your identity to continue."
@@ -427,10 +427,10 @@
"message": "დაფიქსირდა შეცდომა"
},
"emailRequired": {
"message": "ელექტრონული ფოსტის მისამართი აუცილებელია."
"message": "ელ-ფოსტის მისამართი აუცილებელია."
},
"invalidEmail": {
"message": "არასწორი ელექტრო ფოსტის მისამართი."
"message": "არასწორი ელ-ფოსტის მისამართი."
},
"masterPasswordRequired": {
"message": "Master password is required."
@@ -458,7 +458,7 @@
"message": "We've sent you an email with your master password hint."
},
"verificationCodeRequired": {
"message": "ვერიფიკაციის კოდი აუცილებელია."
"message": "ერთჯერადი კოდი აუცილებელია."
},
"invalidVerificationCode": {
"message": "Invalid verification code"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಹೊಂದಿಸಿ"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆ ನೀತಿಗಳಿಗೆ ಈ ಕೆಳಗಿನ ಅವಶ್ಯಕತೆಗಳನ್ನು ಪೂರೈಸಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "마스터 비밀번호 설정"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "하나 이상의 단체 정책이 마스터 비밀번호가 다음 사항을 따르도록 요구합니다:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "최근에 조직 관리자가 마스터 비밀번호를 변경했습니다. 보관함에 액세스하려면 지금 업데이트해야 합니다. 계속하면 현재 세션에서 로그아웃되며 다시 로그인해야 합니다. 다른 장치의 활성 세션은 최대 1시간 동안 계속 활성 상태로 유지될 수 있습니다."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "자동 등록"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -47,7 +47,7 @@
"message": "Pakartokite pagrindinį slaptažodį"
},
"masterPassHint": {
"message": " Pagrindinio slaptažodžio užuomina (neprivaloma)"
"message": "Pagrindinio slaptažodžio užuomina (neprivaloma)"
},
"tab": {
"message": "Skirtukas"
@@ -196,13 +196,13 @@
"message": "Pagalba ir atsiliepimai"
},
"helpCenter": {
"message": "Bitwarden Help center"
"message": "Bitwarden pagalbos centras"
},
"communityForums": {
"message": "Explore Bitwarden community forums"
"message": "Naršyti Bitwarden bendruomenės forumus"
},
"contactSupport": {
"message": "Contact Bitwarden support"
"message": "Susisiekti su Bitwarden palaikymo komanda"
},
"sync": {
"message": "Sinchronizuoti"
@@ -236,7 +236,7 @@
"message": "Kurti slaptažodį"
},
"regeneratePassword": {
"message": "Perkurti slaptažodį"
"message": "Generuoti slaptažodį iš naujo"
},
"options": {
"message": "Pasirinkimai"
@@ -318,7 +318,7 @@
"message": "Aplankas"
},
"deleteItem": {
"message": "Trinti elementą"
"message": "Šalinti elementą"
},
"viewItem": {
"message": "Peržiūrėti elementą"
@@ -391,7 +391,7 @@
"message": "30 sekundžių"
},
"oneMinute": {
"message": "1 minutę"
"message": "1 minutės"
},
"twoMinutes": {
"message": "2 minučių"
@@ -439,7 +439,7 @@
"message": "Būtinas prisijungimo slaptažodžio patvirtinimas."
},
"masterPasswordMinlength": {
"message": "Master password must be at least $VALUE$ characters long.",
"message": "Pagrindinis slaptažodis turi būti bent $VALUE$ simbolių ilgio.",
"description": "The Master Password must be at least a specific number of characters long.",
"placeholders": {
"value": {
@@ -631,17 +631,17 @@
"message": "Taip, atnaujinti dabar"
},
"enableContextMenuItem": {
"message": "Show context menu options"
"message": "Rodyti kontekstinio meniu pasririnkimus"
},
"contextMenuItemDesc": {
"message": "Use a secondary click to access password generation and matching logins for the website. "
"message": "Naudokite antrinį paspaudimą, kad patekti į svetainės slaptažodžio generavimo ir prisijungimo atitikimo parinktis. "
},
"defaultUriMatchDetection": {
"message": "Default URI match detection",
"message": "Numatytojo URI atitikimo aptikimas",
"description": "Default URI match detection for auto-fill."
},
"defaultUriMatchDetectionDesc": {
"message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
"message": "Pasirinkite standartinį būdą, kuriuo URI būtų aptinkamas prisijungiant, kuomet yra naudojamas automatinio užpildymo veiksmas."
},
"theme": {
"message": "Tema"
@@ -675,13 +675,13 @@
"message": "Patvirtinti saugyklos eksportą"
},
"exportWarningDesc": {
"message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
"message": "Šiame duomenų exporte jūsų saugyklos duomenys yra neužšifruoti. Jūs neturėtumete laikyti ar siųsti išeksportuotos duomenų bylos nesaugiu komunikaciniu kanalu (tokiu kaip el. paštas). Ištrinkite jį kaip galima greičiau po to kai pasinaudojote."
},
"encExportKeyWarningDesc": {
"message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
"message": "Šis duomenų exportavimas užšifruoja jūsų duomenis naudodamas jūsų prieigos kodų raktu. Jei jūs kada nuspręsite pakeisti prieigos kodų raktą, jūs turėtumėte per naują eksportuoti duomenis, nes kitaip, jūs negalėsite iššifruoti išeksportuotų duomenų."
},
"encExportAccountWarningDesc": {
"message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
"message": "Prieigos kodų raktai yra unikalūs kiekvienai Bitwarden vartotojo paskyrai, taigi jums nepavyktų importuoti užkoduotų eksportuotų duomenų į kitą prieigą."
},
"exportMasterPassword": {
"message": "Įveskite pagrindinį slaptažodį norint išsinešti saugyklos duomenis."
@@ -693,16 +693,16 @@
"message": "Sužinoti apie organizacijas"
},
"learnOrgConfirmation": {
"message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
"message": "Bitwarden leidžia jums dalintis savo saugyklos elementais su kitais vartotojais organizacijoje. Ar jūs norėtumėte apsilankyti bitwarden.com puslapyje, kad sužinoti daugiau?"
},
"moveToOrganization": {
"message": "Move to organization"
"message": "Perkelti į organizaciją"
},
"share": {
"message": "Bendrinti"
},
"movedItemToOrg": {
"message": "$ITEMNAME$ moved to $ORGNAME$",
"message": "$ITEMNAME$ perkelta(s) į $ORGNAME$",
"placeholders": {
"itemname": {
"content": "$1",
@@ -715,7 +715,7 @@
}
},
"moveToOrgDesc": {
"message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
"message": "Pasirinkite organizacija, į kurią norite priskirti šį elementą. Priskiriant elementą organizacijai, visos elemento valdymo teisės bus perleistos organizacijai. Jūs daugiau nebebūsite tiesioginis elemento valdytojas po to kai jis bus priskirtas organizacijai."
},
"learnMore": {
"message": "Sužinoti daugiau"
@@ -781,34 +781,34 @@
"message": "Neturite Premium narystės."
},
"premiumSignUpAndGet": {
"message": "Sign up for a Premium membership and get:"
"message": "Prisijungite prie Premium narystės ir gaukite:"
},
"ppremiumSignUpStorage": {
"message": "1 GB encrypted storage for file attachments."
"message": "1 GB užšifruotos vietos diske bylų prisegimams."
},
"ppremiumSignUpTwoStep": {
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
"message": "Papildomos dviejų žingsių prisijungimo opcijos, tokios kaip YubiKey, FIDO U2F ir Duo."
},
"ppremiumSignUpReports": {
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
"message": "Slaptažodžio higiena, prieigos sveikata ir duomenų nutekinimo ataskaitos, kad jūsų seifas būtų saugus."
},
"ppremiumSignUpTotp": {
"message": "TOTP verification code (2FA) generator for logins in your vault."
"message": "TOTP patvirtinimo kodų (2FA) generatorius prisijungimams prie jūsų saugyklos."
},
"ppremiumSignUpSupport": {
"message": "Priority customer support."
"message": "Prioritetinis klientų aptarnavimas."
},
"ppremiumSignUpFuture": {
"message": "All future Premium features. More coming soon!"
"message": "Visos būsimos Premium savybės. Daugiau jau greitai!"
},
"premiumPurchase": {
"message": "Purchase Premium"
"message": "Įsigyti Premium planą"
},
"premiumPurchaseAlert": {
"message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
"message": "Jūs galite įsigyti Premium narystę bitwarden.com puslapyje. Ar norite aplankyti šį puslapį dabar?"
},
"premiumCurrentMember": {
"message": "You are a Premium member!"
"message": "Jūs esate Premium narys!"
},
"premiumCurrentMemberThanks": {
"message": "Dėkojame, kad remiate Bitwarden."
@@ -832,7 +832,7 @@
"message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login."
},
"enableAutoBiometricsPrompt": {
"message": "Ask for biometrics on launch"
"message": "Paleidžiant patvirtinti biometrinius duomenis"
},
"premiumRequired": {
"message": "Tik su Premium naryste"
@@ -841,10 +841,10 @@
"message": "Premium narystė reikalinga šiai funkcijai naudoti."
},
"enterVerificationCodeApp": {
"message": "Enter the 6 digit verification code from your authenticator app."
"message": "Įveskite 6 skaitmenų patvirtinimo kodą iš jūsų autentifikavimo aplikacijos."
},
"enterVerificationCodeEmail": {
"message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
"message": "Įveskite 6 skaitmenų prisijungimo kodą, kuris buvo išsiųstas $EMAIL$ el. paštu.",
"placeholders": {
"email": {
"content": "$1",
@@ -853,7 +853,7 @@
}
},
"verificationCodeEmailSent": {
"message": "Verification email sent to $EMAIL$.",
"message": "Patvirtinimo elektroninis paštas išsiųstas į $EMAIL$.",
"placeholders": {
"email": {
"content": "$1",
@@ -865,7 +865,7 @@
"message": "Prisiminti mane"
},
"sendVerificationCodeEmailAgain": {
"message": "Send verification code email again"
"message": "Pakartotinai atsiųsti patvirtinimo koda el. paštu"
},
"useAnotherTwoStepMethod": {
"message": "Naudoti dar vieną dviejų žingsnių prisijungimo metodą"
@@ -895,13 +895,13 @@
"message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
},
"twoStepOptions": {
"message": "Two-step login options"
"message": "Dviejų žingsnių prisijungimo parinktys"
},
"recoveryCodeDesc": {
"message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account."
},
"recoveryCodeTitle": {
"message": "Recovery code"
"message": "Atkūrimo kodas"
},
"authenticatorAppTitle": {
"message": "Autentifikavimo programa"
@@ -943,7 +943,7 @@
"message": "Specify the base URL of your on-premises hosted Bitwarden installation."
},
"customEnvironment": {
"message": "Custom environment"
"message": "Individualizuota aplinka"
},
"customEnvironmentFooter": {
"message": "For advanced users. You can specify the base URL of each service independently."
@@ -955,16 +955,16 @@
"message": "API serverio nuoroda"
},
"webVaultUrl": {
"message": "Web vault server URL"
"message": "Internetinės saugyklos serverio URL"
},
"identityUrl": {
"message": "Identity server URL"
"message": "Identifikavimo serverio URL"
},
"notificationsUrl": {
"message": "Notifications server URL"
"message": "Notifikacijų serverio URL"
},
"iconsUrl": {
"message": "Icons server URL"
"message": "Piktogramų serverio URL"
},
"environmentSaved": {
"message": "Environment URLs saved"
@@ -979,7 +979,7 @@
"message": "Compromised or untrusted websites can exploit auto-fill on page load."
},
"learnMoreAboutAutofill": {
"message": "Learn more about auto-fill"
"message": "Sužinokite daugiau apie automatinį užpildymą"
},
"defaultAutoFillOnPageLoad": {
"message": "Default autofill setting for login items"
@@ -991,7 +991,7 @@
"message": "Auto-fill on page load (if set up in Options)"
},
"autoFillOnPageLoadUseDefault": {
"message": "Use default setting"
"message": "Naudoti numatytuosius nustatymus"
},
"autoFillOnPageLoadYes": {
"message": "Auto-fill on page load"
@@ -1000,10 +1000,10 @@
"message": "Do not auto-fill on page load"
},
"commandOpenPopup": {
"message": "Open vault popup"
"message": "Atidaryti saugyklą naujame lange"
},
"commandOpenSidebar": {
"message": "Open vault in sidebar"
"message": "Atidaryti saugyklą šoninėje juostoje"
},
"commandAutofillDesc": {
"message": "Auto-fill the last used login for the current website"
@@ -1024,7 +1024,7 @@
"message": "Copy value"
},
"value": {
"message": "Value"
"message": "Reikšmė"
},
"newCustomField": {
"message": "Naujas pasirinktis laukelis"
@@ -1046,7 +1046,7 @@
"description": "This describes a field that is 'linked' (tied) to another field."
},
"linkedValue": {
"message": "Linked value",
"message": "Susijusi reikšmė",
"description": "This describes a value that is 'linked' (tied) to another value."
},
"popup2faCloseMessage": {
@@ -1071,25 +1071,25 @@
"message": "Mokėjimo kortelės savininko vardas"
},
"number": {
"message": "Number"
"message": "Numeris"
},
"brand": {
"message": "Brand"
"message": "Prekės ženktas"
},
"expirationMonth": {
"message": "Expiration month"
"message": "Galiojimo pabaigos mėnesis"
},
"expirationYear": {
"message": "Expiration year"
"message": "Galiojimo pabaigos metai"
},
"expiration": {
"message": "Expiration"
"message": "Galiojimo pabaiga"
},
"january": {
"message": "January"
"message": "Sausis"
},
"february": {
"message": "February"
"message": "Vasaris"
},
"march": {
"message": "Kovas"
@@ -1131,13 +1131,13 @@
"message": "Pavadinimas"
},
"mr": {
"message": "Mr"
"message": "Ponas"
},
"mrs": {
"message": "Mrs"
"message": "Ponia"
},
"ms": {
"message": "Ms"
"message": "Panelė"
},
"dr": {
"message": "Dr"
@@ -1245,20 +1245,20 @@
"message": "Tapatybės"
},
"logins": {
"message": "Logins"
"message": "Prisijungimai"
},
"secureNotes": {
"message": "Secure notes"
"message": "Saugūs užrašai"
},
"clear": {
"message": "Clear",
"message": "Išvalyti",
"description": "To clear something out. example: To clear browser history."
},
"checkPassword": {
"message": "Check if password has been exposed."
"message": "Patikrinkite, ar slaptažodis buvo atskleistas."
},
"passwordExposed": {
"message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
"message": "Šis slaptažodis buvo atskleistas $VALUE$ kartus dėl duomenų pažeidimų. Turėtumėte jį pasikeisti.",
"placeholders": {
"value": {
"content": "$1",
@@ -1270,29 +1270,29 @@
"message": "This password was not found in any known data breaches. It should be safe to use."
},
"baseDomain": {
"message": "Base domain",
"message": "Bazinis domenas",
"description": "Domain name. Ex. website.com"
},
"domainName": {
"message": "Domain name",
"message": "Domenas",
"description": "Domain name. Ex. website.com"
},
"host": {
"message": "Host",
"message": "Serveris",
"description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
},
"exact": {
"message": "Exact"
"message": "Tikslus"
},
"startsWith": {
"message": "Starts with"
"message": "Prasideda"
},
"regEx": {
"message": "Regular expression",
"description": "A programming term, also known as 'RegEx'."
},
"matchDetection": {
"message": "Match detection",
"message": "Atitikmens aptikimas",
"description": "URI match detection for auto-fill."
},
"defaultMatchDetection": {
@@ -1300,7 +1300,7 @@
"description": "Default URI match detection for auto-fill."
},
"toggleOptions": {
"message": "Toggle options"
"message": "Perjungti opcijas"
},
"toggleCurrentUris": {
"message": "Toggle current URIs",
@@ -1311,34 +1311,34 @@
"description": "The URI of one of the current open tabs in the browser."
},
"organization": {
"message": "Organization",
"message": "Organizacija",
"description": "An entity of multiple related people (ex. a team or business organization)."
},
"types": {
"message": "Types"
"message": "Tipai"
},
"allItems": {
"message": "All items"
"message": "Visi elementai"
},
"noPasswordsInList": {
"message": "There are no passwords to list."
},
"remove": {
"message": "Remove"
"message": "Pašalinti"
},
"default": {
"message": "Default"
"message": "Numatytas"
},
"dateUpdated": {
"message": "Updated",
"message": "Atnaujintas",
"description": "ex. Date this item was updated"
},
"dateCreated": {
"message": "Created",
"message": "Sukurtas",
"description": "ex. Date this item was created"
},
"datePasswordUpdated": {
"message": "Password updated",
"message": "Slaptažodis atnaujintas",
"description": "ex. Date this password was updated"
},
"neverLockWarning": {
@@ -1351,21 +1351,21 @@
"message": "There are no collections to list."
},
"ownership": {
"message": "Ownership"
"message": "Nuosavybė"
},
"whoOwnsThisItem": {
"message": "Who owns this item?"
"message": "Kam priklauso šis elementas?"
},
"strong": {
"message": "Strong",
"message": "Stiprus",
"description": "ex. A strong password. Scale: Weak -> Good -> Strong"
},
"good": {
"message": "Good",
"message": "Geras",
"description": "ex. A good password. Scale: Weak -> Good -> Strong"
},
"weak": {
"message": "Weak",
"message": "Silpnas",
"description": "ex. A weak password. Scale: Weak -> Good -> Strong"
},
"weakMasterPassword": {
@@ -1379,19 +1379,19 @@
"description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
},
"unlockWithPin": {
"message": "Unlock with PIN"
"message": "Atrakinti PIN kodu"
},
"setYourPinCode": {
"message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
"message": "Nustatykite savo PIN kodą, kad atrakintumėte „Bitwarden. Jūsų PIN nustatymai bus nustatyti iš naujo, jei kada nors visiškai atsijungsite nuo programos."
},
"pinRequired": {
"message": "PIN code is required."
"message": "PIN kodas yra privalomas."
},
"invalidPin": {
"message": "Invalid PIN code."
"message": "Neteisingas PIN kodas."
},
"unlockWithBiometrics": {
"message": "Unlock with biometrics"
"message": "Atrakinti naudojant biometrinius duomenis"
},
"awaitDesktop": {
"message": "Awaiting confirmation from desktop"
@@ -1403,13 +1403,13 @@
"message": "Lock with master password on browser restart"
},
"selectOneCollection": {
"message": "You must select at least one collection."
"message": "Turite pasirinkti bent vieną kategoriją."
},
"cloneItem": {
"message": "Clone item"
"message": "Klonuoti elementą"
},
"clone": {
"message": "Clone"
"message": "Klonuoti"
},
"passwordGeneratorPolicyInEffect": {
"message": "One or more organization policies are affecting your generator settings."
@@ -1438,13 +1438,13 @@
"message": "Ištrintas visam laikui"
},
"restoreItem": {
"message": "Restore item"
"message": "Atkurti elementą"
},
"restoreItemConfirmation": {
"message": "Are you sure you want to restore this item?"
},
"restoredItem": {
"message": "Item restored"
"message": "Elementas atkurtas"
},
"vaultTimeoutLogOutConfirmation": {
"message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Pagrindinio slaptažodžio nustatymas"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1477,7 +1486,7 @@
}
},
"policyInEffectMinLength": {
"message": "Minimum length of $LENGTH$",
"message": "Minimalus ilgis $LENGTH$",
"placeholders": {
"length": {
"content": "$1",
@@ -1486,16 +1495,16 @@
}
},
"policyInEffectUppercase": {
"message": "Contain one or more uppercase characters"
"message": "Turi vieną ar daugiau didžiųjų raidžių"
},
"policyInEffectLowercase": {
"message": "Contain one or more lowercase characters"
"message": "Turi vieną ar daugiau mažųjų raidžių"
},
"policyInEffectNumbers": {
"message": "Contain one or more numbers"
"message": "Turi vieną ar daugiau skaičių"
},
"policyInEffectSpecial": {
"message": "Contain one or more of the following special characters $CHARS$",
"message": "Turi vieną ar daugiau iš šių specialiųjų simbolių: $CHARS$",
"placeholders": {
"chars": {
"content": "$1",
@@ -1558,10 +1567,10 @@
"message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
},
"nativeMessagingWrongUserTitle": {
"message": "Account missmatch"
"message": "Paskyros neatitikimas"
},
"biometricsNotEnabledTitle": {
"message": "Biometrics not set up"
"message": "Trūksta biometrinių duomenų nustatymų"
},
"biometricsNotEnabledDesc": {
"message": "Browser biometrics requires desktop biometric to be set up in the settings first."
@@ -1606,7 +1615,7 @@
}
},
"send": {
"message": "Send",
"message": "Siųsti",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"searchSends": {
@@ -1618,57 +1627,57 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendTypeText": {
"message": "Text"
"message": "Tekstas"
},
"sendTypeFile": {
"message": "File"
"message": "Byla"
},
"allSends": {
"message": "All Sends",
"message": "Visi siuntimai",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"maxAccessCountReached": {
"message": "Max access count reached",
"message": "Pasiektas maksimalus prisijungimų skaičius",
"description": "This text will be displayed after a Send has been accessed the maximum amount of times."
},
"expired": {
"message": "Expired"
"message": "Nebegalioja"
},
"pendingDeletion": {
"message": "Pending deletion"
"message": "Laukiama ištrynimo"
},
"passwordProtected": {
"message": "Password protected"
"message": "Apsaugota slaptažodžiu"
},
"copySendLink": {
"message": "Copy Send link",
"message": "Kopijuoti siuntimo nuorodą",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"removePassword": {
"message": "Remove Password"
"message": "Šalinti slaptažodį"
},
"delete": {
"message": "Delete"
"message": "Ištrinti"
},
"removedPassword": {
"message": "Password removed"
"message": "Slaptažodis pašalintas"
},
"deletedSend": {
"message": "Send deleted",
"message": "Siuntinys ištrintas",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendLink": {
"message": "Send link",
"message": "Siųsti nuorodą",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"disabled": {
"message": "Disabled"
"message": "Išjungta"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
"message": "Ar tikrai norite pašalinti slaptažodį?"
},
"deleteSend": {
"message": "Delete Send",
"message": "Ištrinti siuntinį",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"deleteSendConfirmation": {
@@ -1688,7 +1697,7 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendFileDesc": {
"message": "The file you want to send."
"message": "Failas, kurį norite siųsti."
},
"deletionDate": {
"message": "Deletion date"
@@ -1698,17 +1707,17 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"expirationDate": {
"message": "Expiration date"
"message": "Galiojimo data"
},
"expirationDateDesc": {
"message": "If set, access to this Send will expire on the specified date and time.",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"oneDay": {
"message": "1 day"
"message": "1 d"
},
"days": {
"message": "$DAYS$ days",
"message": "$DAYS$ dienos",
"placeholders": {
"days": {
"content": "$1",
@@ -1720,7 +1729,7 @@
"message": "Custom"
},
"maximumAccessCount": {
"message": "Maximum Access Count"
"message": "Maksimalus prisijungimų skaičius"
},
"maximumAccessCountDesc": {
"message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
@@ -1743,24 +1752,24 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendTextDesc": {
"message": "The text you want to send."
"message": "Tekstas, kurį norite siųsti."
},
"sendHideText": {
"message": "Hide this Send's text by default.",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"currentAccessCount": {
"message": "Current access count"
"message": "Dabartinis prisijungimų skaičius"
},
"createSend": {
"message": "New Send",
"message": "Naujas Siuntinys",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"newPassword": {
"message": "New password"
"message": "Naujas slaptažodis"
},
"sendDisabled": {
"message": "Send removed",
"message": "Siuntimas pašalintas",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendDisabledWarning": {
@@ -1768,11 +1777,11 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"createdSend": {
"message": "Send created",
"message": "Siuntinys sukurtas",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"editedSend": {
"message": "Send saved",
"message": "Siuntinys išsaugotas",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendLinuxChromiumFileWarning": {
@@ -1785,18 +1794,18 @@
"message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
},
"sendFileCalloutHeader": {
"message": "Before you start"
"message": "Prieš pradedant"
},
"sendFirefoxCustomDatePopoutMessage1": {
"message": "To use a calendar style date picker",
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
},
"sendFirefoxCustomDatePopoutMessage2": {
"message": "click here",
"message": "spauskite čia",
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
},
"sendFirefoxCustomDatePopoutMessage3": {
"message": "to pop out your window.",
"message": "iškelti atskirame lange.",
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
},
"expirationDateIsInvalid": {
@@ -1809,13 +1818,13 @@
"message": "An expiration date and time are required."
},
"deletionDateAndTimeRequired": {
"message": "A deletion date and time are required."
"message": "Ištrynimo data ir laikas yra privalomi."
},
"dateParsingError": {
"message": "There was an error saving your deletion and expiration dates."
},
"hideEmail": {
"message": "Hide my email address from recipients."
"message": "Slėpti mano el. pašto adresą nuo gavėjų."
},
"sendOptionsPolicyInEffect": {
"message": "One or more organization policies are affecting your Send options."
@@ -1830,7 +1839,7 @@
"message": "Negalite šio veiksmo padaryti neįvedus savo pagrindinio slaptažodžio ir patvirtinę tapatybę."
},
"emailVerificationRequired": {
"message": "Email verification required"
"message": "Reikalingas elektroninio pašto patvirtinimas"
},
"emailVerificationRequiredDesc": {
"message": "You must verify your email to use this feature. You can verify your email in the web vault."
@@ -1839,11 +1848,14 @@
"message": "Naujasis pagrindinis slaptažodis"
},
"updateMasterPassword": {
"message": "Update master password"
"message": "Atnaujinti pagrindinį slaptažodį"
},
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -1906,7 +1944,7 @@
"message": "Ištrinti pagrindinį slaptažodį"
},
"removedMasterPassword": {
"message": "Master password removed"
"message": "Pagrindinis slaptažodis pašalintas"
},
"leaveOrganizationConfirmation": {
"message": "Are you sure you want to leave this organization?"
@@ -1958,16 +1996,16 @@
"message": "Use your domain's configured catch-all inbox."
},
"random": {
"message": "Random"
"message": "Atsitiktinis"
},
"randomWord": {
"message": "Random word"
"message": "Atsitiktinis žodis"
},
"websiteName": {
"message": "Website name"
},
"whatWouldYouLikeToGenerate": {
"message": "What would you like to generate?"
"message": "Ką norėtumėte sugeneruoti?"
},
"passwordType": {
"message": "Password type"
@@ -1989,16 +2027,16 @@
"message": "API Access Token"
},
"apiKey": {
"message": "API Key"
"message": "API raktas"
},
"ssoKeyConnectorError": {
"message": "Key connector error: make sure key connector is available and working correctly."
},
"premiumSubcriptionRequired": {
"message": "Premium subscription required"
"message": "Reikalingas Premium abonementas"
},
"organizationIsDisabled": {
"message": "Organization suspended."
"message": "Organizacija suspenduota."
},
"disabledOrganizationFilterError": {
"message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance."
@@ -2016,7 +2054,7 @@
"message": "Settings have been edited"
},
"environmentEditedClick": {
"message": "Click here"
"message": "Spauskite čia"
},
"environmentEditedReset": {
"message": "to reset to pre-configured settings"
@@ -2028,7 +2066,7 @@
"message": "Self-hosted"
},
"thirdParty": {
"message": "Third-party"
"message": "Trečioji šalis"
},
"thirdPartyServerMessage": {
"message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.",
@@ -2055,16 +2093,16 @@
"message": "Logging in as"
},
"notYou": {
"message": "Not you?"
"message": "Ne jūs?"
},
"newAroundHere": {
"message": "New around here?"
"message": "Ar jūs naujas čia?"
},
"rememberEmail": {
"message": "Remember email"
},
"loginWithDevice": {
"message": "Log in with device"
"message": "Prisijunkite naudodami įrenginį"
},
"loginWithDeviceEnabledInfo": {
"message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?"
@@ -2076,7 +2114,7 @@
"message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device."
},
"resendNotification": {
"message": "Resend notification"
"message": "Iš naujo siųsti pranešimą"
},
"viewAllLoginOptions": {
"message": "View all log in options"
@@ -2085,7 +2123,7 @@
"message": "A notification has been sent to your device."
},
"logInInitiated": {
"message": "Log in initiated"
"message": "Pradėtas prisijungimas"
},
"exposedMasterPassword": {
"message": "Exposed Master Password"
@@ -2103,7 +2141,7 @@
"message": "Check known data breaches for this password"
},
"important": {
"message": "Important:"
"message": "Svarbu:"
},
"masterPasswordHint": {
"message": "Your master password cannot be recovered if you forget it!"
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Uzstādīt galveno paroli"
},
"currentMasterPass": {
"message": "Pašreizējā galvenā parole"
},
"newMasterPass": {
"message": "Jaunā galvenā parole"
},
"confirmNewMasterPass": {
"message": "Apstiprināt jauno galveno paroli"
},
"masterPasswordPolicyInEffect": {
"message": "Viena vai vairākas apvienības nosacījumos ir norādīts, lai galvenā parole atbilst šādām prasībām:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Apvienības pārvaldnieks nesen nomainīja galveno paroli. Tā ir jāatjaunina, lai varētu piekļūt glabātavai. Turpinot tiks izbeigta pašreizējā sesija un tiks pieprasīta atkārtota pieteikšanās. Esošās sesijas citās ierīcēs var turpināt darboties līdz vienai stundai."
},
"updateWeakMasterPasswordWarning": {
"message": "Galvenā parole neatbilst vienam vai vairākiem apvienības nosacījumiem. Ir jāatjaunina galvenā parole, lai varētu piekļūt glabātavai. Turpinot notiks atteikšanās no pašreizējās sesijas, un būs nepieciešams pieteikties no jauna. Citās ierīcēs esošās sesijas var turpināt darboties līdz vienai stundai."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automātiska ievietošana sarakstā"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Apvienības nosacījumi ietekmē glabātavas noildzi. Lielākā atļautā glabātavas noildze ir $HOURS$ stunda(s) un $MINUTES$ minūte(s). Kā glabātavas noildzes darbība ir uzstādīta $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Apvienības nosacījumos kā glabātavas noildzes darbība ir uzstādīta $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Glabātavas noildze pārsniedz apvienības uzstādītos ierobežojumus."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Atver jaunā logā"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "പ്രാഥമിക പാസ്‌വേഡ് സജ്ജമാക്കുക"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "ഒന്നോ അതിലധികമോ ഓർഗനൈസേഷൻ നയങ്ങൾക്ക് ഇനിപ്പറയുന്ന ആവശ്യകതകൾ നിറവേറ്റുന്നതിന് നിങ്ങളുടെ മാസ്റ്റർ പാസ്‌വേഡ് ആവശ്യമാണ്:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Angi hovedpassord"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "En eller flere av virksomhetens regler krever at hovedpassordet oppfyller følgende krav:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Hovedpassordet ditt ble nylig endret av en administrator i organisasjonen din. For å få tilgang til hvelvet, må du oppdatere det nå. Hvis du fortsetter, logges du ut av den nåværende økten, og du må logge på igjen. Aktive økter på andre enheter kan fortsette å være aktive i opptil én time."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatisk registrering"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Tidsavbrudd i hvelvet ditt overskrider restriksjoner fastsatt av din organisasjon."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Hoofdwachtwoord instellen"
},
"currentMasterPass": {
"message": "Huidig hoofdwachtwoord"
},
"newMasterPass": {
"message": "Nieuw hoofdwachtwoord"
},
"confirmNewMasterPass": {
"message": "Nieuw hoofdwachtwoord bevestigen"
},
"masterPasswordPolicyInEffect": {
"message": "Een of meer organisatiebeleidseisen verlangen dat je hoofdwachtwoord voldoet aan:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Je hoofdwachtwoord is onlangs veranderd door een beheerder in jouw organisatie. Om toegang te krijgen tot de kluis, moet je deze nu bijwerken. Doorgaan zal je huidige sessie uitloggen, waarna je opnieuw moet inloggen. Actieve sessies op andere apparaten blijven mogelijk nog een uur actief."
},
"updateWeakMasterPasswordWarning": {
"message": "Je hoofdwachtwoord voldoet niet aan en of meerdere oganisatiebeleidsonderdelen. Om toegang te krijgen tot de kluis, moet je je hoofdwachtwoord nu bijwerken. Doorgaan zal je huidige sessie uitloggen, waarna je opnieuw moet inloggen. Actieve sessies op andere apparaten blijven mogelijk nog een uur actief."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatische inschrijving"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "De beleidsinstellingen van je organisatie hebben invloed op de time-out van je kluis. De maximale toegestane kluis time-out is $HOURS$ uur en $MINUTES$ minuten. Jouw time-out is ingesteld op $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "De beleidsinstellingen van je organisatie hebben je kluis time-out ingesteld op $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Je kluis time-out is hoger dan het maximum van jouw organisatie."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Ustaw hasło główne"
},
"currentMasterPass": {
"message": "Aktualne hasło główne"
},
"newMasterPass": {
"message": "Nowe hasło główne"
},
"confirmNewMasterPass": {
"message": "Potwierdź nowe hasło główne"
},
"masterPasswordPolicyInEffect": {
"message": "Co najmniej jedna zasada organizacji wymaga, aby hasło główne spełniało następujące wymagania:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Hasło główne zostało zmienione przez administratora Twojej organizacji. Musisz je zaktualizować, aby uzyskać dostęp do sejfu. Ta czynność spowoduje wylogowanie z bieżącej sesji, przez co konieczne będzie ponowne zalogowanie się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę."
},
"updateWeakMasterPasswordWarning": {
"message": "Twoje hasło główne nie spełnia jednej lub kilku zasad organizacji. Aby uzyskać dostęp do sejfu, musisz teraz zaktualizować swoje hasło główne. Kontynuacja wyloguje Cię z bieżącej sesji, wymagając zalogowania się ponownie. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie jedną godzinę."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatyczne rejestrowanie użytkowników"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Zasady organizacji mają wpływ na czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min. Twój czas blokowania sejfu to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Zasady organizacji ustawiły czas blokowania sejfu na $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Czas blokowania sejfu przekracza limit określony przez organizację."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Otwiera w nowym oknie"
}
}

View File

@@ -196,10 +196,10 @@
"message": "Ajuda & Feedback"
},
"helpCenter": {
"message": "Bitwarden Help center"
"message": "Central de Ajuda"
},
"communityForums": {
"message": "Explore Bitwarden community forums"
"message": "Explore os fóruns da comunidade"
},
"contactSupport": {
"message": "Contact Bitwarden support"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Definir Senha Mestra"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Sua Senha Mestra foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizá-la agora. O processo desconectará você da sessão atual, exigindo que você inicie a sessão novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Inscrição Automática"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Seu tempo de espera no cofre excede as restrições estabelecidas por sua organização."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -80,7 +80,7 @@
"message": "Copiar URI"
},
"copyUsername": {
"message": "Copiar Nome de Utilizador"
"message": "Copiar nome de utilizador"
},
"copyNumber": {
"message": "Copiar Número"
@@ -568,7 +568,7 @@
"message": "Tem a certeza de que pretende sobreescrever a palavra-passe atual?"
},
"overwriteUsername": {
"message": "Sobrescrever Nome de Utilizador"
"message": "Sobrescrever nome de utilizador"
},
"overwriteUsernameConfirmation": {
"message": "Tem a certeza de que deseja sobrescrever o nome de utilizador atual?"
@@ -693,7 +693,7 @@
"message": "Saiba mais sobre as Organizações"
},
"learnOrgConfirmation": {
"message": "O Bitwarden permite que você compartilhe os itens do seu cofre com outras pessoas usando uma organização. Gostaria de visitar o site bitwarden.com para saber mais?"
"message": "O Bitwarden permite-lhe partilhar os itens do seu cofre com outras pessoas ao usar uma organização. Gostaria de visitar o site bitwarden.com para saber mais?"
},
"moveToOrganization": {
"message": "Mudança para Organização"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Definir palavra-passe mestra"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "Uma ou mais políticas da organização requerem que a sua palavra-passe mestra cumpra aos seguintes requisitos:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Inscrição Automática"
},
@@ -1863,7 +1875,7 @@
"message": "Minutos"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -1936,13 +1974,13 @@
"message": "Erro"
},
"regenerateUsername": {
"message": "Regerar Nome de Utilizador"
"message": "Regerar nome de utilizador"
},
"generateUsername": {
"message": "Gerar Nome de Utilizador"
"message": "Gerar nome de utilizador"
},
"usernameType": {
"message": "Tipo de Nome de Utilizador"
"message": "Tipo de nome de utilizador"
},
"plusAddressedEmail": {
"message": "Plus addressed email",
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Setare parolă principală"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "Una sau mai multe politici ale organizației necesită ca parola principală să îndeplinească următoarele cerințe:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Parola principală a fost schimbată recent de către un administrator din organizație. Pentru a accesa seiful, trebuie să o actualizați acum. Continuarea vă va deconecta de la sesiunea curentă, cerându-vă să vă conectați din nou. Sesiunile active de pe alte dispozitive pot continua să rămână active timp de până la o oră."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Înscrierea automată"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Timpul de expirare al seifului depășește restricțiile stabilite de organizația dvs."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Задать мастер-пароль"
},
"currentMasterPass": {
"message": "Текущий мастер-пароль"
},
"newMasterPass": {
"message": "Новый мастер-пароль"
},
"confirmNewMasterPass": {
"message": "Подтвердите новый мастер-пароль"
},
"masterPasswordPolicyInEffect": {
"message": "Согласно одной или нескольким политикам организации необходимо, чтобы ваш мастер-пароль отвечал следующим требованиям:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Мастер-пароль недавно был изменен администратором вашей организации. Чтобы получить доступ к хранилищу, вы должны обновить его сейчас. В результате текущий сеанс будет завершен, потребуется повторный вход. Сеансы на других устройствах могут оставаться активными в течение одного часа."
},
"updateWeakMasterPasswordWarning": {
"message": "Ваш мастер-пароль не соответствует требованиям политики вашей организации. Для доступа к хранилищу вы должны обновить свой мастер-пароль прямо сейчас. При этом текущая сессия будет завершена и потребуется повторная авторизация. Сессии на других устройствах могут оставаться активными в течение часа."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Автоматическое развертывание"
},
@@ -1863,7 +1875,7 @@
"message": "Мин."
},
"vaultTimeoutPolicyInEffect": {
"message": "Политики вашей организации влияют на тайм-аут хранилища. Максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин.",
"message": "В соответствии с политиками вашей организации максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин.",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Политики вашей организации влияют на тайм-аут хранилища. Максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин. Для вашего хранилища задан тайм-аут $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Политики вашей организации установили тайм-аут хранилища на $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Тайм-аут вашего хранилища превышает ограничения, установленные вашей организацией."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Откроется в новом окне"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "මාස්ටර් මුරපදය සකසන්න"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "සංවිධාන ප්රතිපත්ති එකක් හෝ වැඩි ගණනක් පහත සඳහන් අවශ්යතා සපුරාලීම සඳහා ඔබේ ප්රධාන මුරපදය අවශ්ය වේ:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "ඔබේ ප්රධාන මුරපදය මෑතකදී ඔබේ සංවිධානයේ පරිපාලක විසින් වෙනස් කරන ලදී. සුරක්ෂිතාගාරය වෙත ප්රවේශ වීම සඳහා, ඔබ දැන් එය යාවත්කාලීන කළ යුතුය. ඔබගේ වර්තමාන සැසියෙන් ඔබව ප්රවිෂ්ට වනු ඇත, ඔබ නැවත ප්රවිෂ්ට වීමට අවශ්ය. වෙනත් උපාංගවල ක්රියාකාරී සැසි පැයක් දක්වා ක්රියාකාරීව පැවතිය හැකිය."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "ස්වයංක්රීය බඳවා ගැනීම"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Nastaviť hlavné heslo"
},
"currentMasterPass": {
"message": "Súčasné hlavné heslo"
},
"newMasterPass": {
"message": "Nové hlavné heslo"
},
"confirmNewMasterPass": {
"message": "Potvrďte nové hlavné heslo"
},
"masterPasswordPolicyInEffect": {
"message": "Jedno alebo viac pravidiel organizácie požadujú aby vaše hlavné heslo spĺňalo nasledujúce požiadavky:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Vaše hlavné heslo nedávno zmenil správca vo vašej organizácii. Ak chcete získať prístup k trezoru, musíte ho teraz aktualizovať. Pokračovaním sa odhlásite z aktuálnej relácie a budete sa musieť znova prihlásiť. Aktívne relácie na iných zariadeniach môžu zostať aktívne až jednu hodinu."
},
"updateWeakMasterPasswordWarning": {
"message": "Vaše hlavné heslo nespĺňa jednu alebo viacero podmienok vašej organizácie. Ak chcete získať prístup k trezoru, musíte teraz aktualizovať svoje hlavné heslo. Pokračovaním sa odhlásite z aktuálnej relácie a budete sa musieť znova prihlásiť. Aktívne relácie na iných zariadeniach môžu zostať aktívne až jednu hodinu."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatická registrácia"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Zásady vašej organizácie ovplyvňujú časový limit trezoru. Maximálny povolený časový limit trezoru je $HOURS$ h a $MINUTES$ min. Nastavenie akcie pri vypršaní časového limitu je $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Zásady vašej organizácie nastavili akciu pri vypršaní časového limitu trezora na $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Časový limit vášho trezora prekračuje obmedzenia nastavené vašou organizáciou."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Otvárať v novom okne"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Nastavi glavno geslo"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minut"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -345,7 +345,7 @@
"message": "Молимо вас да размотрите да нам помогнете уз добру оцену!"
},
"browserNotSupportClipboard": {
"message": "Ваш прегледач не подржава једноставно копирање у привремену меморију. Уместо тога копирајте га ручно."
"message": "Ваш прегледач не подржава једноставно копирање у клипборду. Уместо тога копирајте га ручно."
},
"verifyIdentity": {
"message": "Потврдите идентитет"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Постави Главну Лозинку"
},
"currentMasterPass": {
"message": "Тренутна главна лозинка"
},
"newMasterPass": {
"message": "Нова главна лозинка"
},
"confirmNewMasterPass": {
"message": "Потрдити нову главну лозинку"
},
"masterPasswordPolicyInEffect": {
"message": "Једна или више смерница организације захтевају да ваша главна лозинка испуни следеће захтеве:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Ваша главна лозинка је недавно промењена од стране администратора организације. Како бисте приступили сефу, морате да је ажурирате. Ако наставите бићете одјављени из ваше тренутне сесије, што ће захтевати да се поново пријавите. Активне сесије на другим уређајима ће можда наставити да раде до сат времена."
},
"updateWeakMasterPasswordWarning": {
"message": "Ваша главна лозинка не испуњава једну или више смерница ваше организације. Да бисте приступили сефу, морате одмах да ажурирате главну лозинку. Ако наставите, одјавићете се са ваше тренутне сесије, што захтева да се поново пријавите. Активне сесије на другим уређајима могу да остану активне до један сат."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Ауто пријављивање"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Смернице ваше организације утичу на временско ограничење сефа. Максимално дозвољено ограничење сефа је $HOURS$ сат(и) и $MINUTES$ минут(а). Ваша радња временског ограничења сефа је подешена на $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Смернице ваше организације су поставиле вашу радњу временског ограничења сефа на $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Време истека вашег сефа је премашило дозвољена ограничења од стране ваше организације."
},
@@ -2091,16 +2129,16 @@
"message": "Изложена главна лозинка"
},
"exposedMasterPasswordDesc": {
"message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?"
"message": "Лозинка је пронађена у случају повреде података. Користите јединствену лозинку да бисте заштитили свој налог. Да ли сте сигурни да желите да користите откривену лозинку?"
},
"weakAndExposedMasterPassword": {
"message": "Слаба и изложена главна лозинка"
},
"weakAndBreachedMasterPasswordDesc": {
"message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?"
"message": "Идентификована је слаба лозинка и пронађена у упаду података. Користите јаку и јединствену лозинку да заштитите свој налог. Да ли сте сигурни да желите да користите ову лозинку?"
},
"checkForBreaches": {
"message": "Check known data breaches for this password"
"message": "Проверите познате упада података за ову лозинку"
},
"important": {
"message": "Важно:"
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Ange huvudlösenord"
},
"currentMasterPass": {
"message": "Nuvarande huvudlösenord"
},
"newMasterPass": {
"message": "Nytt huvudlösenord"
},
"confirmNewMasterPass": {
"message": "Bekräfta nytt huvudlösenord"
},
"masterPasswordPolicyInEffect": {
"message": "En eller flera organisationspolicyer kräver att ditt huvudlösenord uppfyller följande krav:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Ditt huvudlösenord ändrades nyligen av en administratör i din organisation. För att få tillgång till valvet måste du uppdatera det nu. Om du fortsätter kommer du att loggas ut från din nuvarande session, vilket kräver att du loggar in igen. Aktiva sessioner på andra enheter kan komma att vara aktiva i upp till en timme."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatiskt deltagande"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Ditt valvs tidsgräns överskrider de begränsningar som fastställts av din organisation."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Set master password"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "ตั้งรหัสผ่านหลัก"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "นโยบายองค์กรอย่างน้อยหนึ่งนโยบายกำหนดให้รหัสผ่านหลักของคุณเป็นไปตามข้อกำหนดต่อไปนี้:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Minutes"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Ana parolayı belirle"
},
"currentMasterPass": {
"message": "Mevcut ana parola"
},
"newMasterPass": {
"message": "Yeni ana parola"
},
"confirmNewMasterPass": {
"message": "Yeni ana parolayı onaylayın"
},
"masterPasswordPolicyInEffect": {
"message": "Bir veya daha fazla kuruluş ilkesi gereğince ana parolanız aşağıdaki gereksinimleri karşılamalıdır:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Ana parolanız kuruluşunuzdaki bir yönetici tarafından yakın zamanda değiştirildi. Kasanıza erişmek için parolanızı güncellemelisiniz. Devam ettiğinizde oturumunuz kapanacak ve yeniden oturum açmanız gerekecektir. Diğer cihazlardaki aktif oturumlar bir saate kadar aktif kalabilir."
},
"updateWeakMasterPasswordWarning": {
"message": "Ana parolanız kuruluş ilkelerinizi karşılamıyor. Kasanıza erişmek için ana parolanızı güncellemelisiniz. Devam ettiğinizde oturumunuz kapanacak ve yeniden oturum açmanız gerekecektir. Diğer cihazlardaki aktif oturumlar bir saate kadar aktif kalabilir."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Otomatik eklenme"
},
@@ -1863,7 +1875,7 @@
"message": "Dakika"
},
"vaultTimeoutPolicyInEffect": {
"message": "Kuruluş ilkeleriniz kasa zaman aşımınızı etkiliyor. İzin verilen maksimum kasa zaman aşımı $HOURS$ saat $MINUTES$ dakikadır",
"message": "Kuruluş ilkeleriniz izin verilen maksimum kasa zaman aşımını $HOURS$ saat $MINUTES$ dakika olarak belirlemiş.",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Kuruluş ilkeleriniz kasa zaman aşımınızı etkiliyor. İzin verilen maksimum kasa zaman aşımı $HOURS$ saat $MINUTES$ dakikadır. Kasa zaman aşımı eyleminiz $ACTION$ olarak ayarlanmış.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Kuruluş ilkeleriniz, kasa zaman aşımı eyleminizi $ACTION$ olarak ayarladı.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Kasa zaman aşımınız, kuruluşunuz tarafından belirlenen kısıtlamalarııyor."
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Yeni pencerede açılır"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Встановити головний пароль"
},
"currentMasterPass": {
"message": "Поточний головний пароль"
},
"newMasterPass": {
"message": "Новий головний пароль"
},
"confirmNewMasterPass": {
"message": "Підтвердьте новий головний пароль"
},
"masterPasswordPolicyInEffect": {
"message": "Одна або декілька політик організації вимагають дотримання таких вимог для головного пароля:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Ваш головний пароль нещодавно був змінений адміністратором організації. Щоб отримати доступ до сховища, вам необхідно оновити його зараз. Продовживши, ви вийдете з поточного сеансу, після чого потрібно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години."
},
"updateWeakMasterPasswordWarning": {
"message": "Ваш головний пароль не відповідає одній або більше політикам вашої організації. Щоб отримати доступ до сховища, вам необхідно оновити свій головний пароль зараз. Продовживши, ви вийдете з поточного сеансу, після чого потрібно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Автоматичне розгортання"
},
@@ -1863,7 +1875,7 @@
"message": "Хвилин"
},
"vaultTimeoutPolicyInEffect": {
"message": "Політики вашої організації впливають на час очікування сховища. Максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин",
"message": "Політикою вашої організації встановлено максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин.",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Політики вашої організації впливають на час очікування сховища. Максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин. Для часу очікування вашого сховища встановлена дія $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Політикою вашої організації встановлено дію для часу очікування сховища $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Час очікування сховища перевищує обмеження, встановлені вашою організацією."
},
@@ -2124,7 +2162,7 @@
"message": "Як працює автозаповнення"
},
"autofillSelectInfoWithCommand": {
"message": "Виберіть елемент з цієї сторінки або використайте комбінацію клавіш: $COMMAND$",
"message": "Виберіть елемент із цієї сторінки або використайте комбінацію клавіш: $COMMAND$",
"placeholders": {
"command": {
"content": "$1",
@@ -2133,7 +2171,7 @@
}
},
"autofillSelectInfoWithoutCommand": {
"message": "Виберіть елемент з цієї сторінки або встановіть комбінацію клавіш у налаштуваннях."
"message": "Виберіть елемент із цієї сторінки або встановіть комбінацію клавіш у налаштуваннях."
},
"gotIt": {
"message": "Зрозуміло"
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -196,13 +196,13 @@
"message": "Trợ giúp & phản hồi"
},
"helpCenter": {
"message": "Bitwarden Help center"
"message": "Trung tâm hỗ trợ Bitwarden"
},
"communityForums": {
"message": "Explore Bitwarden community forums"
"message": "Khám phá diễn đàn cộng đồng Bitwarden"
},
"contactSupport": {
"message": "Contact Bitwarden support"
"message": "Liên hệ với bộ phận hỗ trợ Bitwarden"
},
"sync": {
"message": "Đồng bộ"
@@ -439,7 +439,7 @@
"message": "Yêu cầu nhập lại mật khẩu chính."
},
"masterPasswordMinlength": {
"message": "Master password must be at least $VALUE$ characters long.",
"message": "Mật khẩu chính phải có ít nhất $VALUE$ kí tự.",
"description": "The Master Password must be at least a specific number of characters long.",
"placeholders": {
"value": {
@@ -622,7 +622,7 @@
"message": "Hỏi để cập nhật đăng nhập hiện có"
},
"changedPasswordNotificationDesc": {
"message": "Ask to update a login's password when a change is detected on a website."
"message": "Yêu cầu cập nhật mật khẩu đăng nhập khi phát hiện thay đổi trên trang web."
},
"notificationChangeDesc": {
"message": "Bạn có muốn cập nhật mật khẩu này trên Bitwarden không?"
@@ -634,7 +634,7 @@
"message": "Hiển thị tuỳ chọn menu ngữ cảnh"
},
"contextMenuItemDesc": {
"message": "Use a secondary click to access password generation and matching logins for the website. "
"message": "Sử dụng một đúp chuột để truy cập vào việc to mật khẩu và thông tin đăng nhập phù hợp cho trang web. "
},
"defaultUriMatchDetection": {
"message": "Phương thức kiểm tra URI mặc định",
@@ -678,10 +678,10 @@
"message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
},
"encExportKeyWarningDesc": {
"message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
"message": "Quá trình xuất này sẽ mã hóa dữ liệu của bạn bằng khóa mã hóa của tài khoản. Nếu bạn từng xoay khóa mã hóa tài khoản của mình, bạn nên xuất lại vì bạn sẽ không thể giải mã tệp xuất này."
},
"encExportAccountWarningDesc": {
"message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
"message": "Các khóa mã hóa tài khoản là duy nhất cho mỗi tài khoản người dùng Bitwarden, vì vậy bạn không thể nhập một bản xuất được mã hóa vào một tài khoản khác."
},
"exportMasterPassword": {
"message": "Nhập mật khẩu chính để xuất kho lưu trữ của bạn."
@@ -693,7 +693,7 @@
"message": "Xem tổ chức của bạn"
},
"learnOrgConfirmation": {
"message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
"message": "Bitwarden cho phép bạn chia sẻ các mục trong kho của mình với những người khác bằng cách sử dụng tài khoản tổ chức. Bạn có muốn truy cập trang web bitwarden.com để tìm hiểu thêm không?"
},
"moveToOrganization": {
"message": "Di chuyển đến tổ chức"
@@ -715,7 +715,7 @@
}
},
"moveToOrgDesc": {
"message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
"message": "Chọn một tổ chức mà bạn muốn chuyển mục này tới. Việc di chuyển đến một tổ chức sẽ chuyển quyền sở hữu của mục sang tổ chức mà bạn chọn. Bạn sẽ không còn là chủ sở hữu trực tiếp của mục này một khi nó đã được chuyển."
},
"learnMore": {
"message": "Tìm hiểu thêm"
@@ -877,7 +877,7 @@
"message": "Lắp khóa bảo mật vào cổng USB máy tính của bạn. Nếu nó có một nút, hãy nhấn vào nó."
},
"webAuthnNewTab": {
"message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
"message": "Để bắt đầu xác minh WebAuthn 2FA. Nhấp vào nút bên dưới để mở tab mới và làm theo hướng dẫn được cung cấp trong tab mới."
},
"webAuthnNewTabOpen": {
"message": "Mở thẻ mới"
@@ -928,7 +928,7 @@
"message": "FIDO2 WebAuthn"
},
"webAuthnDesc": {
"message": "Use any WebAuthn compatible security key to access your account."
"message": "Sử dụng bất kỳ khóa bảo mật tương thích với WebAuthn nào để truy cập vào tài khoản của bạn."
},
"emailTitle": {
"message": "Email"
@@ -976,7 +976,7 @@
"message": "Nếu phát hiện biểu mẫu đăng nhập, thực hiện tự động điền khi trang web tải xong."
},
"experimentalFeature": {
"message": "Compromised or untrusted websites can exploit auto-fill on page load."
"message": "Các trang web bị xâm phạm hoặc không đáng tin cậy có thể khai thác tính năng tự động điền khi tải trang."
},
"learnMoreAboutAutofill": {
"message": "Tìm hiểu thêm về tự động điền"
@@ -1065,7 +1065,7 @@
"message": "Hiển thị biểu tượng bộ đếm"
},
"badgeCounterDesc": {
"message": "Indicate how many logins you have for the current web page."
"message": "Cho biết bạn có bao nhiêu lần đăng nhập cho trang web hiện tại."
},
"cardholderName": {
"message": "Tên chủ thẻ"
@@ -1369,7 +1369,7 @@
"description": "ex. A weak password. Scale: Weak -> Good -> Strong"
},
"weakMasterPassword": {
"message": "Mật khẩu chính đơn giản"
"message": "Mật khẩu chính yếu"
},
"weakMasterPasswordDesc": {
"message": "Mật khẩu chính bạn vừa chọn có vẻ yếu. Bạn nên chọn mật khẩu chính (hoặc cụm từ mật khẩu) mạnh để bảo vệ đúng cách tài khoản Bitwarden của bạn. Bạn có thực sự muốn dùng mật khẩu chính này?"
@@ -1406,7 +1406,7 @@
"message": "Bạn phải chọn ít nhất một bộ sưu tập."
},
"cloneItem": {
"message": "Tại bản sao của mục"
"message": "Tạo bản sao của mục"
},
"clone": {
"message": "Tạo bản sao"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "Đặt mật khẩu chính"
},
"currentMasterPass": {
"message": "Mật khẩu chính hiện tại"
},
"newMasterPass": {
"message": "Mật khẩu chính mới"
},
"confirmNewMasterPass": {
"message": "Xác nhận mật khẩu chính mới"
},
"masterPasswordPolicyInEffect": {
"message": "Tổ chức của bạn yêu cầu mật khẩu chính của bạn phải đáp ứng các yêu cầu sau:"
},
@@ -1534,28 +1543,28 @@
"message": "Tích hợp trình duyệt chưa được kích hoạt"
},
"desktopIntegrationDisabledDesc": {
"message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application."
"message": "Tích hợp trình duyệt không được thiết lập trong ứng dụng máy tính để bàn Bitwarden. Vui lòng thiết lập nó trong cài đặt trong ứng dụng máy tính để bàn."
},
"startDesktopTitle": {
"message": "Mở ứng dụng Bitwarden trên máy tính"
},
"startDesktopDesc": {
"message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used."
"message": "Ứng dụng máy tính để bàn Bitwarden cần được khởi động trước khi có thể sử dụng tính năng mở khóa bằng sinh trắc học."
},
"errorEnableBiometricTitle": {
"message": "Không thể bật nhận dạng sinh trắc học"
},
"errorEnableBiometricDesc": {
"message": "Action was canceled by the desktop application"
"message": "Hành động đã bị hủy bởi ứng dụng máy tính để bàn"
},
"nativeMessagingInvalidEncryptionDesc": {
"message": "Desktop application invalidated the secure communication channel. Please retry this operation"
"message": "Ứng dụng máy tính để bàn đã vô hiệu hóa kênh liên lạc an toàn. Vui lòng thử lại thao tác này"
},
"nativeMessagingInvalidEncryptionTitle": {
"message": "Desktop communication interrupted"
"message": "Giao tiếp máy tính để bàn bị gián đoạn"
},
"nativeMessagingWrongUserDesc": {
"message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
"message": "Ứng dụng máy tính để bàn được đăng nhập vào một tài khoản khác. Hãy đảm bảo cả hai ứng dụng được đăng nhập vào cùng một tài khoản."
},
"nativeMessagingWrongUserTitle": {
"message": "Tài khoản không đúng"
@@ -1576,25 +1585,25 @@
"message": "Quyền chưa được cấp"
},
"nativeMessaginPermissionErrorDesc": {
"message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
"message": "Nếu không được phép giao tiếp với Ứng dụng máy tính để bàn Bitwarden, chúng tôi không thể cung cấp sinh trắc học trong tiện ích mở rộng trình duyệt. Vui lòng thử lại."
},
"nativeMessaginPermissionSidebarTitle": {
"message": "Lỗi yêu cầu quyền"
},
"nativeMessaginPermissionSidebarDesc": {
"message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
"message": "Không thể thực hiện hành động này trong thanh bên, vui lòng thử lại hành động trong cửa sổ bật lên hoặc cửa sổ bật ra."
},
"personalOwnershipSubmitError": {
"message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available collections."
"message": "Do Chính sách doanh nghiệp, bạn bị hạn chế lưu các mục vào kho tiền cá nhân của mình. Thay đổi tùy chọn Quyền sở hữu thành một tổ chức và chọn từ các bộ sưu tập có sẵn."
},
"personalOwnershipPolicyInEffect": {
"message": "An organization policy is affecting your ownership options."
"message": "Chính sách của tổ chức đang ảnh hưởng đến các tùy chọn quyền sở hữu của bạn."
},
"excludedDomains": {
"message": "Tên miền đã loại trừ"
},
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
"message": "Bitwarden sẽ không yêu cầu lưu thông tin đăng nhập cho các miền này. Bạn phải làm mới trang để các thay đổi có hiệu lực."
},
"excludedDomainsInvalidDomain": {
"message": "$DOMAIN$ không phải là tên miền hợp lệ",
@@ -1628,7 +1637,7 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"maxAccessCountReached": {
"message": "Max access count reached",
"message": "Đã đạt đến số lượng truy cập tối đa",
"description": "This text will be displayed after a Send has been accessed the maximum amount of times."
},
"expired": {
@@ -1727,7 +1736,7 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendPasswordDesc": {
"message": "Optionally require a password for users to access this Send.",
"message": "Tùy chọn yêu cầu mật khẩu để người dùng truy cập Gửi này.",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendNotesDesc": {
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
},
@@ -1863,7 +1875,7 @@
"message": "Phút"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $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).",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
},
@@ -2088,7 +2126,7 @@
"message": "Log in initiated"
},
"exposedMasterPassword": {
"message": "Exposed Master Password"
"message": "Mật khẩu chính bị lộ"
},
"exposedMasterPasswordDesc": {
"message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?"
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "设置主密码"
},
"currentMasterPass": {
"message": "当前主密码"
},
"newMasterPass": {
"message": "新主密码"
},
"confirmNewMasterPass": {
"message": "确认新主密码"
},
"masterPasswordPolicyInEffect": {
"message": "一个或多个组织策略要求您的主密码满足下列要求:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "您的主密码最近被您组织的管理员更改过。要访问密码库,您必须立即更新它。继续操作将使您退出当前会话并要求您重新登录。其他设备上的活动会话可能会继续保持活动状态长达一小时。"
},
"updateWeakMasterPasswordWarning": {
"message": "您的主密码不符合您的组织策略要求。要访问密码库,必须立即更新您的主密码。继续操作将使您退出当前会话,要求您重新登录。其他设备上的活动会话可能会继续保持活动状态长达一小时。"
},
"resetPasswordPolicyAutoEnroll": {
"message": "自动注册"
},
@@ -1863,7 +1875,7 @@
"message": "分钟"
},
"vaultTimeoutPolicyInEffect": {
"message": "您的组织策略正在影响您的密码库超时时间。最大允许的密码库超时时间 $HOURS$ 小时 $MINUTES$ 分钟。",
"message": "您的组织策略已将您最大允许的密码库超时时间设置为 $HOURS$ 小时 $MINUTES$ 分钟。",
"placeholders": {
"hours": {
"content": "$1",
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "您的组织策略正在影响您的密码库超时时间。最大允许的密码库超时时间是 $HOURS$ 小时 $MINUTES$ 分钟。您的密码库超时动作被设置为 $ACTION$。",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "您的组织策略已将您的密码库超时动作设置为 $ACTION$。",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "您的密码库超时时间超出了组织设置的限制。"
},
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "在新窗口中打开"
}
}

View File

@@ -976,7 +976,7 @@
"message": "網頁載入時如果偵測到登入表單,則執行自動填入。"
},
"experimentalFeature": {
"message": "Compromised or untrusted websites can exploit auto-fill on page load."
"message": "被竊取或不可信任的網站可以利用自動填入功能在網頁載入時竊取資訊。"
},
"learnMoreAboutAutofill": {
"message": "進一步瞭解「自動填入」功能"
@@ -1464,6 +1464,15 @@
"setMasterPassword": {
"message": "設定主密碼"
},
"currentMasterPass": {
"message": "Current master password"
},
"newMasterPass": {
"message": "New master password"
},
"confirmNewMasterPass": {
"message": "Confirm new master password"
},
"masterPasswordPolicyInEffect": {
"message": "一個或多個組織原則要求您的主密碼須符合下列條件:"
},
@@ -1844,6 +1853,9 @@
"updateMasterPasswordWarning": {
"message": "您的主密碼最近被您的組織管理者變更過。若要存取密碼庫,您必須立即更新主密碼。繼續操作會登出目前的登入階段,並要求您重新登入。其他裝置上的活動登入階段最多會保持一個小時。"
},
"updateWeakMasterPasswordWarning": {
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
},
"resetPasswordPolicyAutoEnroll": {
"message": "自動註冊"
},
@@ -1875,6 +1887,32 @@
}
}
},
"vaultTimeoutPolicyWithActionInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
"placeholders": {
"hours": {
"content": "$1",
"example": "5"
},
"minutes": {
"content": "$2",
"example": "5"
},
"action": {
"content": "$3",
"example": "Lock"
}
}
},
"vaultTimeoutActionPolicyInEffect": {
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
"placeholders": {
"action": {
"content": "$1",
"example": "Lock"
}
}
},
"vaultTimeoutTooLarge": {
"message": "您的密碼庫逾時時間超過組織設定的限制。"
},
@@ -2067,13 +2105,13 @@
"message": "使用裝置登入"
},
"loginWithDeviceEnabledInfo": {
"message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?"
"message": "裝置登入必須在 Bitwarden 應用程式的設定中啟用。需要其他選項嗎?"
},
"fingerprintPhraseHeader": {
"message": "指紋短語"
},
"fingerprintMatchInfo": {
"message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device."
"message": "請確保您的密碼庫已解鎖,並且指紋短語與其他裝置的一致。"
},
"resendNotification": {
"message": "重新傳送通知"
@@ -2091,13 +2129,13 @@
"message": "已暴露的主密碼"
},
"exposedMasterPasswordDesc": {
"message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?"
"message": "在其他資料庫中找到您的密碼。我們建議您使用一個獨特的密碼來保護您的帳號,您確定要用這個密碼嗎?"
},
"weakAndExposedMasterPassword": {
"message": "強度不足且已暴露的主密碼"
},
"weakAndBreachedMasterPasswordDesc": {
"message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?"
"message": "密碼強度不足,且在其他資料庫中找到這個密碼。使用一個強度足夠和獨特的密碼來保護您的帳號。請問您確定要用這個密碼嗎?"
},
"checkForBreaches": {
"message": "檢查外洩密碼資料庫中是否有此密碼"
@@ -2118,13 +2156,13 @@
}
},
"autofillPageLoadPolicyActivated": {
"message": "Your organization policies have turned on auto-fill on page load."
"message": "您的組織政策已經開啟了自動填入功能。"
},
"howToAutofill": {
"message": "如何自動填入"
},
"autofillSelectInfoWithCommand": {
"message": "Select an item from this page or use the shortcut: $COMMAND$",
"message": "從這個網頁選擇一個項目,或使用快速鍵:$COMMAND$",
"placeholders": {
"command": {
"content": "$1",
@@ -2133,7 +2171,7 @@
}
},
"autofillSelectInfoWithoutCommand": {
"message": "Select an item from this page or set a shortcut in settings."
"message": "從這個網頁選擇一個項目,或在設定中設定一個快速鍵。"
},
"gotIt": {
"message": "我知道了"
@@ -2145,10 +2183,10 @@
"message": "自動填入鍵盤快速鍵"
},
"autofillShortcutNotSet": {
"message": "The auto-fill shortcut is not set. Change this in the browser's settings."
"message": "自動填入快速鍵尚未設定。請在瀏覽器的設定中變更。"
},
"autofillShortcutText": {
"message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.",
"message": "自動填入快速鍵是:$COMMAND$。請在瀏覽器的設定中變更。",
"placeholders": {
"command": {
"content": "$1",
@@ -2164,5 +2202,8 @@
"example": "CTRL+Shift+L"
}
}
},
"opensInANewWindow": {
"message": "Opens in a new window"
}
}

View File

@@ -3,7 +3,7 @@ import { Jsonify } from "type-fest";
import { StateService } from "@bitwarden/common/abstractions/state.service";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums/policy-type";
import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { Policy } from "@bitwarden/common/admin-console/models/domain/policy";
import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service";

View File

@@ -5,7 +5,7 @@ export function registerAlarms() {
}
/**
* Creates staggered alarms that periodically (1min) raise OnAlarm events. The staggering is calculated based on the numnber of alarms passed in.
* Creates staggered alarms that periodically (1min) raise OnAlarm events. The staggering is calculated based on the number of alarms passed in.
* @param numberOfAlarms Number of named alarms, that shall be registered
* @example
* // alarmsToBeCreated(2) results in 2 alarms separated by 30 seconds

View File

@@ -1,6 +1,10 @@
import { AuthService as AbstractAuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { AuthService } from "@bitwarden/common/auth/services/auth.service";
import {
policyServiceFactory,
PolicyServiceInitOptions,
} from "../../../admin-console/background/service-factories/policy-service.factory";
import {
apiServiceFactory,
ApiServiceInitOptions,
@@ -11,8 +15,8 @@ import {
CryptoServiceInitOptions,
} from "../../../background/service_factories/crypto-service.factory";
import {
EncryptServiceInitOptions,
encryptServiceFactory,
EncryptServiceInitOptions,
} from "../../../background/service_factories/encrypt-service.factory";
import {
environmentServiceFactory,
@@ -24,20 +28,24 @@ import {
FactoryOptions,
} from "../../../background/service_factories/factory-options";
import {
I18nServiceInitOptions,
i18nServiceFactory,
I18nServiceInitOptions,
} from "../../../background/service_factories/i18n-service.factory";
import {
logServiceFactory,
LogServiceInitOptions,
} from "../../../background/service_factories/log-service.factory";
import {
MessagingServiceInitOptions,
messagingServiceFactory,
MessagingServiceInitOptions,
} from "../../../background/service_factories/messaging-service.factory";
import {
PlatformUtilsServiceInitOptions,
passwordGenerationServiceFactory,
PasswordGenerationServiceInitOptions,
} from "../../../background/service_factories/password-generation-service.factory";
import {
platformUtilsServiceFactory,
PlatformUtilsServiceInitOptions,
} from "../../../background/service_factories/platform-utils-service.factory";
import {
stateServiceFactory,
@@ -45,11 +53,11 @@ import {
} from "../../../background/service_factories/state-service.factory";
import {
KeyConnectorServiceInitOptions,
keyConnectorServiceFactory,
KeyConnectorServiceInitOptions,
} from "./key-connector-service.factory";
import { TokenServiceInitOptions, tokenServiceFactory } from "./token-service.factory";
import { TwoFactorServiceInitOptions, twoFactorServiceFactory } from "./two-factor-service.factory";
import { tokenServiceFactory, TokenServiceInitOptions } from "./token-service.factory";
import { twoFactorServiceFactory, TwoFactorServiceInitOptions } from "./two-factor-service.factory";
type AuthServiceFactoyOptions = FactoryOptions;
@@ -65,7 +73,9 @@ export type AuthServiceInitOptions = AuthServiceFactoyOptions &
StateServiceInitOptions &
TwoFactorServiceInitOptions &
I18nServiceInitOptions &
EncryptServiceInitOptions;
EncryptServiceInitOptions &
PolicyServiceInitOptions &
PasswordGenerationServiceInitOptions;
export function authServiceFactory(
cache: { authService?: AbstractAuthService } & CachedServices,
@@ -89,7 +99,9 @@ export function authServiceFactory(
await stateServiceFactory(cache, opts),
await twoFactorServiceFactory(cache, opts),
await i18nServiceFactory(cache, opts),
await encryptServiceFactory(cache, opts)
await encryptServiceFactory(cache, opts),
await passwordGenerationServiceFactory(cache, opts),
await policyServiceFactory(cache, opts)
)
);
}

View File

@@ -2,6 +2,7 @@ import { Component, NgZone } from "@angular/core";
import { Router } from "@angular/router";
import { LockComponent as BaseLockComponent } from "@bitwarden/angular/auth/components/lock.component";
import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service";
@@ -12,9 +13,12 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti
import { StateService } from "@bitwarden/common/abstractions/state.service";
import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service";
import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service";
import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction";
import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
import { BiometricErrors, BiometricErrorTypes } from "../../models/biometricErrors";
@@ -42,7 +46,11 @@ export class LockComponent extends BaseLockComponent {
logService: LogService,
keyConnectorService: KeyConnectorService,
ngZone: NgZone,
private authService: AuthService
policyApiService: PolicyApiServiceAbstraction,
policyService: InternalPolicyService,
passwordGenerationService: PasswordGenerationServiceAbstraction,
private authService: AuthService,
dialogService: DialogServiceAbstraction
) {
super(
router,
@@ -57,7 +65,11 @@ export class LockComponent extends BaseLockComponent {
apiService,
logService,
keyConnectorService,
ngZone
ngZone,
policyApiService,
policyService,
passwordGenerationService,
dialogService
);
this.successRoute = "/tabs/current";
this.isInitialLockScreen = (window as any).previousPopupUrl == null;

View File

@@ -3,6 +3,7 @@ import { UntypedFormBuilder } from "@angular/forms";
import { Router } from "@angular/router";
import { RegisterComponent as BaseRegisterComponent } from "@bitwarden/angular/components/register.component";
import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
@@ -36,7 +37,8 @@ export class RegisterComponent extends BaseRegisterComponent {
passwordGenerationService: PasswordGenerationServiceAbstraction,
environmentService: EnvironmentService,
logService: LogService,
auditService: AuditService
auditService: AuditService,
dialogService: DialogServiceAbstraction
) {
super(
formValidationErrorService,
@@ -51,7 +53,8 @@ export class RegisterComponent extends BaseRegisterComponent {
passwordGenerationService,
environmentService,
logService,
auditService
auditService,
dialogService
);
}
}

View File

@@ -2,6 +2,7 @@ import { Component } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
import { SetPasswordComponent as BaseSetPasswordComponent } from "@bitwarden/angular/components/set-password.component";
import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -34,7 +35,8 @@ export class SetPasswordComponent extends BaseSetPasswordComponent {
syncService: SyncService,
route: ActivatedRoute,
organizationApiService: OrganizationApiServiceAbstraction,
organizationUserService: OrganizationUserService
organizationUserService: OrganizationUserService,
dialogService: DialogServiceAbstraction
) {
super(
i18nService,
@@ -50,7 +52,8 @@ export class SetPasswordComponent extends BaseSetPasswordComponent {
route,
stateService,
organizationApiService,
organizationUserService
organizationUserService,
dialogService
);
}
}

View File

@@ -3,6 +3,7 @@ import { ActivatedRoute, Router } from "@angular/router";
import { first } from "rxjs/operators";
import { TwoFactorComponent as BaseTwoFactorComponent } from "@bitwarden/angular/auth/components/two-factor.component";
import { DialogServiceAbstraction, SimpleDialogType } from "@bitwarden/angular/services/dialog";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { AppIdService } from "@bitwarden/common/abstractions/appId.service";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
@@ -46,7 +47,8 @@ export class TwoFactorComponent extends BaseTwoFactorComponent {
logService: LogService,
twoFactorService: TwoFactorService,
appIdService: AppIdService,
loginService: LoginService
loginService: LoginService,
private dialogService: DialogServiceAbstraction
) {
super(
authService,
@@ -102,12 +104,11 @@ export class TwoFactorComponent extends BaseTwoFactorComponent {
this.selectedProviderType === TwoFactorProviderType.Email &&
this.popupUtilsService.inPopup(window)
) {
const confirmed = await this.platformUtilsService.showDialog(
this.i18nService.t("popup2faCloseMessage"),
null,
this.i18nService.t("yes"),
this.i18nService.t("no")
);
const confirmed = await this.dialogService.openSimpleDialog({
title: { key: "warning" },
content: { key: "popup2faCloseMessage" },
type: SimpleDialogType.WARNING,
});
if (confirmed) {
this.popupUtilsService.popOut(window);
}

View File

@@ -15,7 +15,7 @@
</header>
<main tabindex="-1">
<app-callout type="warning" title="{{ 'updateMasterPassword' | i18n }}">
{{ "updateMasterPasswordWarning" | i18n }}
{{ masterPasswordWarningText }}
</app-callout>
<app-callout
type="info"
@@ -23,13 +23,35 @@
*ngIf="enforcedPolicyOptions"
>
</app-callout>
<div class="box" *ngIf="requireCurrentPassword">
<div class="box-content">
<div class="box-content-row" appBoxRow>
<div class="box-content-row-flex">
<div class="row-main">
<label for="currentMasterPassword">
{{ "currentMasterPass" | i18n }}
</label>
<input
id="currentMasterPassword"
type="password"
name="CurrentMasterPassword"
class="monospaced"
[(ngModel)]="verification.secret"
required
appInputVerbatim
/>
</div>
</div>
</div>
</div>
</div>
<div class="box">
<div class="box-content">
<div class="box-content-row" appBoxRow>
<div class="box-content-row-flex">
<div class="row-main">
<label for="masterPassword">
{{ "masterPass" | i18n }}
{{ "newMasterPass" | i18n }}
<strong class="sub-label text-{{ color }}" *ngIf="text">
{{ text }}
</strong>
@@ -75,7 +97,7 @@
<div class="box-content">
<div class="box-content-row box-content-row-flex" appBoxRow>
<div class="row-main">
<label for="masterPasswordRetype">{{ "reTypeMasterPass" | i18n }}</label>
<label for="masterPasswordRetype">{{ "confirmNewMasterPass" | i18n }}</label>
<input
id="masterPasswordRetype"
type="{{ showPassword ? 'text' : 'password' }}"

View File

@@ -1,45 +1,9 @@
import { Component } from "@angular/core";
import { UpdateTempPasswordComponent as BaseUpdateTempPasswordComponent } from "@bitwarden/angular/auth/components/update-temp-password.component";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { StateService } from "@bitwarden/common/abstractions/state.service";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction";
@Component({
selector: "app-update-temp-password",
templateUrl: "update-temp-password.component.html",
})
export class UpdateTempPasswordComponent extends BaseUpdateTempPasswordComponent {
constructor(
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
passwordGenerationService: PasswordGenerationServiceAbstraction,
policyService: PolicyService,
cryptoService: CryptoService,
stateService: StateService,
messagingService: MessagingService,
apiService: ApiService,
syncService: SyncService,
logService: LogService
) {
super(
i18nService,
platformUtilsService,
passwordGenerationService,
policyService,
cryptoService,
messagingService,
apiService,
stateService,
syncService,
logService
);
}
}
export class UpdateTempPasswordComponent extends BaseUpdateTempPasswordComponent {}

View File

@@ -1,10 +1,10 @@
import { firstValueFrom } from "rxjs";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums/policy-type";
import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { ThemeType } from "@bitwarden/common/enums/themeType";
import { ThemeType } from "@bitwarden/common/enums";
import { Utils } from "@bitwarden/common/misc/utils";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction";

View File

@@ -1,4 +1,3 @@
import { SearchService } from "@bitwarden/common/abstractions/search.service";
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { StateFactory } from "@bitwarden/common/factories/stateFactory";
@@ -14,7 +13,6 @@ import {
AuthServiceInitOptions,
} from "../../auth/background/service-factories/auth-service.factory";
import { CachedServices } from "../../background/service_factories/factory-options";
import { searchServiceFactory } from "../../background/service_factories/search-service.factory";
import { BrowserApi } from "../../browser/browserApi";
import { Account } from "../../models/account";
import {
@@ -45,14 +43,10 @@ export class CipherContextMenuHandler {
static async create(cachedServices: CachedServices) {
const stateFactory = new StateFactory(GlobalState, Account);
let searchService: SearchService | null = null;
const serviceOptions: AuthServiceInitOptions & CipherServiceInitOptions = {
apiServiceOptions: {
logoutCallback: NOT_IMPLEMENTED,
},
cipherServiceOptions: {
searchServiceFactory: () => searchService,
},
cryptoFunctionServiceOptions: {
win: self,
},
@@ -80,7 +74,6 @@ export class CipherContextMenuHandler {
stateFactory: stateFactory,
},
};
searchService = await searchServiceFactory(cachedServices, serviceOptions);
return new CipherContextMenuHandler(
await MainContextMenuHandler.mv3Create(cachedServices),
await authServiceFactory(cachedServices, serviceOptions),
@@ -153,7 +146,7 @@ export class CipherContextMenuHandler {
const authStatus = await this.authService.getAuthStatus();
await MainContextMenuHandler.removeAll();
if (authStatus !== AuthenticationStatus.Unlocked) {
// Should I pass in the auth status or even have two seperate methods for this
// Should I pass in the auth status or even have two separate methods for this
// on MainContextMenuHandler
await this.mainContextMenuHandler.noAccess();
return;

View File

@@ -1,9 +1,8 @@
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { SearchService } from "@bitwarden/common/abstractions/search.service";
import { TotpService } from "@bitwarden/common/abstractions/totp.service";
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { EventType } from "@bitwarden/common/enums/eventType";
import { EventType } from "@bitwarden/common/enums";
import { StateFactory } from "@bitwarden/common/factories/stateFactory";
import { GlobalState } from "@bitwarden/common/models/domain/global-state";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
@@ -19,7 +18,6 @@ import LockedVaultPendingNotificationsItem from "../../background/models/lockedV
import { eventCollectionServiceFactory } from "../../background/service_factories/event-collection-service.factory";
import { CachedServices } from "../../background/service_factories/factory-options";
import { passwordGenerationServiceFactory } from "../../background/service_factories/password-generation-service.factory";
import { searchServiceFactory } from "../../background/service_factories/search-service.factory";
import { stateServiceFactory } from "../../background/service_factories/state-service.factory";
import { BrowserApi } from "../../browser/browserApi";
import { Account } from "../../models/account";
@@ -63,14 +61,10 @@ export class ContextMenuClickedHandler {
static async mv3Create(cachedServices: CachedServices) {
const stateFactory = new StateFactory(GlobalState, Account);
let searchService: SearchService | null = null;
const serviceOptions: AuthServiceInitOptions & CipherServiceInitOptions = {
apiServiceOptions: {
logoutCallback: NOT_IMPLEMENTED,
},
cipherServiceOptions: {
searchServiceFactory: () => searchService,
},
cryptoFunctionServiceOptions: {
win: self,
},
@@ -98,7 +92,6 @@ export class ContextMenuClickedHandler {
stateFactory: stateFactory,
},
};
searchService = await searchServiceFactory(cachedServices, serviceOptions);
const generatePasswordToClipboardCommand = new GeneratePasswordToClipboardCommand(
await passwordGenerationServiceFactory(cachedServices, serviceOptions),

View File

@@ -31,115 +31,21 @@
/*
MODIFICATIONS FROM ORIGINAL
1. Populate isFirefox
2. Remove isChrome and isSafari since they are not used.
3. Unminify and format to meet Mozilla review requirements.
4. Remove unnecessary input types from getFormElements query selector and limit number of elements returned.
5. Remove fakeTested prop.
6. Rename com.agilebits.* stuff to com.bitwarden.*
7. Remove "some useful globals" on window
8. Add ability to autofill span[data-bwautofill] elements
9. Add new handler, for new command that responds with page details in response callback
1. Populate isFirefox
2. Remove isChrome and isSafari since they are not used.
3. Unminify and format to meet Mozilla review requirements.
4. Remove unnecessary input types from getFormElements query selector and limit number of elements returned.
5. Remove fakeTested prop.
6. Rename com.agilebits.* stuff to com.bitwarden.*
7. Remove "some useful globals" on window
8. Add ability to autofill span[data-bwautofill] elements
9. Add new handler, for new command that responds with page details in response callback
10. Handle sandbox iframe and sandbox rule in CSP
11. Work on array of saved urls instead of just one to determine if we should autofill non-https sites
12. Remove setting of attribute com.browser.browser.userEdited on user-inputs
13. Handle null value URLs in urlNotSecure
14. Implement new HTML element query logic to be able to traverse into ShadowRoot
*/
/*
* `openOrClosedShadowRoot` is only available to WebExtensions.
* We need to use the correct implementation based on browser.
*/
// START MODIFICATION
var getShadowRoot;
if (chrome.dom && chrome.dom.openOrClosedShadowRoot) {
// Chromium 88+
// https://developer.chrome.com/docs/extensions/reference/dom/
getShadowRoot = function (element) {
if (!(element instanceof HTMLElement)) {
return null;
}
return chrome.dom.openOrClosedShadowRoot(element);
};
} else {
getShadowRoot = function (element) {
// `openOrClosedShadowRoot` is currently available for Firefox 63+
// https://developer.mozilla.org/en-US/docs/Web/API/Element/openOrClosedShadowRoot
// Fallback to usual shadowRoot if it doesn't exist, which will only find open ShadowRoots, not closed ones.
// https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot#browser_compatibility
return element.openOrClosedShadowRoot || element.shadowRoot;
};
}
/*
* Returns elements like Document.querySelectorAll does, but traverses the document and shadow
* roots, yielding a visited node only if it passes the predicate in filterCallback.
*/
function queryDocAll(doc, rootEl, filterCallback) {
var accumulatedNodes = [];
// mutates accumulatedNodes
accumulatingQueryDocAll(doc, rootEl, filterCallback, accumulatedNodes);
return accumulatedNodes;
}
function accumulatingQueryDocAll(doc, rootEl, filterCallback, accumulatedNodes) {
var treeWalker = doc.createTreeWalker(rootEl, NodeFilter.SHOW_ELEMENT);
var node;
while (node = treeWalker.nextNode()) {
if (filterCallback(node)) {
accumulatedNodes.push(node);
}
// If node contains a ShadowRoot we want to step into it and also traverse all child nodes inside.
var nodeShadowRoot = getShadowRoot(node);
if (!nodeShadowRoot) {
continue;
}
// recursively traverse into ShadowRoot
accumulatingQueryDocAll(doc, nodeShadowRoot, filterCallback, accumulatedNodes);
}
}
/*
* Returns an element like Document.querySelector does, but traverses the document and shadow
* roots, yielding a visited node only if it passes the predicate in filterCallback.
*/
function queryDoc(doc, rootEl, filterCallback) {
var treeWalker = doc.createTreeWalker(rootEl, NodeFilter.SHOW_ELEMENT);
var node;
while (node = treeWalker.nextNode()) {
if (filterCallback(node)) {
return node;
}
// If node contains a ShadowRoot we want to step into it and also traverse all child nodes inside.
var nodeShadowRoot = getShadowRoot(node);
if (!nodeShadowRoot) {
continue;
}
// recursively traverse into ShadowRoot
var subQueryResult = queryDoc(doc, nodeShadowRoot, filterCallback);
if (subQueryResult) {
return subQueryResult;
}
}
return null;
}
// END MODIFICATION
function collect(document, undefined) {
// START MODIFICATION
var isFirefox = navigator.userAgent.indexOf('Firefox') !== -1 || navigator.userAgent.indexOf('Gecko/') !== -1;
@@ -152,8 +58,8 @@
/**
* For a given element `el`, returns the value of the attribute `attrName`.
* @param {HTMLElement} el
* @param {string} attrName
* @param {HTMLElement} el
* @param {string} attrName
* @returns {string} The value of the attribute
*/
function getElementAttrValue(el, attrName) {
@@ -190,7 +96,7 @@
/**
* Returns the value of the given element.
* @param {HTMLElement} el
* @param {HTMLElement} el
* @returns {any} Value of the element
*/
function getElementValue(el) {
@@ -218,7 +124,7 @@
/**
* If `el` is a `<select>` element, return an array of all of the options' `text` properties.
* @param {HTMLElement} el
* @param {HTMLElement} el
* @returns {string[]} An array of options for the given `<select>` element
*/
function getSelectElementOptions(el) {
@@ -241,7 +147,7 @@
/**
* If `el` is in a data table, get the label in the row directly above it
* @param {HTMLElement} el
* @param {HTMLElement} el
* @returns {string} A string containing the label, or null if not found
*/
function getLabelTop(el) {
@@ -281,7 +187,7 @@
/**
* Get the contents of the elements that are labels for `el`
* @param {HTMLElement} el
* @param {HTMLElement} el
* @returns {string} A string containing all of the `innerText` or `textContent` values for all elements that are labels for `el`
*/
function getLabelTag(el) {
@@ -292,22 +198,12 @@
theLabels = Array.prototype.slice.call(el.labels);
} else {
if (el.id) {
// START MODIFICATION
var elId = JSON.stringify(el.id);
var labelsByReferencedId = queryDocAll(theDoc, theDoc.body, function (node) {
return node.nodeName === 'LABEL' && node.htmlFor === elId;
});
theLabels = theLabels.concat(labelsByReferencedId);
// END MODIFICATION
theLabels = theLabels.concat(Array.prototype.slice.call(
queryDoc(theDoc, 'label[for=' + JSON.stringify(el.id) + ']')));
}
if (el.name) {
// START MODIFICATION
var elName = JSON.stringify(el.name);
docLabel = queryDocAll(theDoc, theDoc.body, function (node) {
return node.nodeName === 'LABEL' && node.htmlFor === elName;
});
// END MODIFICATION
docLabel = queryDoc(theDoc, 'label[for=' + JSON.stringify(el.name) + ']');
for (var labelIndex = 0; labelIndex < docLabel.length; labelIndex++) {
if (-1 === theLabels.indexOf(docLabel[labelIndex])) {
@@ -343,10 +239,10 @@
/**
* Add property `prop` with value `val` to the object `obj`
* @param {object} obj
* @param {string} prop
* @param {any} val
* @param {*} d
* @param {object} obj
* @param {string} prop
* @param {any} val
* @param {*} d
*/
function addProp(obj, prop, val, d) {
if (0 !== d && d === val || null === val || void 0 === val) {
@@ -358,27 +254,34 @@
/**
* Converts the string `s` to lowercase
* @param {string} s
* @param {string} s
* @returns Lowercase string
*/
function toLowerString(s) {
return 'string' === typeof s ? s.toLowerCase() : ('' + s).toLowerCase();
}
// START MODIFICATION
// renamed queryDoc to queryDocAll and moved to top
// END MODIFICATION
/**
* Query the document `doc` for elements matching the selector `selector`
* @param {Document} doc
* @param {string} query
* @returns {HTMLElement[]} An array of elements matching the selector
*/
function queryDoc(doc, query) {
var els = [];
try {
els = doc.querySelectorAll(query);
} catch (e) { }
return els;
}
// end helpers
var theView = theDoc.defaultView ? theDoc.defaultView : window,
passwordRegEx = RegExp('((\\\\b|_|-)pin(\\\\b|_|-)|password|passwort|kennwort|(\\\\b|_|-)passe(\\\\b|_|-)|contraseña|senha|密码|adgangskode|hasło|wachtwoord)', 'i');
// get all the docs
// START MODIFICATION
var formNodes = queryDocAll(theDoc, theDoc.body, function (el) {
return el.nodeName === 'FORM';
});
var theForms = formNodes.map(function (formEl, elIndex) {
// END MODIFICATION
var theForms = Array.prototype.slice.call(queryDoc(theDoc, 'form')).map(function (formEl, elIndex) {
var op = {},
formOpId = '__form__' + elIndex;
@@ -536,12 +439,8 @@
};
// get proper page title. maybe they are using the special meta tag?
// START MODIFICATION
var theTitle = queryDoc(theDoc, theDoc, function (node) {
return node.hasAttribute('data-onepassword-title');
});
// END MODIFICATION
if (theTitle && theTitle.dataset[DISPLAY_TITLE_ATTRIBUE]) {
var theTitle = document.querySelector('[data-onepassword-title]')
if (theTitle && theTitle.dataset[DISPLAY_TITLE_ATTRIBUTE]) {
pageDetails.displayTitle = theTitle.dataset.onepasswordTitle;
}
@@ -553,8 +452,8 @@
/**
* Do the event on the element.
* @param {HTMLElement} kedol The element to do the event on
* @param {string} fonor The event name
* @returns
* @param {string} fonor The event name
* @returns
*/
function doEventOnElement(kedol, fonor) {
var quebo;
@@ -566,7 +465,7 @@
/**
* Clean up the string `s` to remove non-printable characters and whitespace.
* @param {string} s
* @param {string} s
* @returns {string} Clean text
*/
function cleanText(s) {
@@ -578,7 +477,7 @@
/**
* If `el` is a text node, add the node's text to `arr`.
* If `el` is an element node, add the element's `textContent or `innerText` to `arr`.
* @param {string[]} arr An array of `textContent` or `innerText` values
* @param {string[]} arr An array of `textContent` or `innerText` values
* @param {HTMLElement} el The element to push to the array
*/
function checkNodeType(arr, el) {
@@ -612,9 +511,9 @@
/**
* Recursively gather all of the text values from the elements preceding `el` in the DOM
* @param {HTMLElement} el
* @param {HTMLElement} el
* @param {string[]} arr An array of `textContent` or `innerText` values
* @param {number} steps The number of steps to take up the DOM tree
* @param {number} steps The number of steps to take up the DOM tree
*/
function shiftForLeftLabel(el, arr, steps) {
var sib;
@@ -645,7 +544,7 @@
/**
* Determine if the element is visible.
* Visible is define as not having `display: none` or `visibility: hidden`.
* @param {HTMLElement} el
* @param {HTMLElement} el
* @returns {boolean} Returns `true` if the element is visible and `false` otherwise
*/
function isElementVisible(el) {
@@ -656,10 +555,7 @@
// walk the dom tree until we reach the top
for (var elStyle; theEl && theEl !== document;) {
// Calculate the style of the element
// START MODIFICATION
elStyle = el.getComputedStyle && theEl instanceof Element ? el.getComputedStyle(theEl, null) : theEl.style;
// END MODIFICATION
elStyle = el.getComputedStyle ? el.getComputedStyle(theEl, null) : theEl.style;
// If there's no computed style at all, we're done, as we know that it's not hidden
if (!elStyle) {
return true;
@@ -680,7 +576,7 @@
/**
* Determine if the element is "viewable" on the screen.
* "Viewable" is defined as being visible in the DOM and being within the confines of the viewport.
* @param {HTMLElement} el
* @param {HTMLElement} el
* @returns {boolean} Returns `true` if the element is viewable and `false` otherwise
*/
function isElementViewable(el) {
@@ -719,7 +615,7 @@
// If the right side of the bounding rectangle is outside the viewport, the x coordinate of the center point is the window width (minus offset) divided by 2.
// If the right side of the bounding rectangle is inside the viewport, the x coordinate of the center point is the width of the bounding rectangle divided by 2.
// If the bottom of the bounding rectangle is outside the viewport, the y coordinate of the center point is the window height (minus offset) divided by 2.
// If the bottom side of the bounding rectangle is inside the viewport, the y coordinate of the center point is the height of the bounding rectangle divided by
// If the bottom side of the bounding rectangle is inside the viewport, the y coordinate of the center point is the height of the bounding rectangle divided by
// We then use elementFromPoint to find the element at that point.
for (var pointEl = el.ownerDocument.elementFromPoint(leftOffset + (rect.right > window.innerWidth ? (window.innerWidth - leftOffset) / 2 : rect.width / 2), topOffset + (rect.bottom > window.innerHeight ? (window.innerHeight - topOffset) / 2 : rect.height / 2)); pointEl && pointEl !== el && pointEl !== document;) {
// If the element we found is a label, and the element we're checking has labels
@@ -741,7 +637,7 @@
/**
* Retrieve the element from the document with the specified `opid` property
* @param {number} opId
* @param {number} opId
* @returns {HTMLElement} The element with the specified `opiId`, or `null` if no such element exists
*/
function getElementForOPID(opId) {
@@ -769,28 +665,6 @@
}
}
var ignoredInputTypes = {
hidden: true,
submit: true,
reset: true,
button: true,
image: true,
file: true,
};
/*
* inputEl MUST BE an instanceof HTMLInputElement, else inputEl.type.toLowerCase will throw an error
*/
function isRelevantInputField(inputEl) {
if (inputEl.hasAttribute('data-bwignore')) {
return false;
}
const isIgnoredInputType = ignoredInputTypes.hasOwnProperty(inputEl.type.toLowerCase());
return !isIgnoredInputType;
}
/**
* Query `theDoc` for form elements that we can use for autofill, ranked by importance and limited by `limit`
* @param {Document} theDoc The Document to query
@@ -799,19 +673,13 @@
*/
function getFormElements(theDoc, limit) {
// START MODIFICATION
var els = queryDocAll(theDoc, theDoc.body, function (el) {
switch (el.nodeName) {
case 'SELECT':
return true;
case 'SPAN':
return el.hasAttribute('data-bwautofill');
case 'INPUT':
return isRelevantInputField(el);
default:
return false;
}
});
var els = [];
try {
var elsList = theDoc.querySelectorAll('input:not([type="hidden"]):not([type="submit"]):not([type="reset"])' +
':not([type="button"]):not([type="image"]):not([type="file"]):not([data-bwignore]), select, ' +
'span[data-bwautofill]');
els = Array.prototype.slice.call(elsList);
} catch (e) { }
if (!limit || els.length <= limit) {
return els;
@@ -841,12 +709,12 @@
}
return returnEls;
// END MODIFICATION
}
// END MODIFICATION
/**
* Focus the element `el` and optionally restore its original value
* @param {HTMLElement} el
* @param {HTMLElement} el
* @param {boolean} setVal Set the value of the element to its original value
*/
function focusElement(el, setVal) {
@@ -871,12 +739,6 @@
var markTheFilling = true,
animateTheFilling = true;
function queryPasswordInputs() {
return queryDocAll(document, document.body, function (el) {
return el.nodeName === 'INPUT' && el.type.toLowerCase() === 'password';
})
}
// Check if URL is not secure when the original saved one was
function urlNotSecure(savedURLs) {
var passwordInputs = null;
@@ -884,7 +746,7 @@
return false;
}
return savedURLs.some(url => url?.indexOf('https://') === 0) && 'http:' === document.location.protocol && (passwordInputs = queryPasswordInputs(),
return savedURLs.some(url => url?.indexOf('https://') === 0) && 'http:' === document.location.protocol && (passwordInputs = document.querySelectorAll('input[type=password]'),
0 < passwordInputs.length && (confirmResult = confirm('Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page.\n\nDo you still wish to fill this login?'),
0 == confirmResult)) ? true : false;
}
@@ -1021,8 +883,8 @@
/**
* Find all elements matching `query` and fill them using the value `op` from the fill script
* @param {string} query
* @param {string} op
* @param {string} query
* @param {string} op
* @returns {HTMLElement}
*/
function doFillByQuery(query, op) {
@@ -1035,8 +897,8 @@
/**
* Assign `valueToSet` to all elements in the DOM that match `query`.
* @param {string} query
* @param {string} valueToSet
* @param {string} query
* @param {string} valueToSet
* @returns {Array} Array of elements that were set.
*/
function doSimpleSetByQuery(query, valueToSet) {
@@ -1050,8 +912,8 @@
/**
* Do a a click and focus on the element with the given `opId`.
* @param {number} opId
* @returns
* @param {number} opId
* @returns
*/
function doFocusByOpId(opId) {
var el = getElementByOpId(opId)
@@ -1065,8 +927,8 @@
/**
* Do a click on the element with the given `opId`.
* @param {number} opId
* @returns
* @param {number} opId
* @returns
*/
function doClickByOpId(opId) {
var el = getElementByOpId(opId);
@@ -1074,9 +936,9 @@
}
/**
* Do a `click` and `focus` on all elements that match the query.
* @param {string} query
* @returns
* Do a `click` and `focus` on all elements that match the query.
* @param {string} query
* @returns
*/
function doClickByQuery(query) {
query = selectAllFromDoc(query);
@@ -1099,8 +961,8 @@
/**
* Fll an element `el` using the value `op` from the fill script
* @param {HTMLElement} el
* @param {string} op
* @param {HTMLElement} el
* @param {string} op
*/
function fillTheElement(el, op) {
var shouldCheck;
@@ -1132,7 +994,7 @@
/**
* Do all the fill operations needed on the element `el`.
* @param {HTMLElement} el
* @param {HTMLElement} el
* @param {*} afterValSetFunc The function to perform after the operations are complete.
*/
function doAllFillOperations(el, afterValSetFunc) {
@@ -1156,8 +1018,8 @@
/**
* Normalize the event based on API support
* @param {HTMLElement} el
* @param {string} eventName
* @param {HTMLElement} el
* @param {string} eventName
* @returns {Event} A normalized event
*/
function normalizeEvent(el, eventName) {
@@ -1184,7 +1046,7 @@
/**
* Simulate the entry of a value into an element.
* Clicks the element, focuses it, and then fires a keydown, keypress, and keyup event.
* @param {HTMLElement} el
* @param {HTMLElement} el
*/
function setValueForElement(el) {
var valueToSet = el.value;
@@ -1199,7 +1061,7 @@
/**
* Simulate the entry of a value into an element by using events.
* Dispatches a keydown, keypress, and keyup event, then fires the `input` and `change` events before removing focus.
* @param {HTMLElement} el
* @param {HTMLElement} el
*/
function setValueForElementByEvent(el) {
var valueToSet = el.value,
@@ -1219,7 +1081,7 @@
/**
* Click on an element `el`
* @param {HTMLElement} el
* @param {HTMLElement} el
* @returns {boolean} Returns true if the element was clicked and false if it was not able to be clicked
*/
function clickElement(el) {
@@ -1236,12 +1098,9 @@
*/
function getAllFields() {
var r = RegExp('((\\\\b|_|-)pin(\\\\b|_|-)|password|passwort|kennwort|passe|contraseña|senha|密码|adgangskode|hasło|wachtwoord)', 'i');
return queryDocAll(document, document.body, function (el) {
return el.nodeName === 'INPUT' &&
el.type.toLowerCase() === 'text' &&
el.value &&
r.test(el.value);
});
return Array.prototype.slice.call(selectAllFromDoc("input[type='text']")).filter(function (el) {
return el.value && r.test(el.value);
}, this);
}
/**
@@ -1257,7 +1116,7 @@
/**
* Determine if we can apply styling to `el` to indicate that it was filled.
* @param {HTMLElement} el
* @param {HTMLElement} el
* @returns {boolean} Returns true if we can see the element to apply styling.
*/
function canSeeElementToStyle(el) {
@@ -1266,9 +1125,7 @@
a: {
currentEl = el;
for (var owner = el.ownerDocument, owner = owner ? owner.defaultView : {}, theStyle; currentEl && currentEl !== document;) {
// START MODIFICATION
theStyle = owner.getComputedStyle && currentEl instanceof Element ? owner.getComputedStyle(currentEl, null) : currentEl.style;
// END MODIFICATION
theStyle = owner.getComputedStyle ? owner.getComputedStyle(currentEl, null) : currentEl.style;
if (!theStyle) {
currentEl = true;
break a;
@@ -1292,7 +1149,7 @@
/**
* Find the element for the given `opid`.
* @param {number} theOpId
* @param {number} theOpId
* @returns {HTMLElement} The element for the given `opid`, or `null` if not found.
*/
function getElementByOpId(theOpId) {
@@ -1302,19 +1159,12 @@
}
try {
// START MODIFICATION
var filteredElements = queryDocAll(document, document.body, function (el) {
switch (el.nodeName) {
case 'INPUT':
case 'SELECT':
case 'BUTTON':
return el.opid === theOpId;
case 'SPAN':
return el.hasAttribute('data-bwautofill') && el.opid === theOpId;
}
return false;
});
var elements = Array.prototype.slice.call(selectAllFromDoc('input, select, button, ' +
'span[data-bwautofill]'));
// END MODIFICATION
var filteredElements = elements.filter(function (o) {
return o.opid == theOpId;
});
if (0 < filteredElements.length) {
theElement = filteredElements[0],
1 < filteredElements.length && console.warn('More than one element found with opid ' + theOpId);
@@ -1331,20 +1181,20 @@
/**
* Helper for doc.querySelectorAll
* @param {string} theSelector
* @returns
* @param {string} theSelector
* @returns
*/
function selectAllFromDoc(theSelector) {
// START MODIFICATION
return queryDocAll(document, document, function(node) {
return node.matches(theSelector);
});
// END MODIFICATION
var d = document, elements = [];
try {
elements = d.querySelectorAll(theSelector);
} catch (e) { }
return elements;
}
/**
* Focus an element and optionally re-set its value after focusing
* @param {HTMLElement} el
* @param {HTMLElement} el
* @param {boolean} setValue Re-set the value after focusing
*/
function doFocusElement(el, setValue) {

View File

@@ -1,15 +1,44 @@
import AddLoginRuntimeMessage from "../../background/models/addLoginRuntimeMessage";
import ChangePasswordRuntimeMessage from "../../background/models/changePasswordRuntimeMessage";
import AutofillField from "../models/autofill-field";
import { WatchedForm } from "../models/watched-form";
import { FormData } from "../services/abstractions/autofill.service";
interface HTMLElementWithFormOpId extends HTMLElement {
formOpId: string;
}
/**
* @fileoverview This file contains the code for the Bitwarden Notification Bar content script.
* The notification bar is used to notify logged in users that they can
* save a new login, change a existing password on a password change screen,
* or update an existing login after detecting a different password on login.
*
* Note: content scripts are reloaded on non-SPA page change.
*/
/*
* Run content script when the DOM is fully loaded
*
* The DOMContentLoaded event fires when the HTML document has been completely parsed,
* and all deferred scripts (<script defer src="…"> and <script type="module">) have
* downloaded and executed. It doesn't wait for other things like images, subframes,
* and async scripts to finish loading.
* https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event
*/
document.addEventListener("DOMContentLoaded", (event) => {
// Do not show the notification bar on the Bitwarden vault
// because they can add logins and change passwords there
if (window.location.hostname.endsWith("vault.bitwarden.com")) {
return;
}
const pageDetails: any[] = [];
const formData: any[] = [];
// Initialize required variables and set default values
const watchedForms: WatchedForm[] = [];
let barType: string = null;
let pageHref: string = null;
// Provides the ability to watch for changes being made to the DOM tree.
let observer: MutationObserver = null;
const observeIgnoredElements = new Set([
"a",
@@ -24,9 +53,10 @@ document.addEventListener("DOMContentLoaded", (event) => {
"em",
"hr",
]);
let domObservationCollectTimeout: number = null;
let collectIfNeededTimeout: number = null;
let observeDomTimeout: number = null;
let domObservationCollectTimeoutId: number = null;
let collectPageDetailsTimeoutId: number = null;
let handlePageChangeTimeoutId: number = null;
const inIframe = isInIframe();
const cancelButtonNames = new Set(["cancel", "close", "back"]);
const logInButtonNames = new Set([
@@ -43,11 +73,16 @@ document.addEventListener("DOMContentLoaded", (event) => {
"update password",
"change password",
"change",
"save",
]);
const changePasswordButtonContainsNames = new Set(["pass", "change", "contras", "senha"]);
// These are preferences for whether to show the notification bar based on the user's settings
// and they are set in the Settings > Options page in the browser extension.
let disabledAddLoginNotification = false;
let disabledChangedPasswordNotification = false;
// Look up the active user id from storage
const activeUserIdKey = "activeUserId";
let activeUserId: string;
chrome.storage.local.get(activeUserIdKey, (obj: any) => {
@@ -57,32 +92,59 @@ document.addEventListener("DOMContentLoaded", (event) => {
activeUserId = obj[activeUserIdKey];
});
// Look up the user's settings from storage
chrome.storage.local.get(activeUserId, (obj: any) => {
if (obj?.[activeUserId] == null) {
return;
}
const domains = obj[activeUserId].settings.neverDomains;
// eslint-disable-next-line
if (domains != null && domains.hasOwnProperty(window.location.hostname)) {
const userSettings = obj[activeUserId].settings;
// NeverDomains is a dictionary of domains that the user has chosen to never
// show the notification bar on (for login detail collection or password change).
// It is managed in the Settings > Excluded Domains page in the browser extension.
// Example: '{"bitwarden.com":null}'
const excludedDomainsDict = userSettings.neverDomains;
if (
excludedDomainsDict != null &&
// eslint-disable-next-line
excludedDomainsDict.hasOwnProperty(window.location.hostname)
) {
return;
}
disabledAddLoginNotification = obj[activeUserId].settings.disableAddLoginNotification;
disabledChangedPasswordNotification =
obj[activeUserId].settings.disableChangedPasswordNotification;
// Set local disabled preferences
disabledAddLoginNotification = userSettings.disableAddLoginNotification;
disabledChangedPasswordNotification = userSettings.disableChangedPasswordNotification;
if (!disabledAddLoginNotification || !disabledChangedPasswordNotification) {
collectIfNeededWithTimeout();
// If the user has not disabled both notifications, then handle the initial page change (null -> actual page)
handlePageChange();
}
});
// Message Processing
// Listen for messages from the background script
// Note: onMessage events are fired when a message is sent from either an extension process
// (by runtime.sendMessage) or a content script (by tabs.sendMessage).
// https://developer.chrome.com/docs/extensions/reference/runtime/#event-onMessage
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
processMessages(msg, sendResponse);
});
/**
* Processes messages received from the background script via the `chrome.runtime.onMessage` event.
* @param {Object} msg - The received message.
* @param {Function} sendResponse - The function used to send a response back to the background script.
* @returns {boolean} - Returns `true` if a response was sent, `false` otherwise.
*/
function processMessages(msg: any, sendResponse: (response?: any) => void) {
if (msg.command === "openNotificationBar") {
// `notification.background.ts : doNotificationQueueCheck(...)` sends
// a message to the content script to open the notification bar
// on Login Add or Password Change
if (inIframe) {
return;
}
@@ -90,6 +152,10 @@ document.addEventListener("DOMContentLoaded", (event) => {
sendResponse();
return true;
} else if (msg.command === "closeNotificationBar") {
// The following methods send a message to the content script to close the notification bar:
// `bar.js : closeButton click` > `notification.background.ts : processMessage(...)`
// `notification.background.ts : saveNever(...)`
// `notification.background.ts : saveOrUpdateCredentials(...)`
if (inIframe) {
return;
}
@@ -97,6 +163,8 @@ document.addEventListener("DOMContentLoaded", (event) => {
sendResponse();
return true;
} else if (msg.command === "adjustNotificationBar") {
// `bar.js : window resize` > `notification.background.ts : processMessage(...)`
// sends a message to the content script to adjust the notification bar
if (inIframe) {
return;
}
@@ -104,52 +172,79 @@ document.addEventListener("DOMContentLoaded", (event) => {
sendResponse();
return true;
} else if (msg.command === "notificationBarPageDetails") {
pageDetails.push(msg.data.details);
// Note: we deliberately do not check for inIframe here because a lot of websites
// embed their login forms into iframes
// Ex: icloud.com uses a login form in an iframe from apple.com
// See method collectPageDetails() for full call itinerary that leads to this message
watchForms(msg.data.forms);
sendResponse();
return true;
}
}
// End Message Processing
function isInIframe() {
try {
return window.self !== window.top;
} catch {
return true;
}
}
/**
* Observe the DOM for changes and collect page details if forms are added to the page
*/
function observeDom() {
const bodies = document.querySelectorAll("body");
if (bodies && bodies.length > 0) {
observer = new MutationObserver((mutations) => {
if (mutations == null || mutations.length === 0 || pageHref !== window.location.href) {
observer = new MutationObserver((mutations: MutationRecord[]) => {
// If mutation observer detects a change in the page URL, collect page details
// which will reset the observer and start watching for new forms on the new page
if (pageHref !== window.location.href) {
handlePageChange();
return;
}
let doCollect = false;
// If mutations are not found, return
if (mutations == null || mutations.length === 0) {
return;
}
let doCollectPageDetails = false;
for (let i = 0; i < mutations.length; i++) {
const mutation = mutations[i];
const mutation: MutationRecord = mutations[i];
// If there are no added nodes, continue to next mutation
if (mutation.addedNodes == null || mutation.addedNodes.length === 0) {
continue;
}
for (let j = 0; j < mutation.addedNodes.length; j++) {
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement
const addedNode: any = mutation.addedNodes[j];
// If the added node is null, continue to next added node
if (addedNode == null) {
continue;
}
// Get the lowercase tag name of the added node (if it exists)
const tagName = addedNode.tagName != null ? addedNode.tagName.toLowerCase() : null;
// If tag name exists & is a form &
// (either the dataset is null or it does not have the custom data attribute: "data-bitwarden-watching"),
// then collect page details and break
// Note: The dataset read-only property of the HTMLElement interface provides
// read/write access to custom data attributes (data-*) on elements
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset
if (
tagName != null &&
tagName === "form" &&
(addedNode.dataset == null || !addedNode.dataset.bitwardenWatching)
) {
doCollect = true;
doCollectPageDetails = true;
break;
}
// If tag name exists & is in the observeIgnoredElements set
// or if the added node does not have the querySelectorAll method, continue to next added node
// Note: querySelectorAll(...) exists on the Element & Document interfaces
// It doesn't exist for nodes that are not elements, such as text nodes
// Text Node examples: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeName#example
if (
(tagName != null && observeIgnoredElements.has(tagName)) ||
addedNode.querySelectorAll == null
@@ -157,140 +252,249 @@ document.addEventListener("DOMContentLoaded", (event) => {
continue;
}
// If the added node has any descendent form elements that are not yet being watched, collect page details and break
const forms = addedNode.querySelectorAll("form:not([data-bitwarden-watching])");
if (forms != null && forms.length > 0) {
doCollect = true;
doCollectPageDetails = true;
break;
}
}
if (doCollect) {
if (doCollectPageDetails) {
break;
}
}
if (doCollect) {
if (domObservationCollectTimeout != null) {
window.clearTimeout(domObservationCollectTimeout);
// If page details need to be collected, clear any existing timeout and schedule a new one
if (doCollectPageDetails) {
if (domObservationCollectTimeoutId != null) {
window.clearTimeout(domObservationCollectTimeoutId);
domObservationCollectTimeoutId = null;
}
domObservationCollectTimeout = window.setTimeout(collect, 1000);
// The timeout is used to avoid collecting page details too often on page mutation while also
// giving the DOM time to settle down after a change (ex: multi-part forms being rendered)
domObservationCollectTimeoutId = window.setTimeout(collectPageDetails, 1000);
}
});
// Watch all mutations to the body element and all of its children & descendants
observer.observe(bodies[0], { childList: true, subtree: true });
}
}
function collectIfNeededWithTimeout() {
if (collectIfNeededTimeout != null) {
window.clearTimeout(collectIfNeededTimeout);
}
collectIfNeededTimeout = window.setTimeout(collectIfNeeded, 1000);
}
function collectIfNeeded() {
/**
* Handles initial page load and page changes
* 3 ways this method is called:
*
* (1) On initial content script load
*
* (2) On page change (detected by observer)
*
* (3) On after scheduled delay setup in `scheduleHandlePageChange()
*
* On page change, we update the page href, empty the watched forms array, call collectPageDetails (w/ 1 second timeout), and reset the observer
*/
function handlePageChange() {
// On first load the content script or any time the page changes, we need to collect the page details and setup the mutation observer
if (pageHref !== window.location.href) {
// update href
pageHref = window.location.href;
// Empty watched forms so it doesn't carry over between SPA page changes
// This allows formOpIds to be unique for each page so that we can
// associate submit buttons with their respective forms in the getSubmitButton logic.
watchedForms.length = 0;
// collect the page details after a timeout
// The timeout is used to allow more time for the page to load before collecting the page details
// as there are some cases where SPAs do not load the entire page on initial load, so we need to wait
if (collectPageDetailsTimeoutId != null) {
window.clearTimeout(collectPageDetailsTimeoutId);
collectPageDetailsTimeoutId = null;
}
collectPageDetailsTimeoutId = window.setTimeout(collectPageDetails, 1000);
if (observer) {
// reset existing DOM mutation observer so it can listen for changes to the new page body
observer.disconnect();
observer = null;
}
collect();
if (observeDomTimeout != null) {
window.clearTimeout(observeDomTimeout);
}
observeDomTimeout = window.setTimeout(observeDom, 1000);
// On first load or page change, start observing the DOM as early as possible
// to avoid missing any forms that are added after the page loads
observeDom();
}
if (collectIfNeededTimeout != null) {
window.clearTimeout(collectIfNeededTimeout);
}
collectIfNeededTimeout = window.setTimeout(collectIfNeeded, 1000);
// This is a safeguard in case the observer misses a SPA page change.
scheduleHandlePageChange();
}
function collect() {
/**
* Set up a timeout to call handlePageChange after 1 second
*/
function scheduleHandlePageChange() {
// Check again in 1 second (but clear any existing timeout first)
if (handlePageChangeTimeoutId != null) {
window.clearTimeout(handlePageChangeTimeoutId);
handlePageChangeTimeoutId = null;
}
handlePageChangeTimeoutId = window.setTimeout(handlePageChange, 1000);
}
/** *
* Tell the background script to collect the page details.
*
* (1) Sends a message with command `bgCollectPageDetails` to `runtime.background.ts : processMessage(...)`
*
* (2) `runtime.background.ts : processMessage(...)` calls
* `main.background.ts : collectPageDetailsForContentScript`
*
* (3) `main.background.ts : collectPageDetailsForContentScript`
* sends a message with command `collectPageDetails` to the `autofill.js` content script
*
* (4) `autofill.js` content script runs a `collect(document)` method.
* The result is sent via message with command `collectPageDetailsResponse` to `notification.background.ts : processMessage(...)`
*
* (5) `notification.background.ts : processMessage(...)` gathers forms with password fields and passes them and the page details
* via message with command `notificationBarPageDetails` back to the `processMessages` method in this content script.
*
* */
function collectPageDetails() {
sendPlatformMessage({
command: "bgCollectPageDetails",
sender: "notificationBar",
});
}
function watchForms(forms: any[]) {
// End Page Detail Collection Methods
// Form Detection and Submission Handling
/**
* Iterates through the given array of forms and adds an event listener to each form.
* The purpose of the event listener is to detect changes in form data and store the changes.
*
* Note: The forms were gathered in the `notification.background.ts : processMessage(...)`
* method with command `collectPageDetailsResponse` by the `autofillService.getFormsWithPasswordFields(...)` method
* and passed to the `processMessages` method in this content script.
*
* @param {FormData[]} forms - The array of forms to be watched.
*/
function watchForms(forms: FormData[]) {
// If there are no forms, return
if (forms == null || forms.length === 0) {
return;
}
forms.forEach((f: any) => {
forms.forEach((f: FormData) => {
// Get the form element by id
const formId: string = f.form != null ? f.form.htmlID : null;
let formEl: HTMLFormElement = null;
if (formId != null && formId !== "") {
formEl = document.getElementById(formId) as HTMLFormElement;
}
// If the form could not be retrieved by its HTML ID, retrieve it by its index pulled from the opid
if (formEl == null) {
// opid stands for OnePassword ID - uniquely ID's an element on a page
// and is generated in `autofill.js`
// Each form has an opid and each element has an opid and its parent form opid
const index = parseInt(f.form.opid.split("__")[2], null);
formEl = document.getElementsByTagName("form")[index];
}
// If the form element exists and is not yet being watched, start watching it and set it as watched
if (formEl != null && formEl.dataset.bitwardenWatching !== "1") {
const formDataObj: any = {
const watchedForm: WatchedForm = {
data: f,
formEl: formEl,
usernameEl: null,
passwordEl: null,
passwordEls: null,
};
locateFields(formDataObj);
formData.push(formDataObj);
listen(formEl);
// Locate the username and password fields
locateFields(watchedForm);
// Add the form data to the array of watched forms
watchedForms.push(watchedForm);
// Add an event listener to the form
listenToForm(formEl);
// Set the form as watched
formEl.dataset.bitwardenWatching = "1";
}
});
}
function listen(form: HTMLFormElement) {
function listenToForm(form: HTMLFormElement) {
// Remove any existing event listeners and re-add them
// for form submission and submit button click
form.removeEventListener("submit", formSubmitted, false);
form.addEventListener("submit", formSubmitted, false);
const submitButton = getSubmitButton(form, logInButtonNames);
findAndListenToSubmitButton(form);
}
function findAndListenToSubmitButton(form: HTMLFormElement) {
// Use login button names and change password names since we don't
// know what type of form we are watching
const submitButton = getSubmitButton(
form,
unionSets(logInButtonNames, changePasswordButtonNames)
);
if (submitButton != null) {
submitButton.removeEventListener("click", formSubmitted, false);
submitButton.addEventListener("click", formSubmitted, false);
// Associate the form opid with the submit button so we can find the form on submit.
(submitButton as HTMLElementWithFormOpId).formOpId = form.opid;
}
}
function locateFields(formDataObj: any) {
/**
* Locate the fields within a form element given form data.
* @param {Object} watchedForm - The object containing form data and the form element to search within.
*/
function locateFields(watchedForm: WatchedForm) {
// Get all input elements
const inputs = Array.from(document.getElementsByTagName("input"));
formDataObj.usernameEl = locateField(formDataObj.formEl, formDataObj.data.username, inputs);
if (formDataObj.usernameEl != null && formDataObj.data.password != null) {
formDataObj.passwordEl = locatePassword(
formDataObj.formEl,
formDataObj.data.password,
// Locate the username field
watchedForm.usernameEl = locateField(watchedForm.formEl, watchedForm.data.username, inputs);
// if we found a username field, try to locate a single password field
if (watchedForm.usernameEl != null && watchedForm.data.password != null) {
// This is most likely a login or create account form b/c we have a username and password
watchedForm.passwordEl = locatePassword(
watchedForm.formEl,
watchedForm.data.password,
inputs,
true
true // Only do fallback if we have expect to find a single password field
);
} else if (formDataObj.data.passwords != null) {
formDataObj.passwordEls = [];
formDataObj.data.passwords.forEach((pData: any) => {
const el = locatePassword(formDataObj.formEl, pData, inputs, false);
if (el != null) {
formDataObj.passwordEls.push(el);
} else if (watchedForm.data.passwords != null) {
// if we didn't find a username field, try to locate multiple password fields
// This is most likely a change password form b/c we have multiple password fields
watchedForm.passwordEls = [];
watchedForm.data.passwords.forEach((passwordData: AutofillField) => {
// Note: do not do fallback here b/c we expect to find multiple password fields
// and form.querySelector always returns the first element it finds
const passwordEl = locatePassword(watchedForm.formEl, passwordData, inputs, false);
if (passwordEl != null) {
watchedForm.passwordEls.push(passwordEl);
}
});
if (formDataObj.passwordEls.length === 0) {
formDataObj.passwordEls = null;
if (watchedForm.passwordEls.length === 0) {
watchedForm.passwordEls = null;
}
}
}
function locatePassword(
form: HTMLFormElement,
passwordData: any,
passwordData: AutofillField,
inputs: HTMLInputElement[],
doLastFallback: boolean
) {
): HTMLInputElement {
let el = locateField(form, passwordData, inputs);
if (el != null && el.type !== "password") {
el = null;
@@ -301,10 +505,23 @@ document.addEventListener("DOMContentLoaded", (event) => {
return el;
}
function locateField(form: HTMLFormElement, fieldData: any, inputs: HTMLInputElement[]) {
/**
* Locate a field within a form element given field data.
* @param {Object} form - The form element to search within.
* @param {Object} fieldData - The field data to search for.
* @param {Object[]} inputs - The array of input elements to search within.
* @returns {Object} The located field element.
*/
function locateField(
form: HTMLFormElement,
fieldData: AutofillField,
inputs: HTMLInputElement[]
): HTMLInputElement | null {
// If we have no field data, we cannot locate the field
if (fieldData == null) {
return;
}
// Try to locate the field by its HTML ID, by its HTML name, or finally by its element number
let el: HTMLInputElement = null;
if (fieldData.htmlID != null && fieldData.htmlID !== "") {
try {
@@ -322,12 +539,26 @@ document.addEventListener("DOMContentLoaded", (event) => {
return el;
}
/*
* Event handler for form submission (submit button click or form submit)
*/
function formSubmitted(e: Event) {
let form: HTMLFormElement = null;
// If the event is a click event, we need to find the closest form element
let clickedElement: HTMLElement = null;
if (e.type === "click") {
form = (e.target as HTMLElement).closest("form");
clickedElement = e.target as HTMLElement;
// Set a flag on the clicked element so we don't set it as a submit button again
if (clickedElement?.dataset?.bitwardenClicked !== "1") {
clickedElement.dataset.bitwardenClicked = "1";
}
form = clickedElement.closest("form");
// If we didn't find a form element, check if the click was within a modal
if (form == null) {
const parentModal = (e.target as HTMLElement).closest("div.modal");
const parentModal = clickedElement.closest("div.modal");
// If we found a modal, check if it has a single form element
if (parentModal != null) {
const modalForms = parentModal.querySelectorAll("form");
if (modalForms.length === 1) {
@@ -335,75 +566,120 @@ document.addEventListener("DOMContentLoaded", (event) => {
}
}
}
// see if the event target is a submit button with a formOpId
const formOpId = (clickedElement as HTMLElementWithFormOpId).formOpId;
if (form == null && formOpId != null) {
// Find form in watched forms array via form op id
form = watchedForms.find((wf: WatchedForm) => wf.formEl.opid === formOpId).formEl;
}
} else {
// If the event is a submit event, we can get the form element from the event target
form = e.target as HTMLFormElement;
}
// if we didn't find a form element or we've already processed this form, return
if (form == null || form.dataset.bitwardenProcessed === "1") {
return;
}
for (let i = 0; i < formData.length; i++) {
if (formData[i].formEl !== form) {
// Find the form in the watched forms array
for (let i = 0; i < watchedForms.length; i++) {
if (watchedForms[i].formEl !== form) {
continue;
}
const disabledBoth = disabledChangedPasswordNotification && disabledAddLoginNotification;
if (!disabledBoth && formData[i].usernameEl != null && formData[i].passwordEl != null) {
// if user has not disabled both notifications and we have a username and password field,
if (
!disabledBoth &&
watchedForms[i].usernameEl != null &&
watchedForms[i].passwordEl != null
) {
// Create a login object from the form data
const login: AddLoginRuntimeMessage = {
username: formData[i].usernameEl.value,
password: formData[i].passwordEl.value,
username: watchedForms[i].usernameEl.value,
password: watchedForms[i].passwordEl.value,
url: document.URL,
};
if (
login.username != null &&
login.username !== "" &&
login.password != null &&
login.password !== ""
) {
// if we have values for username and password, send a message to the background script to add the login
const userNamePopulated = login.username != null && login.username !== "";
const passwordPopulated = login.password != null && login.password !== "";
if (userNamePopulated && passwordPopulated) {
processedForm(form);
sendPlatformMessage({
command: "bgAddLogin",
login: login,
});
break;
} else if (
userNamePopulated &&
!passwordPopulated &&
clickedElement !== null &&
!isElementVisible(clickedElement)
) {
// Likely a multi step login form with password missing and next button no longer visible
// Remove click listener from previous "submit" button (next button)
clickedElement.removeEventListener("click", formSubmitted);
findAndListenToSubmitButton(form);
}
}
if (!disabledChangedPasswordNotification && formData[i].passwordEls != null) {
const passwords: string[] = formData[i].passwordEls
// if user has not disabled the password changed notification and we have multiple password fields,
// then check if the user has changed their password
if (!disabledChangedPasswordNotification && watchedForms[i].passwordEls != null) {
// Get the values of the password fields
const passwords: string[] = watchedForms[i].passwordEls
.filter((el: HTMLInputElement) => el.value != null && el.value !== "")
.map((el: HTMLInputElement) => el.value);
let curPass: string = null;
let newPass: string = null;
let newPassOnly = false;
if (formData[i].passwordEls.length === 3 && passwords.length === 3) {
if (watchedForms[i].passwordEls.length === 3 && passwords.length === 3) {
// we have 3 password fields and all 3 have values
// Assume second field is new password.
newPass = passwords[1];
if (passwords[0] !== newPass && newPass === passwords[2]) {
// first field is the current password, the second field is the new password, and the third field is the new password confirmation
curPass = passwords[0];
} else if (newPass !== passwords[2] && passwords[0] === newPass) {
// first field is the new password, second field is the new password confirmation, and third field is the current password
curPass = passwords[2];
}
} else if (formData[i].passwordEls.length === 2 && passwords.length === 2) {
} else if (watchedForms[i].passwordEls.length === 2 && passwords.length === 2) {
// we have 2 password fields and both have values
if (passwords[0] === passwords[1]) {
// both fields have the same value, assume this is a new password
newPassOnly = true;
newPass = passwords[0];
curPass = null;
} else {
// both fields have different values
// Check if the submit button contains any of the change password button names as a safeguard
const buttonText = getButtonText(getSubmitButton(form, changePasswordButtonNames));
const matches = Array.from(changePasswordButtonContainsNames).filter(
(n) => buttonText.indexOf(n) > -1
);
if (matches.length > 0) {
// If there is a change password button, then
// assume first field is current password and second field is new password
curPass = passwords[0];
newPass = passwords[1];
}
}
}
// if we have a new password and a current password or we only have a new password
if ((newPass != null && curPass != null) || (newPassOnly && newPass != null)) {
// Flag the form as processed so we don't process it again
processedForm(form);
// Send a message to the `notification.background.ts` background script to notify the user that their password has changed
// which eventually calls the `processMessage(...)` method in this script with command `openNotificationBar`
const changePasswordRuntimeMessage: ChangePasswordRuntimeMessage = {
newPassword: newPass,
currentPassword: curPass,
@@ -419,25 +695,46 @@ document.addEventListener("DOMContentLoaded", (event) => {
}
}
function getSubmitButton(wrappingEl: HTMLElement, buttonNames: Set<string>) {
/**
* Gets a submit button element from a form or enclosing element
* @param wrappingEl - the form or enclosing element
* @param buttonNames - login button names to match against
* @returns the submit button element
*/
function getSubmitButton(wrappingEl: HTMLElement, buttonNames: Set<string>): HTMLElement {
// If wrapping element doesn't exist we can't get a submit button
if (wrappingEl == null) {
return null;
}
const wrappingElIsForm = wrappingEl.tagName.toLowerCase() === "form";
let submitButton = wrappingEl.querySelector(
'input[type="submit"], input[type="image"], ' + 'button[type="submit"]'
) as HTMLElement;
// query for submit button
const possibleSubmitBtnSelectors = [
'input[type="submit"]',
'input[type="image"]',
'button[type="submit"]',
];
const submitBtnSelector = possibleSubmitBtnSelectors
.map((btnSelector) => `${btnSelector}:not([data-bitwarden-clicked])`)
.join(", ");
let submitButton = wrappingEl.querySelector(submitBtnSelector) as HTMLElement;
// if we didn't find a submit button and we are in a form:
if (submitButton == null && wrappingElIsForm) {
submitButton = wrappingEl.querySelector("button:not([type])");
// query for a button that doesn't have the type attribute
submitButton = wrappingEl.querySelector("button:not([type]):not([data-bitwarden-clicked])");
if (submitButton != null) {
// Retrieve "submit" button text because it might be a cancel button instead of a submit button.
// If it is a cancel button, then we don't want to use it.
const buttonText = getButtonText(submitButton);
if (buttonText != null && cancelButtonNames.has(buttonText.trim().toLowerCase())) {
submitButton = null;
}
}
}
// If we still don't have a submit button, then try to find a button that looks like a submit button
if (submitButton == null) {
const possibleSubmitButtons = Array.from(
wrappingEl.querySelectorAll(
@@ -445,12 +742,18 @@ document.addEventListener("DOMContentLoaded", (event) => {
)
) as HTMLElement[];
let typelessButton: HTMLElement = null;
// Loop through all possible submit buttons and find the first one that matches a submit button name
possibleSubmitButtons.forEach((button) => {
if (submitButton != null || button == null || button.tagName == null) {
// Continue if we already found a submit button or if the button is null or doesn't have a tag name
// Return in a forEach(...) is equivalent to continue
return;
}
// Retrieve button text
const buttonText = getButtonText(button);
if (buttonText != null) {
// if we have a button that doesn't have a type attribute & isn't a cancel btn,
// then save it in case we don't find a submit button
if (
typelessButton != null &&
button.tagName.toLowerCase() === "button" &&
@@ -459,16 +762,21 @@ document.addEventListener("DOMContentLoaded", (event) => {
) {
typelessButton = button;
} else if (buttonNames.has(buttonText.trim().toLowerCase())) {
// If the button text matches a submit button name, then use it
submitButton = button;
}
}
});
// Fallback to typeless button if it exists and we didn't find a submit button
if (submitButton == null && typelessButton != null) {
submitButton = typelessButton;
}
}
// If we still don't have a submit button, then try to find a submit button in a modal
if (submitButton == null && wrappingElIsForm) {
// Maybe it's in a modal?
// Find closest modal and check if it has only one form
const parentModal = wrappingEl.closest("div.modal") as HTMLElement;
if (parentModal != null) {
const modalForms = parentModal.querySelectorAll("form");
@@ -476,10 +784,26 @@ document.addEventListener("DOMContentLoaded", (event) => {
submitButton = getSubmitButton(parentModal, buttonNames);
}
}
// If we still don't have a submit button, then try to find a submit button by using the form's
// parent element as the wrapping element
if (submitButton == null) {
const parentElement = wrappingEl.parentElement;
// Going up a level and looking for loginButtonNames
if (parentElement != null) {
submitButton = getSubmitButton(parentElement, buttonNames);
}
}
}
return submitButton;
}
/**
* Returns the text of a given button element.
* @param button - The button element to get the text from.
* @returns - The text of the button.
*/
function getButtonText(button: HTMLElement) {
let buttonText: string = null;
if (button.tagName.toLowerCase() === "input") {
@@ -490,6 +814,10 @@ document.addEventListener("DOMContentLoaded", (event) => {
return buttonText;
}
/**
* Mark form as processed so we don't try to process it again.
* @param {Object} form - The form element to mark as processed.
*/
function processedForm(form: HTMLFormElement) {
form.dataset.bitwardenProcessed = "1";
window.setTimeout(() => {
@@ -497,6 +825,9 @@ document.addEventListener("DOMContentLoaded", (event) => {
}, 500);
}
// End Form Detection and Submission Handling
// Notification Bar Functions (open, close, height adjustment, etc.)
function closeExistingAndOpenBar(type: string, typeData: any) {
const barQueryParams = {
type,
@@ -593,8 +924,73 @@ document.addEventListener("DOMContentLoaded", (event) => {
el.style.height = heightStyle;
}
}
// End Notification Bar Functions (open, close, height adjustment, etc.)
// Helper Functions
function sendPlatformMessage(msg: any) {
chrome.runtime.sendMessage(msg);
}
function isInIframe() {
try {
return window.self !== window.top;
} catch {
return true;
}
}
// https://stackoverflow.com/a/41328397/20715409 - most efficient of the answers there
function unionSets(...iterables: Set<any>[]): Set<any> {
const set = new Set();
for (const iterable of iterables) {
for (const item of iterable) {
set.add(item);
}
}
return set;
}
/**
* Determine if the element is visible.
* Visible is define as not having `display: none` or `visibility: hidden`.
* @param {HTMLElement} el
* @returns {boolean} Returns `true` if the element is visible and `false` otherwise
*
* Copied from autofill.js and converted to TypeScript;
* TODO: could be refactored to be in a shared location if autofill.js is converted to TS
*/
function isElementVisible(el: HTMLElement): boolean {
let theEl: Node | null = el;
// Get the top level document
const elDocument = el.ownerDocument;
const elWindow = elDocument ? elDocument.defaultView : undefined;
// walk the dom tree until we reach the top
while (theEl && theEl !== document) {
// Calculate the style of the element
const elStyle = elWindow?.getComputedStyle
? elWindow.getComputedStyle(theEl as HTMLElement, null)
: (theEl as HTMLElement).style;
// If there's no computed style at all, we're done, as we know that it's not hidden
if (!elStyle) {
return true;
}
// If the element's computed style includes `display: none` or `visibility: hidden`, we know it's hidden
if ("none" === elStyle.display || "hidden" === elStyle.visibility) {
return false;
}
// At this point, we aren't sure if the element is hidden or not, so we need to keep walking up the tree
theEl = theEl.parentNode;
}
// If we've reached the top of the tree, we know that the element is visible
return theEl === document;
}
// End Helper Functions
});

View File

@@ -44,7 +44,7 @@ export default class AutofillField {
*/
"label-top": string;
/**
* The contatenated `innerText` or `textContent` of all elements that are HTML labels for the field
* The concatenated `innerText` or `textContent` of all elements that are HTML labels for the field
*/
"label-tag": string;
/**

View File

@@ -0,0 +1,8 @@
import { FormData } from "../services/abstractions/autofill.service";
export interface WatchedForm {
data: FormData;
formEl: HTMLFormElement;
usernameEl: HTMLInputElement | null;
passwordEl: HTMLInputElement | null;
passwordEls: HTMLInputElement[] | null;
}

View File

@@ -1,4 +1,3 @@
import { UriMatchType } from "@bitwarden/common/enums/uriMatchType";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import AutofillField from "../../models/autofill-field";
@@ -40,9 +39,4 @@ export abstract class AutofillService {
fromCommand: boolean
) => Promise<string>;
doAutoFillActiveTab: (pageDetails: PageDetail[], fromCommand: boolean) => Promise<string>;
iframeUrlMatches: (
pageUrl: string,
loginItem: CipherView,
defaultUriMatch: UriMatchType
) => boolean;
}

View File

@@ -277,7 +277,13 @@ export class IdentityAutoFillConstants {
static readonly FullNameFieldNameValues: string[] = ["full-name", "your-name"];
static readonly TitleFieldNames: string[] = ["honorific-prefix", "prefix", "title"];
static readonly TitleFieldNames: string[] = [
"honorific-prefix",
"prefix",
"title",
// German
"anrede",
];
static readonly FirstnameFieldNames: string[] = [
// English
@@ -323,6 +329,9 @@ export class IdentityAutoFillConstants {
"billing-addr",
"mail-addr",
"bill-addr",
// German
"strasse",
"adresse",
];
static readonly AddressFieldNameValues: string[] = [
@@ -365,6 +374,9 @@ export class IdentityAutoFillConstants {
"address-code",
"address-postal-code",
"address-zip-code",
// German
"plz",
"postleitzahl",
];
static readonly CityFieldNames: string[] = [
@@ -373,6 +385,10 @@ export class IdentityAutoFillConstants {
"address-level-2",
"address-city",
"address-town",
// German
"ort",
"stadt",
"wohnort",
];
static readonly StateFieldNames: string[] = [
@@ -382,6 +398,8 @@ export class IdentityAutoFillConstants {
"address-level-1",
"address-state",
"address-province",
// German
"bundesland",
];
static readonly CountryFieldNames: string[] = [
@@ -391,6 +409,8 @@ export class IdentityAutoFillConstants {
"address-country",
"address-country-name",
"address-country-code",
// German
"land",
];
static readonly PhoneFieldNames: string[] = [
@@ -400,6 +420,11 @@ export class IdentityAutoFillConstants {
"tel",
"telephone",
"phone-number",
// German
"telefon",
"telefonnummer",
"mobil",
"handy",
];
static readonly UserNameFieldNames: string[] = ["user-name", "user-id", "screen-name"];
@@ -409,6 +434,8 @@ export class IdentityAutoFillConstants {
"company-name",
"organization",
"organization-name",
// German
"firma",
];
static readonly IsoCountries: { [id: string]: string } = {

View File

@@ -2,16 +2,12 @@ import { EventCollectionService } from "@bitwarden/common/abstractions/event/eve
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { SettingsService } from "@bitwarden/common/abstractions/settings.service";
import { TotpService } from "@bitwarden/common/abstractions/totp.service";
import { EventType } from "@bitwarden/common/enums/eventType";
import { FieldType } from "@bitwarden/common/enums/fieldType";
import { UriMatchType } from "@bitwarden/common/enums/uriMatchType";
import { Utils } from "@bitwarden/common/misc/utils";
import { EventType, FieldType, UriMatchType } from "@bitwarden/common/enums";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type";
import { CipherType } from "@bitwarden/common/vault/enums/cipher-type";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { FieldView } from "@bitwarden/common/vault/models/view/field.view";
import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view";
import { BrowserApi } from "../../browser/browserApi";
import { BrowserStateService } from "../../services/abstractions/browser-state.service";
@@ -54,17 +50,41 @@ export default class AutofillService implements AutofillServiceInterface {
getFormsWithPasswordFields(pageDetails: AutofillPageDetails): FormData[] {
const formData: FormData[] = [];
const passwordFields = AutofillService.loadPasswordFields(
pageDetails,
true,
true,
false,
false
);
const passwordFields = AutofillService.loadPasswordFields(pageDetails, true, true, false, true);
// TODO: this logic prevents multi-step account creation forms (that just start with email)
// from being passed on to the notification bar content script - even if autofill.js found the form and email field.
// ex: https://signup.live.com/
if (passwordFields.length === 0) {
return formData;
}
// Back up check for cases where there are several password fields detected,
// but they are not all part of the form b/c of bad HTML
// gather password fields that don't have an enclosing form
const passwordFieldsWithoutForm = passwordFields.filter((pf) => pf.form === undefined);
const formKeys = Object.keys(pageDetails.forms);
const formCount = formKeys.length;
// if we have 3 password fields and only 1 form, and there are password fields that are not within a form
// but there is at least one password field within the form, then most likely this is a poorly built password change form
if (passwordFields.length === 3 && formCount == 1 && passwordFieldsWithoutForm.length > 0) {
// Only one form so get the singular form key
const soloFormKey = formKeys[0];
const atLeastOnePasswordFieldWithinSoloForm =
passwordFields.filter((pf) => pf.form !== null && pf.form === soloFormKey).length > 0;
if (atLeastOnePasswordFieldWithinSoloForm) {
// We have a form with at least one password field,
// so let's make an assumption that the password fields without a form are actually part of this form
passwordFieldsWithoutForm.forEach((pf) => {
pf.form = soloFormKey;
});
}
}
for (const formKey in pageDetails.forms) {
// eslint-disable-next-line
if (!pageDetails.forms.hasOwnProperty(formKey)) {
@@ -351,9 +371,7 @@ export default class AutofillService implements AutofillServiceInterface {
fillScript.savedUrls =
login?.uris?.filter((u) => u.match != UriMatchType.Never).map((u) => u.uri) ?? [];
const inIframe = pageDetails.url !== options.tabUrl;
fillScript.untrustedIframe =
inIframe && !this.iframeUrlMatches(pageDetails.url, options.cipher, options.defaultUriMatch);
fillScript.untrustedIframe = this.inUntrustedIframe(pageDetails.url, options);
if (!login.password || login.password === "") {
// No password for this login. Maybe they just wanted to auto-fill some custom fields?
@@ -789,81 +807,28 @@ export default class AutofillService implements AutofillServiceInterface {
}
/**
* Determines whether to warn the user about filling an iframe
* Determines whether an iframe is potentially dangerous ("untrusted") to autofill
* @param pageUrl The url of the page/iframe, usually from AutofillPageDetails
* @param tabUrl The url of the tab, usually from the message sender (should not come from a content script because
* that is likely to be incorrect in the case of iframes)
* @param loginItem The cipher to be filled
* @returns `true` if the iframe is untrusted and the warning should be shown, `false` otherwise
* @param options The GenerateFillScript options
* @returns `true` if the iframe is untrusted and a warning should be shown, `false` otherwise
*/
iframeUrlMatches(pageUrl: string, loginItem: CipherView, defaultUriMatch: UriMatchType): boolean {
private inUntrustedIframe(pageUrl: string, options: GenerateFillScriptOptions): boolean {
// If the pageUrl (from the content script) matches the tabUrl (from the sender tab), we are not in an iframe
// This also avoids a false positive if no URI is saved and the user triggers auto-fill anyway
if (pageUrl === options.tabUrl) {
return false;
}
// Check the pageUrl against cipher URIs using the configured match detection.
// If we are in this function at all, it is assumed that the tabUrl already matches a URL for `loginItem`,
// need to verify the pageUrl also matches one of the saved URIs using the match detection selected.
const uriMatched = loginItem.login.uris?.some((uri) =>
this.uriMatches(uri, pageUrl, defaultUriMatch)
// Remember: if we are in this function, the tabUrl already matches a saved URI for the login.
// We need to verify the pageUrl also matches.
const equivalentDomains = this.settingsService.getEquivalentDomains(pageUrl);
const matchesUri = options.cipher.login.matchesUri(
pageUrl,
equivalentDomains,
options.defaultUriMatch
);
return uriMatched;
}
// TODO should this be put in a common place (Utils maybe?) to be used both here and by CipherService?
private uriMatches(uri: LoginUriView, url: string, defaultUriMatch: UriMatchType): boolean {
const matchType = uri.match ?? defaultUriMatch;
const matchDomains = [Utils.getDomain(url)];
const equivalentDomains = this.settingsService.getEquivalentDomains(url);
if (equivalentDomains != null) {
matchDomains.push(...equivalentDomains);
}
switch (matchType) {
case UriMatchType.Domain:
if (url != null && uri.domain != null && matchDomains.includes(uri.domain)) {
if (Utils.DomainMatchBlacklist.has(uri.domain)) {
const domainUrlHost = Utils.getHost(url);
if (!Utils.DomainMatchBlacklist.get(uri.domain).has(domainUrlHost)) {
return true;
}
} else {
return true;
}
}
break;
case UriMatchType.Host: {
const urlHost = Utils.getHost(url);
if (urlHost != null && urlHost === Utils.getHost(uri.uri)) {
return true;
}
break;
}
case UriMatchType.Exact:
if (url === uri.uri) {
return true;
}
break;
case UriMatchType.StartsWith:
if (url.startsWith(uri.uri)) {
return true;
}
break;
case UriMatchType.RegularExpression:
try {
const regex = new RegExp(uri.uri, "i");
if (regex.test(url)) {
return true;
}
} catch (e) {
this.logService.error(e);
return false;
}
break;
case UriMatchType.Never:
default:
break;
}
return false;
return !matchesUri;
}
private fieldAttrsContain(field: AutofillField, containsVal: string) {

View File

@@ -1,5 +1,6 @@
import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service";
import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service";
import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum";
import { BrowserStateService } from "../services/abstractions/browser-state.service";
@@ -45,7 +46,7 @@ export default class IdleBackground {
if (timeout === -2) {
// On System Lock vault timeout option
const action = await this.stateService.getVaultTimeoutAction();
if (action === "logOut") {
if (action === VaultTimeoutAction.LogOut) {
await this.vaultTimeoutService.logOut();
} else {
await this.vaultTimeoutService.lock();

View File

@@ -2,12 +2,13 @@ import { AvatarUpdateService as AvatarUpdateServiceAbstraction } from "@bitwarde
import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service";
import { AppIdService as AppIdServiceAbstraction } from "@bitwarden/common/abstractions/appId.service";
import { AuditService as AuditServiceAbstraction } from "@bitwarden/common/abstractions/audit.service";
import { ConfigApiServiceAbstraction } from "@bitwarden/common/abstractions/config/config-api.service.abstraction";
import { ConfigServiceAbstraction } from "@bitwarden/common/abstractions/config/config.service.abstraction";
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abstractions/crypto.service";
import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/abstractions/cryptoFunction.service";
import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service";
import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service";
import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service";
import { ExportService as ExportServiceAbstraction } from "@bitwarden/common/abstractions/export.service";
import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/abstractions/file-upload/file-upload.service";
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service";
import { LogService as LogServiceAbstraction } from "@bitwarden/common/abstractions/log.service";
@@ -55,13 +56,13 @@ import { AvatarUpdateService } from "@bitwarden/common/services/account/avatar-u
import { ApiService } from "@bitwarden/common/services/api.service";
import { AppIdService } from "@bitwarden/common/services/appId.service";
import { AuditService } from "@bitwarden/common/services/audit.service";
import { ConfigService } from "@bitwarden/common/services/config/config.service";
import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service";
import { ContainerService } from "@bitwarden/common/services/container.service";
import { EncryptServiceImplementation } from "@bitwarden/common/services/cryptography/encrypt.service.implementation";
import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/services/cryptography/multithread-encrypt.service.implementation";
import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service";
import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service";
import { ExportService } from "@bitwarden/common/services/export.service";
import { FileUploadService } from "@bitwarden/common/services/file-upload/file-upload.service";
import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service";
import { NotificationsService } from "@bitwarden/common/services/notifications.service";
@@ -94,6 +95,10 @@ import { CipherFileUploadService } from "@bitwarden/common/vault/services/file-u
import { FolderApiService } from "@bitwarden/common/vault/services/folder/folder-api.service";
import { SyncNotifierService } from "@bitwarden/common/vault/services/sync/sync-notifier.service";
import { SyncService } from "@bitwarden/common/vault/services/sync/sync.service";
import {
VaultExportService,
VaultExportServiceAbstraction,
} from "@bitwarden/exporter/vault-export";
import { BrowserOrganizationService } from "../admin-console/services/browser-organization.service";
import { BrowserPolicyService } from "../admin-console/services/browser-policy.service";
@@ -162,7 +167,7 @@ export default class MainBackground {
containerService: ContainerService;
auditService: AuditServiceAbstraction;
authService: AuthServiceAbstraction;
exportService: ExportServiceAbstraction;
exportService: VaultExportServiceAbstraction;
searchService: SearchServiceAbstraction;
notificationsService: NotificationsServiceAbstraction;
stateService: StateServiceAbstraction;
@@ -193,6 +198,8 @@ export default class MainBackground {
avatarUpdateService: AvatarUpdateServiceAbstraction;
mainContextMenuHandler: MainContextMenuHandler;
cipherContextMenuHandler: CipherContextMenuHandler;
configService: ConfigServiceAbstraction;
configApiService: ConfigApiServiceAbstraction;
popupUtilsService: PopupUtilsService;
// Passed to the popup for Safari to workaround issues with theming, downloading, etc.
@@ -314,13 +321,14 @@ export default class MainBackground {
this.apiService,
this.fileUploadService
);
this.searchService = new SearchService(this.logService, this.i18nService);
this.cipherService = new CipherService(
this.cryptoService,
this.settingsService,
this.apiService,
this.i18nService,
() => this.searchService,
this.logService,
this.searchService,
this.stateService,
this.encryptService,
this.cipherFileUploadService
@@ -337,7 +345,6 @@ export default class MainBackground {
this.i18nService,
this.stateService
);
this.searchService = new SearchService(this.cipherService, this.logService, this.i18nService);
this.syncNotifierService = new SyncNotifierService();
this.organizationService = new BrowserOrganizationService(this.stateService);
this.policyService = new BrowserPolicyService(this.stateService, this.organizationService);
@@ -364,6 +371,11 @@ export default class MainBackground {
this.collectionService,
this.policyService
);
this.passwordGenerationService = new PasswordGenerationService(
this.cryptoService,
this.policyService,
this.stateService
);
this.twoFactorService = new TwoFactorService(this.i18nService, this.platformUtilsService);
@@ -389,7 +401,9 @@ export default class MainBackground {
this.stateService,
this.twoFactorService,
this.i18nService,
this.encryptService
this.encryptService,
this.passwordGenerationService,
this.policyService
);
this.vaultTimeoutSettingsService = new VaultTimeoutSettingsService(
@@ -457,11 +471,6 @@ export default class MainBackground {
this.organizationService,
this.eventUploadService
);
this.passwordGenerationService = new PasswordGenerationService(
this.cryptoService,
this.policyService,
this.stateService
);
this.totpService = new TotpService(this.cryptoFunctionService, this.logService);
this.autofillService = new AutofillService(
this.cipherService,
@@ -472,7 +481,7 @@ export default class MainBackground {
this.settingsService
);
this.auditService = new AuditService(this.cryptoFunctionService, this.apiService);
this.exportService = new ExportService(
this.exportService = new VaultExportService(
this.folderService,
this.cipherService,
this.apiService,
@@ -500,6 +509,12 @@ export default class MainBackground {
this.userVerificationApiService
);
this.configService = new ConfigService(
this.stateService,
this.configApiService,
this.authService
);
this.popupUtilsService = new PopupUtilsService(this.isPrivateMode);
this.fido2UserInterfaceService = new BrowserFido2UserInterfaceService(this.popupUtilsService);
this.fido2AuthenticatorService = new Fido2AuthenticatorService(
@@ -541,7 +556,8 @@ export default class MainBackground {
this.systemService,
this.environmentService,
this.messagingService,
this.logService
this.logService,
this.configService
);
this.nativeMessagingBackground = new NativeMessagingBackground(
this.cryptoService,

View File

@@ -153,10 +153,11 @@ export class NativeMessagingBackground {
this.connected = false;
this.messagingService.send("showDialog", {
text: this.i18nService.t("nativeMessagingInvalidEncryptionDesc"),
title: this.i18nService.t("nativeMessagingInvalidEncryptionTitle"),
confirmText: this.i18nService.t("ok"),
type: "error",
title: { key: "nativeMessagingInvalidEncryptionTitle" },
content: { key: "nativeMessagingInvalidEncryptionDesc" },
acceptButtonText: { key: "ok" },
cancelButtonText: null,
type: "danger",
});
break;
case "verifyFingerprint": {
@@ -199,10 +200,11 @@ export class NativeMessagingBackground {
showWrongUserDialog() {
this.messagingService.send("showDialog", {
text: this.i18nService.t("nativeMessagingWrongUserDesc"),
title: this.i18nService.t("nativeMessagingWrongUserTitle"),
confirmText: this.i18nService.t("ok"),
type: "error",
title: { key: "nativeMessagingWrongUserTitle" },
content: { key: "nativeMessagingWrongUserDesc" },
acceptButtonText: { key: "ok" },
cancelButtonText: null,
type: "danger",
});
}
@@ -258,10 +260,11 @@ export class NativeMessagingBackground {
this.connected = false;
this.messagingService.send("showDialog", {
text: this.i18nService.t("nativeMessagingInvalidEncryptionDesc"),
title: this.i18nService.t("nativeMessagingInvalidEncryptionTitle"),
confirmText: this.i18nService.t("ok"),
type: "error",
title: { key: "nativeMessagingInvalidEncryptionTitle" },
content: { key: "nativeMessagingInvalidEncryptionDesc" },
acceptButtonText: { key: "ok" },
cancelButtonText: null,
type: "danger",
});
}
}
@@ -285,18 +288,20 @@ export class NativeMessagingBackground {
if (message.response === "not enabled") {
this.messagingService.send("showDialog", {
text: this.i18nService.t("biometricsNotEnabledDesc"),
title: this.i18nService.t("biometricsNotEnabledTitle"),
confirmText: this.i18nService.t("ok"),
type: "error",
title: { key: "biometricsNotEnabledTitle" },
content: { key: "biometricsNotEnabledDesc" },
acceptButtonText: { key: "ok" },
cancelButtonText: null,
type: "danger",
});
break;
} else if (message.response === "not supported") {
this.messagingService.send("showDialog", {
text: this.i18nService.t("biometricsNotSupportedDesc"),
title: this.i18nService.t("biometricsNotSupportedTitle"),
confirmText: this.i18nService.t("ok"),
type: "error",
title: { key: "biometricsNotSupportedTitle" },
content: { key: "biometricsNotSupportedDesc" },
acceptButtonText: { key: "ok" },
cancelButtonText: null,
type: "danger",
});
break;
}
@@ -377,13 +382,8 @@ export class NativeMessagingBackground {
await this.cryptoService.getFingerprint(await this.stateService.getUserId(), this.publicKey)
).join(" ");
this.messagingService.send("showDialog", {
html: `${this.i18nService.t(
"desktopIntegrationVerificationText"
)}<br><br><strong>${fingerprint}</strong>`,
title: this.i18nService.t("desktopSyncVerificationTitle"),
confirmText: this.i18nService.t("ok"),
type: "warning",
this.messagingService.send("showNativeMessagingFinterprintDialog", {
fingerprint: fingerprint,
});
}
}

View File

@@ -1,3 +1,4 @@
import { ConfigServiceAbstraction } from "@bitwarden/common/abstractions/config/config.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
@@ -29,7 +30,8 @@ export default class RuntimeBackground {
private systemService: SystemService,
private environmentService: BrowserEnvironmentService,
private messagingService: MessagingService,
private logService: LogService
private logService: LogService,
private configService: ConfigServiceAbstraction
) {
// onInstalled listener must be wired up before anything else, so we do it in the ctor
chrome.runtime.onInstalled.addListener((details: any) => {
@@ -108,6 +110,7 @@ export default class RuntimeBackground {
await this.main.refreshMenu();
}, 2000);
this.main.avatarUpdateService.loadColorFromState();
this.configService.fetchServerConfig();
}
break;
case "openPopup":
@@ -130,9 +133,6 @@ export default class RuntimeBackground {
BrowserApi.closeBitwardenExtensionTab();
}, msg.delay ?? 0);
break;
case "showDialogResolve":
this.platformUtilsService.resolveDialogPromise(msg.dialogId, msg.confirmed);
break;
case "bgCollectPageDetails":
await this.main.collectPageDetailsForContentScript(sender.tab, msg.sender, sender.frameId);
break;
@@ -215,10 +215,10 @@ export default class RuntimeBackground {
break;
case "emailVerificationRequired":
this.messagingService.send("showDialog", {
dialogId: "emailVerificationRequired",
title: this.i18nService.t("emailVerificationRequired"),
text: this.i18nService.t("emailVerificationRequiredDesc"),
confirmText: this.i18nService.t("ok"),
title: { key: "emailVerificationRequired" },
content: { key: "emailVerificationRequiredDesc" },
acceptButtonText: { key: "ok" },
cancelButtonText: null,
type: "info",
});
break;

View File

@@ -1,5 +1,5 @@
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { LogLevelType } from "@bitwarden/common/enums/logLevelType";
import { LogLevelType } from "@bitwarden/common/enums";
import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service";
import { CachedServices, factory, FactoryOptions } from "./factory-options";

View File

@@ -1,11 +1,6 @@
import { SearchService as AbstractSearchService } from "@bitwarden/common/abstractions/search.service";
import { SearchService } from "@bitwarden/common/services/search.service";
import {
cipherServiceFactory,
CipherServiceInitOptions,
} from "../../vault/background/service_factories/cipher-service.factory";
import { CachedServices, factory, FactoryOptions } from "./factory-options";
import { i18nServiceFactory, I18nServiceInitOptions } from "./i18n-service.factory";
import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory";
@@ -13,7 +8,6 @@ import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"
type SearchServiceFactoryOptions = FactoryOptions;
export type SearchServiceInitOptions = SearchServiceFactoryOptions &
CipherServiceInitOptions &
LogServiceInitOptions &
I18nServiceInitOptions;
@@ -26,10 +20,6 @@ export function searchServiceFactory(
"searchService",
opts,
async () =>
new SearchService(
await cipherServiceFactory(cache, opts),
await logServiceFactory(cache, opts),
await i18nServiceFactory(cache, opts)
)
new SearchService(await logServiceFactory(cache, opts), await i18nServiceFactory(cache, opts))
);
}

View File

@@ -1,7 +1,7 @@
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { UriMatchType } from "@bitwarden/common/enums/uriMatchType";
import { UriMatchType } from "@bitwarden/common/enums";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { BrowserApi } from "../browser/browserApi";

View File

@@ -1,4 +1,3 @@
import { SearchService } from "@bitwarden/common/abstractions/search.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { StateFactory } from "@bitwarden/common/factories/stateFactory";
import { GlobalState } from "@bitwarden/common/models/domain/global-state";
@@ -60,9 +59,6 @@ const doAutoFillLogin = async (tab: chrome.tabs.Tab): Promise<void> => {
i18nServiceOptions: {
systemLanguage: BrowserApi.getUILanguage(self),
},
cipherServiceOptions: {
searchServiceFactory: null as () => SearchService, // No dependence on search service
},
};
const logService = await logServiceFactory(cachedServices, opts);
const authService = await authServiceFactory(cachedServices, opts);

View File

@@ -9,7 +9,6 @@ import { ContainerService } from "@bitwarden/common/services/container.service";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { authServiceFactory } from "../auth/background/service-factories/auth-service.factory";
import { searchServiceFactory } from "../background/service_factories/search-service.factory";
import { stateServiceFactory } from "../background/service_factories/state-service.factory";
import { BrowserApi } from "../browser/browserApi";
import { Account } from "../models/account";
@@ -27,7 +26,7 @@ export class UpdateBadge {
private authService: AuthService;
private stateService: BrowserStateService;
private cipherService: CipherService;
private badgeAction: typeof chrome.action;
private badgeAction: typeof chrome.action | typeof chrome.browserAction;
private sidebarAction: OperaSidebarAction | FirefoxSidebarAction;
private inited = false;
private win: Window & typeof globalThis;
@@ -279,12 +278,7 @@ export class UpdateBadge {
};
this.stateService = await stateServiceFactory(serviceCache, opts);
this.authService = await authServiceFactory(serviceCache, opts);
const searchService = await searchServiceFactory(serviceCache, opts);
this.cipherService = await cipherServiceFactory(serviceCache, {
...opts,
cipherServiceOptions: { searchServiceFactory: () => searchService },
});
this.cipherService = await cipherServiceFactory(serviceCache, opts);
// Needed for cipher decryption
if (!self.bitwardenContainerService) {

View File

@@ -2,7 +2,7 @@
"manifest_version": 2,
"name": "__MSG_extName__",
"short_name": "__MSG_appName__",
"version": "2023.3.0",
"version": "2023.4.0",
"description": "__MSG_extDesc__",
"default_locale": "en",
"author": "Bitwarden Inc.",

View File

@@ -3,7 +3,7 @@
"minimum_chrome_version": "102.0",
"name": "__MSG_extName__",
"short_name": "__MSG_appName__",
"version": "2023.3.0",
"version": "2023.4.0",
"description": "__MSG_extDesc__",
"default_locale": "en",
"author": "Bitwarden Inc.",

View File

@@ -18,11 +18,13 @@ import { SsoComponent } from "../auth/popup/sso.component";
import { TwoFactorOptionsComponent } from "../auth/popup/two-factor-options.component";
import { TwoFactorComponent } from "../auth/popup/two-factor.component";
import { UpdateTempPasswordComponent } from "../auth/popup/update-temp-password.component";
import { Fido2Component } from "../fido2/popup/fido2/fido2.component";
import { GeneratorComponent } from "../tools/popup/generator/generator.component";
import { PasswordGeneratorHistoryComponent } from "../tools/popup/generator/password-generator-history.component";
import { SendAddEditComponent } from "../tools/popup/send/send-add-edit.component";
import { SendGroupingsComponent } from "../tools/popup/send/send-groupings.component";
import { SendTypeComponent } from "../tools/popup/send/send-type.component";
import { ExportComponent } from "../tools/popup/settings/export.component";
import { AddEditComponent } from "../vault/popup/components/vault/add-edit.component";
import { AttachmentsComponent } from "../vault/popup/components/vault/attachments.component";
import { CollectionsComponent } from "../vault/popup/components/vault/collections.component";
@@ -32,12 +34,10 @@ import { ShareComponent } from "../vault/popup/components/vault/share.component"
import { VaultFilterComponent } from "../vault/popup/components/vault/vault-filter.component";
import { VaultItemsComponent } from "../vault/popup/components/vault/vault-items.component";
import { ViewComponent } from "../vault/popup/components/vault/view.component";
import { Fido2Component } from "../fido2/popup/fido2/fido2.component";
import { DebounceNavigationService } from "./services/debounceNavigationService";
import { AutofillComponent } from "./settings/autofill.component";
import { ExcludedDomainsComponent } from "./settings/excluded-domains.component";
import { ExportComponent } from "./settings/export.component";
import { FolderAddEditComponent } from "./settings/folder-add-edit.component";
import { FoldersComponent } from "./settings/folders.component";
import { HelpAndFeedbackComponent } from "./settings/help-and-feedback.component";

View File

@@ -9,9 +9,10 @@ import {
import { DomSanitizer } from "@angular/platform-browser";
import { NavigationEnd, Router, RouterOutlet } from "@angular/router";
import { IndividualConfig, ToastrService } from "ngx-toastr";
import { Subject, takeUntil } from "rxjs";
import Swal, { SweetAlertIcon } from "sweetalert2";
import { filter, concatMap, Subject, takeUntil } from "rxjs";
import Swal from "sweetalert2";
import { DialogServiceAbstraction, SimpleDialogOptions } from "@bitwarden/angular/services/dialog";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
@@ -48,7 +49,8 @@ export class AppComponent implements OnInit, OnDestroy {
private changeDetectorRef: ChangeDetectorRef,
private ngZone: NgZone,
private sanitizer: DomSanitizer,
private platformUtilsService: PlatformUtilsService
private platformUtilsService: PlatformUtilsService,
private dialogService: DialogServiceAbstraction
) {}
async ngOnInit() {
@@ -60,6 +62,16 @@ export class AppComponent implements OnInit, OnDestroy {
this.activeUserId = userId;
});
this.stateService.activeAccountUnlocked$
.pipe(
filter((unlocked) => unlocked),
concatMap(async () => {
await this.recordActivity();
}),
takeUntil(this.destroy$)
)
.subscribe();
this.ngZone.runOutsideAngular(() => {
window.onmousedown = () => this.recordActivity();
window.ontouchstart = () => this.recordActivity();
@@ -102,6 +114,9 @@ export class AppComponent implements OnInit, OnDestroy {
}
} else if (msg.command === "showDialog") {
await this.showDialog(msg);
} else if (msg.command === "showNativeMessagingFinterprintDialog") {
// TODO: Should be refactored to live in another service.
await this.showNativeMessagingFingerprintDialog(msg);
} else if (msg.command === "showToast") {
this.ngZone.run(() => {
this.showToast(msg);
@@ -222,51 +237,24 @@ export class AppComponent implements OnInit, OnDestroy {
this.toastrService.show(message, msg.title, options, "toast-" + msg.type);
}
private async showDialog(msg: any) {
let iconClasses: string = null;
const type = msg.type;
if (type != null) {
// If you add custom types to this part, the type to SweetAlertIcon cast below needs to be changed.
switch (type) {
case "success":
iconClasses = "bwi-check text-success";
break;
case "warning":
iconClasses = "bwi-exclamation-triangle text-warning";
break;
case "error":
iconClasses = "bwi-error text-danger";
break;
case "info":
iconClasses = "bwi-info-circle text-info";
break;
default:
break;
}
}
private async showDialog(msg: SimpleDialogOptions) {
await this.dialogService.openSimpleDialog(msg);
}
const cancelText = msg.cancelText;
const confirmText = msg.confirmText;
const confirmed = await Swal.fire({
private async showNativeMessagingFingerprintDialog(msg: any) {
await Swal.fire({
heightAuto: false,
buttonsStyling: false,
icon: type as SweetAlertIcon, // required to be any of the SweetAlertIcons to output the iconHtml.
iconHtml:
iconClasses != null ? `<i class="swal-custom-icon bwi ${iconClasses}"></i>` : undefined,
text: msg.text,
html: msg.html,
titleText: msg.title,
showCancelButton: cancelText != null,
cancelButtonText: cancelText,
icon: "warning",
iconHtml: '<i class="swal-custom-icon bwi bwi-exclamation-triangle text-warning"></i>',
html: `${this.i18nService.t("desktopIntegrationVerificationText")}<br><br><strong>${
msg.fingerprint
}</strong>`,
titleText: this.i18nService.t("desktopSyncVerificationTitle"),
showConfirmButton: true,
confirmButtonText: confirmText == null ? this.i18nService.t("ok") : confirmText,
confirmButtonText: this.i18nService.t("ok"),
timer: 300000,
});
this.messagingService.send("showDialogResolve", {
dialogId: msg.dialogId,
confirmed: confirmed.value,
});
}
private async clearComponentStates() {

View File

@@ -1,14 +1,10 @@
import { A11yModule } from "@angular/cdk/a11y";
import { DialogModule } from "@angular/cdk/dialog";
import { DragDropModule } from "@angular/cdk/drag-drop";
import { LayoutModule } from "@angular/cdk/layout";
import { OverlayModule } from "@angular/cdk/overlay";
import { ScrollingModule } from "@angular/cdk/scrolling";
// eslint-disable-next-line import/order
import { CommonModule, CurrencyPipe, DatePipe } from "@angular/common";
// Register the locales for the application
import "./locales";
import { CurrencyPipe, DatePipe } from "@angular/common";
import { NgModule } from "@angular/core";
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
import { BrowserModule } from "@angular/platform-browser";
@@ -32,6 +28,7 @@ import { SsoComponent } from "../auth/popup/sso.component";
import { TwoFactorOptionsComponent } from "../auth/popup/two-factor-options.component";
import { TwoFactorComponent } from "../auth/popup/two-factor.component";
import { UpdateTempPasswordComponent } from "../auth/popup/update-temp-password.component";
import { Fido2Component } from "../fido2/popup/fido2/fido2.component";
import { GeneratorComponent } from "../tools/popup/generator/generator.component";
import { PasswordGeneratorHistoryComponent } from "../tools/popup/generator/password-generator-history.component";
import { SendListComponent } from "../tools/popup/send/components/send-list.component";
@@ -39,6 +36,7 @@ import { EffluxDatesComponent as SendEffluxDatesComponent } from "../tools/popup
import { SendAddEditComponent } from "../tools/popup/send/send-add-edit.component";
import { SendGroupingsComponent } from "../tools/popup/send/send-groupings.component";
import { SendTypeComponent } from "../tools/popup/send/send-type.component";
import { ExportComponent } from "../tools/popup/settings/export.component";
import { ActionButtonsComponent } from "../vault/popup/components/action-buttons.component";
import { CipherRowComponent } from "../vault/popup/components/cipher-row.component";
import { PasswordRepromptComponent } from "../vault/popup/components/password-reprompt.component";
@@ -54,7 +52,6 @@ import { VaultItemsComponent } from "../vault/popup/components/vault/vault-items
import { VaultSelectComponent } from "../vault/popup/components/vault/vault-select.component";
import { ViewCustomFieldsComponent } from "../vault/popup/components/vault/view-custom-fields.component";
import { ViewComponent } from "../vault/popup/components/vault/view.component";
import { Fido2Component } from "../fido2/popup/fido2/fido2.component";
import { AppRoutingModule } from "./app-routing.module";
import { AppComponent } from "./app.component";
@@ -66,7 +63,6 @@ import { ServicesModule } from "./services/services.module";
import { AboutComponent } from "./settings/about.component";
import { AutofillComponent } from "./settings/autofill.component";
import { ExcludedDomainsComponent } from "./settings/excluded-domains.component";
import { ExportComponent } from "./settings/export.component";
import { FolderAddEditComponent } from "./settings/folder-add-edit.component";
import { FoldersComponent } from "./settings/folders.component";
import { HelpAndFeedbackComponent } from "./settings/help-and-feedback.component";
@@ -77,9 +73,11 @@ import { SyncComponent } from "./settings/sync.component";
import { VaultTimeoutInputComponent } from "./settings/vault-timeout-input.component";
import { TabsComponent } from "./tabs.component";
// Register the locales for the application
import "./locales";
@NgModule({
imports: [
CommonModule,
A11yModule,
AppRoutingModule,
BitwardenToastModule.forRoot({
@@ -98,6 +96,7 @@ import { TabsComponent } from "./tabs.component";
ReactiveFormsModule,
ScrollingModule,
ServicesModule,
DialogModule,
],
declarations: [
ActionButtonsComponent,

View File

@@ -1,10 +1,18 @@
import { enableProdMode } from "@angular/core";
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
import BrowserPlatformUtilsService from "../services/browserPlatformUtils.service";
require("./scss/popup.scss");
import { AppModule } from "./app.module";
// We put this first to minimize the delay in window changing.
// Should be removed once we deprecate support for Safari 16.0 and older. See Jira ticket [PM-1861]
if (BrowserPlatformUtilsService.shouldApplySafariHeightFix(window)) {
document.documentElement.classList.add("safari_height_fix");
}
if (process.env.ENV === "production") {
enableProdMode();
}

View File

@@ -240,6 +240,7 @@ header {
&[disabled] {
opacity: 0.65;
cursor: default !important;
background-color: inherit !important;
}
i + span {
@@ -302,6 +303,19 @@ header {
color: themed("headerInputPlaceholderColor");
}
}
/** make the cancel button visible in both dark/light themes **/
&[type="search"]::-webkit-search-cancel-button {
-webkit-appearance: none;
appearance: none;
height: 15px;
width: 15px;
background-repeat: no-repeat;
mask-image: url("../images/close-button-white.svg");
-webkit-mask-image: url("../images/close-button-white.svg");
@include themify($themes) {
background-color: themed("headerInputColor");
}
}
}
}
@@ -449,19 +463,6 @@ main {
main {
bottom: 55px;
}
[type="search"]::-webkit-search-cancel-button {
-webkit-appearance: none;
appearance: none;
height: 15px;
width: 15px;
background-repeat: no-repeat;
mask-image: url("../images/close-button-white.svg");
-webkit-mask-image: url("../images/close-button-white.svg");
@include themify($themes) {
background-color: themed("headerInputColor");
}
}
}
.center-content,

View File

@@ -1,15 +1,17 @@
@import "variables.scss";
html.browser_safari {
body {
height: 360px !important;
&.safari_height_fix {
body {
height: 360px !important;
&.body-xs {
height: 300px !important;
}
&.body-xs {
height: 300px !important;
}
&.body-full {
height: 100% !important;
&.body-full {
height: 100% !important;
}
}
}

View File

@@ -0,0 +1,79 @@
import { Injectable } from "@angular/core";
import Swal, { SweetAlertIcon } from "sweetalert2";
import {
DialogService,
SimpleDialogOptions,
SimpleDialogType,
} from "@bitwarden/angular/services/dialog";
@Injectable()
export class BrowserDialogService extends DialogService {
async openSimpleDialog(options: SimpleDialogOptions) {
const defaultCancel =
options.cancelButtonText === undefined
? options.acceptButtonText == null
? "no"
: "cancel"
: null;
return this.legacyShowDialog(
this.translate(options.content),
this.translate(options.title),
this.translate(options.acceptButtonText, "yes"),
this.translate(options.cancelButtonText, defaultCancel),
options.type
);
}
private async legacyShowDialog(
body: string,
title?: string,
confirmText?: string,
cancelText?: string,
type?: SimpleDialogType
) {
let iconClasses: string = null;
let icon: SweetAlertIcon = null;
if (type != null) {
// If you add custom types to this part, the type to SweetAlertIcon cast below needs to be changed.
switch (type) {
case "success":
iconClasses = "bwi-check text-success";
icon = "success";
break;
case "warning":
iconClasses = "bwi-exclamation-triangle text-warning";
icon = "warning";
break;
case "danger":
iconClasses = "bwi-error text-danger";
icon = "error";
break;
case "info":
iconClasses = "bwi-info-circle text-info";
icon = "info";
break;
default:
break;
}
}
const confirmed = await Swal.fire({
heightAuto: false,
buttonsStyling: false,
icon: icon,
iconHtml:
iconClasses != null ? `<i class="swal-custom-icon bwi ${iconClasses}"></i>` : undefined,
text: body,
titleText: title,
showCancelButton: cancelText != null,
cancelButtonText: cancelText,
showConfirmButton: true,
confirmButtonText: confirmText == null ? this.i18nService.t("ok") : confirmText,
timer: 300000,
});
return confirmed.value;
}
}

View File

@@ -1,16 +1,14 @@
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service";
import { SearchService } from "@bitwarden/common/services/search.service";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
export class PopupSearchService extends SearchService {
constructor(
private mainSearchService: SearchService,
cipherService: CipherService,
consoleLogService: ConsoleLogService,
i18nService: I18nService
) {
super(cipherService, consoleLogService, i18nService);
super(consoleLogService, i18nService);
}
clearIndex() {

View File

@@ -2,6 +2,7 @@ import { APP_INITIALIZER, LOCALE_ID, NgModule } from "@angular/core";
import { LockGuard as BaseLockGuardService } from "@bitwarden/angular/auth/guards/lock.guard";
import { UnauthGuard as BaseUnauthGuardService } from "@bitwarden/angular/auth/guards/unauth.guard";
import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog";
import { MEMORY_STORAGE, SECURE_STORAGE } from "@bitwarden/angular/services/injection-tokens";
import { JslibServicesModule } from "@bitwarden/angular/services/jslib-services.module";
import { ThemingService } from "@bitwarden/angular/services/theming/theming.service";
@@ -17,7 +18,6 @@ import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service";
import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service";
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileUploadService } from "@bitwarden/common/abstractions/file-upload/file-upload.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service";
@@ -79,6 +79,7 @@ import {
import { PasswordRepromptService as PasswordRepromptServiceAbstraction } from "@bitwarden/common/vault/abstractions/password-reprompt.service";
import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction";
import { FolderApiService } from "@bitwarden/common/vault/services/folder/folder-api.service";
import { VaultExportServiceAbstraction } from "@bitwarden/exporter/vault-export";
import { BrowserOrganizationService } from "../../admin-console/services/browser-organization.service";
import { BrowserPolicyService } from "../../admin-console/services/browser-policy.service";
@@ -101,6 +102,7 @@ import { PasswordRepromptService } from "../../vault/popup/services/password-rep
import { BrowserFolderService } from "../../vault/services/browser-folder.service";
import { VaultFilterService } from "../../vault/services/vault-filter.service";
import { BrowserDialogService } from "./browser-dialog.service";
import { DebounceNavigationService } from "./debounceNavigationService";
import { InitService } from "./init.service";
import { PopupSearchService } from "./popup-search.service";
@@ -164,19 +166,14 @@ function getBgService<T>(service: keyof MainBackground) {
},
{
provide: SearchServiceAbstraction,
useFactory: (
cipherService: CipherService,
logService: ConsoleLogService,
i18nService: I18nServiceAbstraction
) => {
useFactory: (logService: ConsoleLogService, i18nService: I18nServiceAbstraction) => {
return new PopupSearchService(
getBgService<SearchService>("searchService")(),
cipherService,
logService,
i18nService
);
},
deps: [CipherService, LogServiceAbstraction, I18nServiceAbstraction],
deps: [LogServiceAbstraction, I18nServiceAbstraction],
},
{ provide: AuditService, useFactory: getBgService<AuditService>("auditService"), deps: [] },
{
@@ -347,7 +344,11 @@ function getBgService<T>(service: keyof MainBackground) {
useFactory: getBgService<AutofillService>("autofillService"),
deps: [],
},
{ provide: ExportService, useFactory: getBgService<ExportService>("exportService"), deps: [] },
{
provide: VaultExportServiceAbstraction,
useFactory: getBgService<VaultExportServiceAbstraction>("exportService"),
deps: [],
},
{
provide: KeyConnectorService,
useFactory: getBgService<KeyConnectorService>("keyConnectorService"),
@@ -490,6 +491,10 @@ function getBgService<T>(service: keyof MainBackground) {
useClass: BrowserConfigService,
deps: [StateServiceAbstraction, ConfigApiServiceAbstraction],
},
{
provide: DialogServiceAbstraction,
useClass: BrowserDialogService,
},
],
})
export class ServicesModule {}

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