Merge remote-tracking branch 'origin/develop' into HEAD

This commit is contained in:
Aleksandr Kolbasov 2025-12-29 23:58:14 +03:00
commit 910957cae6
47 changed files with 1070 additions and 479 deletions

View file

@ -1,3 +1,20 @@
1.9.11 (2025-11-26)
=========================
- Add support for reseting all settings to defaults [#2720]
- Add support for toJSON() with createPublicKeyCredential (passkeys) [#2734]
- Add site exception for dei.gr [#2760]
- Add submit button exception for Dubverse [#2759]
- Add support for selecting a custom submit button with Custom Login Fields [#2756]
- Fix check for Firefox browser [#2724, #2725]
- Fix JavaScript error in console (thanks ygoe) [#2721]
- Fix overlap check with labels [#2731]
- Fix checking overlays before fill [#2733]
- Fix requerying form if password input changed [#2738]
- Fix incorrect fields variable [#2740]
- Fix malformed page content with passkeys script injection (thanks a2kolbasov) [#2757]
- Fix layout issues with banners [#2764]
- Update Playwright libraries [#2727]
1.9.10 (2025-10-05)
=========================
- Add Disable passkeys option to Site Preferences [#2694]

View file

@ -1,8 +1,8 @@
{
"manifest_version": 3,
"name": "KeePassXC-Browser",
"version": "1.9.10",
"version_name": "1.9.10",
"version": "1.9.11",
"version_name": "1.9.11",
"minimum_chrome_version": "93",
"description": "__MSG_extensionDescription__",
"author": "KeePassXC Team",
@ -53,7 +53,8 @@
"content/fields.js",
"content/fill.js",
"content/form.js",
"content/icons.js",
"content/icon.js",
"content/icon-handler.js",
"content/keepassxc-browser.js",
"content/observer-helper.js",
"content/pwgen.js",

View file

@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "KeePassXC-Browser",
"version": "1.9.10",
"version": "1.9.11",
"description": "__MSG_extensionDescription__",
"author": "KeePassXC Team",
"icons": {
@ -66,7 +66,8 @@
"content/fields.js",
"content/fill.js",
"content/form.js",
"content/icons.js",
"content/icon.js",
"content/icon-handler.js",
"content/keepassxc-browser.js",
"content/observer-helper.js",
"content/pwgen.js",

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Поле за низ",
"message": "Текстово поле",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Изпращащ бутон",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Избиране поле за потребителското име",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Избиране на поле за низ",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Избиране на изпращащ бутон",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Потвърдете избора си или изберете повече полета като полета за низ.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Потвърдете избора си или изберете повече полета като текстови полета.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Също можете да използвате цифрите, за да избирате полета посредством клавиатурата.",
@ -362,6 +370,10 @@
"message": "Полета за низове",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Изпращащ бутон",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- без потребителско име -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Изнасяне на настройки",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Нулиране на настройките",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Група по подразбиране при добавяне на регистрации:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Текущите настройки ще бъдат презаписани. Наистина ли желаете да бъдат внесени настройките от файла?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Желаете ли настройките да бъдат нулирани до подразбираните стойности?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Хранилища, свързани с KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Strengfelt",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Vælg et brugernavnsfelt",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Vælg strengfelter",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Bekræft venligst dine valg eller vælge flere felter as strengfelter.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Du kan også bruge nummeret til at vælge inputfelterne fra tastaturet.",
@ -362,6 +370,10 @@
"message": "Strengfelter",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- intet brugernavn -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Eksportér indstillinger",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Standardgruppe for gemte nye adgangskoder:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "De nuværende indstillinger tilsidesættes. Vil du virkelig importere indstillingsfilen?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Databaser som er forbundet til KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -322,6 +322,10 @@
"message": "Zeichenkettenfeld",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Senden-Schaltfläche",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Feld für Benutzernamen auswählen",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Zeichenkettenfelder auswählen",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Senden-Schaltfläche auswählen",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Bitte bestätigen Sie Ihre Auswahl oder wählen Sie weitere Felder als <em>Zeichenkettenfelder</em> aus.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Bitte bestätigen Sie Ihre Auswahl oder wählen Sie weitere Felder als Zeichenkettenfelder aus.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Sie können die Zahlen auch verwenden, um die Eingabefelder über die Tastatur auszuwählen.",
@ -362,6 +370,10 @@
"message": "Zeichenkettenfelder",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Senden-Schaltfläche",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- kein Benutzername -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Einstellungen exportieren",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Alle Einstellungen zurücksetzen",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Standardgruppe zum Speichern neuer Passwörter:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Die aktuellen Einstellungen werden überschrieben. Möchten Sie die Einstellungsdatei wirklich importieren?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Alle Einstellungen werden auf die Standardeinstellungen zurückgesetzt. Sind Sie sicher?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Die folgenden KeePassXC-Datenbanken sind mit dem KeePassXC-Browser verbunden.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Πεδίο String",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Επιλέξτε ένα πεδίο ονόματος χρήστη",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Επιλέξτε Πεδία Strings",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Επιβεβαιώστε την επιλογή σας ή επιλέξτε περισσότερα πεδία ως πεδία String.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Μπορείτε επίσης να χρησιμοποιήσετε τους αριθμούς για να επιλέξετε τα πεδία εισαγωγής από το πληκτρολόγιο.",
@ -362,6 +370,10 @@
"message": "Πεδία Strings",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- χωρίς όνομα χρήστη -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Ρυθμίσεις εξαγωγής",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Προεπιλεγμένη ομάδα για την αποθήκευση νέων κωδικών πρόσβασης:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Οι τρέχουσες ρυθμίσεις θα παρακαμφθούν. Θέλετε πραγματικά να εισαγάγετε το αρχείο ρυθμίσεων;",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Συνδεδεμένες βάσεις δεδομένων με το KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "String field",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Choose a username field",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Choose String Fields",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Please confirm your selection or choose more fields as String fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "You can also use the numbers to choose the input fields from keyboard.",
@ -362,6 +370,10 @@
"message": "String Fields",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- no username -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Export settings",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Default group for saving new passwords:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Current settings will be overridden. Do you really want to import the settings file?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Databases connected to KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -322,6 +322,10 @@
"message": "Campo de cadena",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Botón Enviar",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Elija un campo nombre de usuario",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Elija Campos de Cadena",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Seleccione el botón enviar",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Confirme su selección o elija más campos como Campos de cadena.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Confirme su selección o elija más campos como campos de cadena.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "También puede utilizar los números para elegir los campos de entrada desde el teclado.",
@ -362,6 +370,10 @@
"message": "Campos de Cadena",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Botón Enviar",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- sin nombre de usuario -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Exportar configuración",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Restablecer todos los ajustes",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Grupo predeterminado para guardar nuevas contraseñas:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "La configuración actual será sobrescrita. ¿Desea importar el archivo de configuración?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Todos los ajustes se restablecerán a los valores predeterminados. ¿Está seguro?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Las siguientes bases de datos KeePassXC están conectadas a KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Lisämerkkijonokenttä #",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Valitse käyttäjätunnuksen kenttä",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Valitse lisämerkkijonokentät",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Vahvista valintasi tai merkitse lisää kenttiä <em>lisämerkkijonokentiksi</em>.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Voit myös valita kenttiä käyttämällä näppäimistön numeroita.",
@ -362,6 +370,10 @@
"message": "Lisämerkkijonokentät",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- ei käyttäjätunnusta -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Vie asetukset",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Palauta kaikki asetukset oletuksiin",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Oletusryhmä johon uudet salasanat tallennetaan:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Nykyiset asetukset ylikirjoitetaan. Oletko varma, että haluat tuoda asetustiedoston?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Kaikki asetukset palautetaan oletuksiin. Oletko varma?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Seuraavat KeePassXC:n tietokannat ovat yhdistettynä selainlaajennukseen.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Champ de chaîne de caractères",
"message": "Champ de chaînes de caractères",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Bouton denvoi",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Choisissez un champ de nom dutilisateur",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Choisissez des champs de chaînes de caractères",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choisir le bouton denvoi",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Confirmez votre choix ou choisissez dautres champs comme champs de chaînes de caractères.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Vous pouvez aussi utiliser les chiffres pour choisir les champs dentrée avec le clavier.",
@ -362,6 +370,10 @@
"message": "Champs de type chaîne",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Bouton denvoi",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": " aucun nom dutilisateur ",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Exporter les paramètres",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Réinitialiser tous les paramètres",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Groupe par défaut pour lenregistrement des nouveaux mots de passe :",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Les paramètres actuels seront remplacés. Voulez-vous importer le fichier de paramètres?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Tous les paramètres seront réinitialisés aux valeurs par défaut. Confirmez-vous?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Bases de données KeePassXC connectées à KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "שדה מחרוזת #",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "נא לבחור שדה שם משתמש",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "נא לבחור שדה מחרוזת",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "נא לאשר את הבחירה או לבחור שדות נוספים כשדות מחרוזת.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "ניתן להשתמש גם במספרים לבחירת שדות הקלט מלוח המקשים.",
@ -362,6 +370,10 @@
"message": "שדות מחרוזת",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- אין שם משתמש -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "ייצוא הגדרות",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "קבוצת ברירת מחדל לשמירת ססמאות חדשות:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "ההגדרות הנוכחיות יידרסו. האם לייבא את קובץ ההגדרות?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "מסדי נתונים מחוברים לדפדפן־KeePassXC.",
"description": "Info text about connected databases."

View file

@ -8,7 +8,7 @@
"description": "Add button title text on Site Preferences tab."
},
"editSitePreferenceButtonTitle": {
"message": "Edit URL for this Site Preferences.",
"message": "URL-cím szerkesztése ezen webhely beállításai számára.",
"description": "Edit button title text on Site Preferences tab."
},
"allowIframeButtonTitle": {
@ -20,7 +20,7 @@
"description": "Connect button title text."
},
"copyDebugInfoButtonTitle": {
"message": "Copy debug info to clipboard",
"message": "Hibakeresési információk másolása a vágólapra",
"description": "Copy debug info button title text on About tab."
},
"dismissHttpAuthButtonTitle": {
@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Karakterláncmező",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Válasszon egy felhasználónév-mezőt",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Válasszon egy karakterláncmezőt",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Erősítse meg a választását vagy válasszon több mezőt <em>karakterlánc mezőkként</em>.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Használhatja a billentyűzeten lévő számokat is a beviteli mezők kiválasztásához.",
@ -362,6 +370,10 @@
"message": "Karakterláncmezők",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": " nincs felhasználónév ",
"description": "Shown when no username is set in the credentials."
@ -371,7 +383,7 @@
"description": "Shown when no credentials are found for the current page."
},
"credentialsBlockedInIframe": {
"message": "Credential fill blocked in untrusted iframe.",
"message": "A hitelesítő adatok kitöltése blokkolása a nem megbízható iframe-ben.",
"description": "Alert message when filling credentials is blocked due to iframe restrictions."
},
"credentialsMultipleFound": {
@ -631,11 +643,11 @@
"description": "Dismiss button text when in HTTP Authentication popup."
},
"optionsDefaultSettingsTitle": {
"message": "Default settings",
"message": "Alapértelmezett beállítások",
"description": "Default settings title for Getting Started page."
},
"optionsWelcomeTitle": {
"message": "KeePassXC-Browser",
"message": "KeePassXC-böngésző",
"description": "Main card title for Getting Started page."
},
"optionsTitle": {
@ -679,7 +691,7 @@
"description": "Site Preferences page header."
},
"optionsSitePreferencesSettings": {
"message": "Settings",
"message": "Beállítások",
"description": "Site Preferences settings button text."
},
"optionsMenuAbout": {
@ -707,7 +719,7 @@
"description": "Add button text."
},
"optionsButtonEdit": {
"message": "Edit",
"message": "Szerkesztés",
"description": "Edit button text."
},
"optionsButtonUpdate": {
@ -734,6 +746,10 @@
"message": "Beállítások exportálása",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Minden beállítás visszaállítása",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Alapértelmezett csoport az új jelszavak mentéséhez:",
"description": "Default group options text."
@ -791,7 +807,7 @@
"description": "Automatically fill-in single credential entry checkbox text."
},
"optionsCheckboxAutoFillRelevantCredential": {
"message": "Automatically fill in relevant credential entries",
"message": "Releváns hitelesítésiadat-bejegyzések automatikus kitöltése",
"description": "Automatically fill-in relevant credential entry checkbox text."
},
"optionsCheckboxAutoFillSingleTotp": {
@ -835,11 +851,11 @@
"description": "Show login notifications checkbox text."
},
"optionsDefaultPasswordManager": {
"message": "Set as default password manager",
"message": "Beállítás alapértelmezett jelszókezelőnek.",
"description": "Default password manager checkbox text."
},
"optionsDefaultPasswordManagerHelpText": {
"message": "Sets KeePassXC-Browser as the default password manager for the browser.",
"message": "A KeePassXC-böngészőt beállítja alapértelmezett jelszókezelőnek a böngészőben.",
"description": "Default password manager help text."
},
"optionsRedirectAllowance": {
@ -939,7 +955,7 @@
"description": "OTP field icon option help text."
},
"optionsHideIconsAlertText": {
"message": "You can also hide icons manually when needed with shift+click.",
"message": "Szükség esetén az ikonok manuálisan is elrejthetők Shift+kattintással.",
"description": "Hide icons alert text text."
},
"optionsAutoRetrieveCredentialsHelpText": {
@ -955,7 +971,7 @@
"description": "Auto-Fill Single Entry option help text."
},
"optionsAutoFillRelevantCredentialHelpText": {
"message": "Automatically fill in the relevant credential if a second fill is needed.",
"message": "Releváns hitelesítésiadat-bejegyzések automatikus kitöltése ha egy második kitöltés is szükséges.",
"description": "Auto-Fill Relevant Credential option help text."
},
"optionsAutoFillSingleEntryWarning": {
@ -1074,6 +1090,10 @@
"message": "A jelenlegi beállítások felül lesznek írva. Biztos, hogy importálja a beállításfájlt?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Minden beállítás alapértelmezett értékre áll vissza. Valóban ezt szeretné?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "A következő KeePassXC adatbázisok vannak kapcsolódva a KeePassXC-böngészőhöz.",
"description": "Info text about connected databases."
@ -1119,7 +1139,7 @@
"description": "Site Preferences list column title."
},
"optionsColumnFeatures": {
"message": "Features",
"message": "Képességek",
"description": "Site Preferences list column title."
},
"optionsColumnUsernameOnly": {
@ -1151,7 +1171,7 @@
"description": "Site Preferences option selection."
},
"optionsSelectionPasskeys": {
"message": "Disable passkeys",
"message": "Jelkulcsok letiltása",
"description": "Site Preferences option selection."
},
"optionsSelectionFull": {
@ -1407,31 +1427,31 @@
"description": "Lock database button title text."
},
"welcomeText": {
"message": "Welcome to KeePassXC-Browser!",
"message": "Üdvözöljük a KeePassXC-böngészőben!",
"description": "Main title of Getting Started page."
},
"documentationGettingStarted": {
"message": "Our Getting Started Guide will get you up and running quickly.",
"message": "A bevezető útmutatónk segítségével gyorsan elsajátíthatja a használatot.",
"description": "Getting Started document text."
},
"documentationUserGuide": {
"message": "Looking for more comprehensive documentation? Our User Guide is there to help.",
"message": "Átfogóbb dokumentációra lenne szüksége? A felhasználói útmutatónk segíthet.",
"description": "User Guide text."
},
"documentationTroubleshootingGuide": {
"message": "Need help troubleshooting the browser integration? Check the Troubleshooting Guide.",
"message": "Segítségre van szüksége a böngésző integrációjának hibaelhárításában? Olvassa el a hibaelhárítási útmutatót.",
"description": "Troubleshooting Guide text."
},
"gettingStartedWelcomeText": {
"message": "Welcome to KeePassXC-Browser, the official browser extension for KeePassXC.",
"message": "Üdvözlet a KeePassXC-böngészőben, a KeePassXC hivatalos böngészőbővítményében.",
"description": "Welcome to KeePassXC-Browser, the official browser extension for KeePassXC."
},
"gettingStartedSecondWelcomeText": {
"message": "Please go through the default settings and check all your preferred options.",
"message": "Kérjük, nézze át az alapértelmezett beállításokat és ellenőrizze az összes kívánt opciót.",
"description": "Please go through the default settings and check all your preferred options."
},
"gettingStartedNewUser": {
"message": "Are you a new user? Check links to our documentation.",
"message": "Új felhasználó? Nézze meg a hivatkozott dokumentációt!",
"description": "Are you a new user? Check links to our documentation."
}
}

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Ruas lema",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Pilih ruas nama pengguna",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Pilih Ruas String",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Harap konfirmasi pilihan Anda atau pilih lebih banyak bidang sebagai bidang String.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Anda juga dapat menggunakan angka untuk memilih bidang input dari keyboard.",
@ -362,6 +370,10 @@
"message": "Ruas String",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- tidak ada nama pengguna -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Ekspor pengaturan",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Grup baku untuk menyimpan sandi baru:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Pengaturan saat ini akan diganti. Apakah Anda benar-benar ingin mengimpor berkas pengaturan?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Basis data terhubung ke KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Campo stringa",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Scegli un campo nome utente",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Scegli campi stringa",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Conferma la selezione o scegli altri campi come campi stringa.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Puoi anche usare i numeri per scegliere i campi di input dalla tastiera.",
@ -362,6 +370,10 @@
"message": "Campi stringa",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- nessun nome utente -",
"description": "Shown when no username is set in the credentials."
@ -371,7 +383,7 @@
"description": "Shown when no credentials are found for the current page."
},
"credentialsBlockedInIframe": {
"message": "Credential fill blocked in untrusted iframe.",
"message": "Riempimento delle credenziali bloccato in iframe non attendibile.",
"description": "Alert message when filling credentials is blocked due to iframe restrictions."
},
"credentialsMultipleFound": {
@ -679,7 +691,7 @@
"description": "Site Preferences page header."
},
"optionsSitePreferencesSettings": {
"message": "Settings",
"message": "Impostazioni",
"description": "Site Preferences settings button text."
},
"optionsMenuAbout": {
@ -734,6 +746,10 @@
"message": "Esporta impostazioni",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Ripristina tutte le impostazioni",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Gruppo predefinito salvataggio nuove password:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Le impostazioni attuali verranno sovrascritte. Vuoi veramente importare le impostazioni?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Tutte le impostazioni verranno ripristinate ai valori predefiniti. Sei sicuro?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Database KeePassXC connessi a KeePassXC-Browser.",
"description": "Info text about connected databases."
@ -1119,7 +1139,7 @@
"description": "Site Preferences list column title."
},
"optionsColumnFeatures": {
"message": "Features",
"message": "Funzionalità",
"description": "Site Preferences list column title."
},
"optionsColumnUsernameOnly": {
@ -1151,7 +1171,7 @@
"description": "Site Preferences option selection."
},
"optionsSelectionPasskeys": {
"message": "Disable passkeys",
"message": "Disabilita passkeys",
"description": "Site Preferences option selection."
},
"optionsSelectionFull": {

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "文字列フィールド",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "ユーザー名フィールドを選択してください",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "文字列フィールドを選択してください",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "選択したものを確認するか、文字列フィールドとして別のフィールドを追加で選択してください。",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "キーボードの数字キーで入力フィールドを選択できます。",
@ -362,6 +370,10 @@
"message": "文字列フィールド",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- ユーザー名なし -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "設定をエクスポート",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "新しいパスワードを保存するデフォルトのグループ:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "現在の設定を上書きします。本当に設定ファイルをインポートしますか?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "KeePassXC-Browser に接続されているデータベースです。",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "문자열 필드",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "사용자 이름 필드 선택",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "문자열 필드 선택",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "선택 사항을 확인하거나 더 많은 <em>문자열 필드</em>를 선택하십시오.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "키보드에서 숫자를 눌러서 입력 필드를 선택할 수 있습니다.",
@ -362,6 +370,10 @@
"message": "문자열 필드",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- 사용자 이름 없음 -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "설정 내보내기",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "새 암호를 저장할 기본 그룹:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "현재 설정을 덮어쓸 것입니다. 설정 파일을 가져오시겠습니까?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "다음 KeePassXC 데이터베이스가 KeePassXC-브라우저에 연결되어 있습니다.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Eilutės laukas",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Pasirinkite vartotojo vardo lauką",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Pasirinkite eilučių laukus",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Patvirtinkite savo pasirinkimą arba pasirinkite daugiau laukų kaip eilutės laukus.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Taip pat galite naudoti skaičius, kad pasirinktumėte įvesties laukus iš klaviatūros.",
@ -362,6 +370,10 @@
"message": "Eilučių laukai",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- nėra naudotojo vardo -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Eksportuoti nustatymus",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Numatytoji naujų slaptažodžių įrašymo grupė:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Dabartiniai nustatymai bus nepaisomi. Ar tikrai norite importuoti nustatymų failą?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Duomenų bazės, prijungtos prie \"KeePassXC-Browser\".",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Tekstfelt",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Velg et brukernavnfelt",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Velg tekstfelt",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Bekreft utvalget, eller velg flere felt som tekstfelt.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Du kan også bruke tallene til å velge innputtfeltene fra tastatur.",
@ -362,6 +370,10 @@
"message": "Tekstfelt",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- ikke noe brukernavn -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Eksporter innstillinger",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Standardgruppe for lagring av nye passord:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Gjeldende innstillinger vil bli overstyrt. Vil du virkelig importere filen med nye innstillinger?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Databaser koblet til KeePassXCBrowser.",
"description": "Info text about connected databases."

View file

@ -322,6 +322,10 @@
"message": "Tekenreeksveld",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Knop Indienen",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Kies een gebruikersnaamveld",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Kies tekenreeksvelden",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Knop Indienen kiezen",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Bevestig je selectie of stel meerdere velden in als <em>tekenreeksvelden</em>.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Bevestig de selectie of kies meer velden als tekenreeksvelden.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Je kunt tevens gebruikmaken van de numerieke toetsen op je toetsenbord.",
@ -362,6 +370,10 @@
"message": "Tekenreeksvelden",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Knop Indienen",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- geen gebruikersnaam -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Instellingen exporteren",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Alle instellingen opnieuw instellen",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Standaardgroep voor het opslaan van nieuwe wachtwoorden:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "De huidige instellingen worden overschreven. Weet je zeker dat je het instellingenbestand wilt importeren?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Alle instellingen worden teruggezet naar standaardinstellingen. Weet je het zeker?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Databases verbonden met KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -322,6 +322,10 @@
"message": "Pole ciągu",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Przycisk przesyłania",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Wybierz pole nazwy użytkownika",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Wybierz pola ciągów",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Wybierz przycisk przesyłania",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Potwierdź swój wybór lub wybierz więcej pól jako pola ciągów.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Możesz także użyć liczb, aby wybrać pola wprowadzania z klawiatury.",
@ -362,6 +370,10 @@
"message": "Pola ciągów",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Przycisk przesyłania",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- brak nazwy użytkownika -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Eksportuj ustawienia",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Resetuj wszystkie ustawienia",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Domyślna grupa do zapisywania nowych haseł:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Bieżące ustawienia zostaną zastąpione. Czy na pewno chcesz zaimportować plik ustawień?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Wszystkie ustawienia zostaną przywrócone do wartości domyślnych. Czy na pewno chcesz to zrobić?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Bazy danych podłączone do KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Campo para texto",
"message": "Campo do Texto",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Botão Enviar",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Escolha um campo para o nome de usuário",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Escolha os campos para texto",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Selecione o botão enviar",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Confirme a sua seleção ou escolha mais campos como texto.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Por favor, confirme sua seleção ou escolha mais campos como Campos de Texto.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Você também pode usar os números para escolher os campos de entrada do teclado.",
@ -362,6 +370,10 @@
"message": "Campos para texto",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Botão Enviar",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- sem usuário -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Exportar as configurações",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Redefinir todas as configurações",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Grupo padrão para salvar novas senhas:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "As configurações atuais serão substituídas. Deseja realmente importar o arquivo de configuração?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Todas as configurações serão redefinidas para os padrões. Tem certeza?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Os seguintes bancos de dados do KeePassXC estão conectados ao KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Campo de cadeia",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Escolha o campo para o nome de utilizador",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Escolha os campos de cadeia",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Confirme a sua seleção ou escolha mais campos como campos de cadeia",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Também pode usar os números para escolher os campos com o teclado",
@ -362,6 +370,10 @@
"message": "Campos de cadeia",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- sem nome de utilizador -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Exportar definições",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Grupo padrão para as novas palavras-passe:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "As definições atuais serão substituídas. Tem a certeza de que deseja importar os dados do ficheiro?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Bases de dados conectadas com KeePassXC-Browser",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "String field",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Choose a username field",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Choose String Fields",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Confirmați selecția sau alegeți mai multe câmpuri ca și câmpuri de tip șir de caractere.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "De asemenea, puteți utiliza numerele pentru a alege câmpurile de intrare de la tastatură.",
@ -362,6 +370,10 @@
"message": "String Fields",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "-niciun nume de utilizator-",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Setări de export",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Grup implicit pentru salvarea parolelor noi:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Setările curente vor fi anulate. Doriți cu adevărat să importați fișierul cu setări?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Baze de date conectate la KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -4,11 +4,11 @@
"description": "Name of the extension."
},
"addSitePreferenceButtonTitle": {
"message": "Добавить настройки сайта для этого URL.",
"message": "Добавить настройки сайта для этого URL-адреса.",
"description": "Add button title text on Site Preferences tab."
},
"editSitePreferenceButtonTitle": {
"message": "Edit URL for this Site Preferences.",
"message": "Изменить URL-адрес для этих настроек сайта.",
"description": "Edit button title text on Site Preferences tab."
},
"allowIframeButtonTitle": {
@ -20,7 +20,7 @@
"description": "Connect button title text."
},
"copyDebugInfoButtonTitle": {
"message": "Copy debug info to clipboard",
"message": "Копировать отладочную информацию в буфер обмена",
"description": "Copy debug info button title text on About tab."
},
"dismissHttpAuthButtonTitle": {
@ -244,7 +244,7 @@
"description": "Error notification shown when not connected to KeePassXC."
},
"errorCurrentDatabaseNotConnected": {
"message": "Current database is not connected.",
"message": "Текущая база данных не подключена.",
"description": "Error notification shown when current database is not connected during action."
},
"passwordGeneratorErrorTooLong": {
@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Строковое поле",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Выберите поле логина",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Выберите строковые поля",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Пожалуйста, подтвердите свой выбор или выберите больше строковых полей.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Вы также можете использовать числа для выбора полей ввода с клавиатуры.",
@ -362,6 +370,10 @@
"message": "Строковые поля",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- нет логина -",
"description": "Shown when no username is set in the credentials."
@ -371,7 +383,7 @@
"description": "Shown when no credentials are found for the current page."
},
"credentialsBlockedInIframe": {
"message": "Credential fill blocked in untrusted iframe.",
"message": "Заполнение учётных данных заблокировано в ненадежном iframe.",
"description": "Alert message when filling credentials is blocked due to iframe restrictions."
},
"credentialsMultipleFound": {
@ -631,7 +643,7 @@
"description": "Dismiss button text when in HTTP Authentication popup."
},
"optionsDefaultSettingsTitle": {
"message": "Default settings",
"message": "Настройки по умолчанию",
"description": "Default settings title for Getting Started page."
},
"optionsWelcomeTitle": {
@ -679,7 +691,7 @@
"description": "Site Preferences page header."
},
"optionsSitePreferencesSettings": {
"message": "Settings",
"message": "Настройки",
"description": "Site Preferences settings button text."
},
"optionsMenuAbout": {
@ -707,7 +719,7 @@
"description": "Add button text."
},
"optionsButtonEdit": {
"message": "Edit",
"message": "Изменить",
"description": "Edit button text."
},
"optionsButtonUpdate": {
@ -734,6 +746,10 @@
"message": "Экспорт настроек",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Сбросить все настройки",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Группа по умолчанию для сохранения новых паролей:",
"description": "Default group options text."
@ -791,7 +807,7 @@
"description": "Automatically fill-in single credential entry checkbox text."
},
"optionsCheckboxAutoFillRelevantCredential": {
"message": "Automatically fill in relevant credential entries",
"message": "Автоматически заполнять соответствующие записи учётных данных",
"description": "Automatically fill-in relevant credential entry checkbox text."
},
"optionsCheckboxAutoFillSingleTotp": {
@ -835,11 +851,11 @@
"description": "Show login notifications checkbox text."
},
"optionsDefaultPasswordManager": {
"message": "Set as default password manager",
"message": "Установить как менеджер паролей по умолчанию",
"description": "Default password manager checkbox text."
},
"optionsDefaultPasswordManagerHelpText": {
"message": "Sets KeePassXC-Browser as the default password manager for the browser.",
"message": "Устанавливает KeePassXC-Browser в качестве менеджера паролей по умолчанию для браузера.",
"description": "Default password manager help text."
},
"optionsRedirectAllowance": {
@ -939,7 +955,7 @@
"description": "OTP field icon option help text."
},
"optionsHideIconsAlertText": {
"message": "You can also hide icons manually when needed with shift+click.",
"message": "При необходимости вы также можете скрыть значки вручную, нажав Shift+клик.",
"description": "Hide icons alert text text."
},
"optionsAutoRetrieveCredentialsHelpText": {
@ -955,7 +971,7 @@
"description": "Auto-Fill Single Entry option help text."
},
"optionsAutoFillRelevantCredentialHelpText": {
"message": "Automatically fill in the relevant credential if a second fill is needed.",
"message": "Автоматически заполнить соответствующие учётные данные, если требуется повторное заполнение.",
"description": "Auto-Fill Relevant Credential option help text."
},
"optionsAutoFillSingleEntryWarning": {
@ -1074,6 +1090,10 @@
"message": "Текущие настройки будут переопределены. Вы действительно хотите импортировать файл настроек?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Все настройки будут сброшены на значения по умолчанию. Вы уверены?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Базы данных, подключенные к KeePassXC-Browser.",
"description": "Info text about connected databases."
@ -1119,7 +1139,7 @@
"description": "Site Preferences list column title."
},
"optionsColumnFeatures": {
"message": "Features",
"message": "Функции",
"description": "Site Preferences list column title."
},
"optionsColumnUsernameOnly": {
@ -1151,7 +1171,7 @@
"description": "Site Preferences option selection."
},
"optionsSelectionPasskeys": {
"message": "Disable passkeys",
"message": "Отключить ключи доступа",
"description": "Site Preferences option selection."
},
"optionsSelectionFull": {
@ -1407,31 +1427,31 @@
"description": "Lock database button title text."
},
"welcomeText": {
"message": "Welcome to KeePassXC-Browser!",
"message": "Добро пожаловать в KeePassXC-Browser!",
"description": "Main title of Getting Started page."
},
"documentationGettingStarted": {
"message": "Our Getting Started Guide will get you up and running quickly.",
"message": "Наше руководство по началу работы поможет вам быстро приступить к работе.",
"description": "Getting Started document text."
},
"documentationUserGuide": {
"message": "Looking for more comprehensive documentation? Our User Guide is there to help.",
"message": "Ищете более подробную документацию? Наше руководство пользователя вам поможет.",
"description": "User Guide text."
},
"documentationTroubleshootingGuide": {
"message": "Need help troubleshooting the browser integration? Check the Troubleshooting Guide.",
"message": "Нужна помощь в устранении неполадок интеграции с браузером? Ознакомьтесь с руководством по устранению неполадок.",
"description": "Troubleshooting Guide text."
},
"gettingStartedWelcomeText": {
"message": "Welcome to KeePassXC-Browser, the official browser extension for KeePassXC.",
"message": "Добро пожаловать в KeePassXC-Browser, официальное расширение браузера для KeePassXC.",
"description": "Welcome to KeePassXC-Browser, the official browser extension for KeePassXC."
},
"gettingStartedSecondWelcomeText": {
"message": "Please go through the default settings and check all your preferred options.",
"message": "Пожалуйста, проверьте настройки по умолчанию и выберите все предпочтительные параметры.",
"description": "Please go through the default settings and check all your preferred options."
},
"gettingStartedNewUser": {
"message": "Are you a new user? Check links to our documentation.",
"message": "Вы новый пользователь? Посмотрите ссылки на нашу документацию.",
"description": "Are you a new user? Check links to our documentation."
}
}

View file

@ -322,6 +322,10 @@
"message": "Strängfält",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Skicka-knapp",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Välj ett användarnamn-fält",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Välj sträng-fält",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Välj Skicka-knapp",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Vänligen bekräfta ditt val eller välj fler fält som <em>Strängfält</em>.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Bekräfta ditt val eller välj fler fält som strängfält.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "You can also use the numbers to choose the input fields from keyboard.",
@ -362,6 +370,10 @@
"message": "Strängfält",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Skicka-knapp",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- inget användarnamn -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Exportera inställningar",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Återställ alla inställningar",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Default group for saving new passwords:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Nuvarande inställningar kommer att skrivas över. Vill du verkligen importera inställningsfilen?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Alla inställningar kommer att återställas till standardinställning. Är du säker?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Följande KeePassXC-databaser är anslutna till KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -1,6 +1,6 @@
{
"extensionDescription": {
"message": "Modern tarayıcılar için KeePassXC bütünleşmesi",
"message": "Modern tarayıcılar için KeePassXC bütünleştirmesi",
"description": "Name of the extension."
},
"addSitePreferenceButtonTitle": {
@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Metin alanı",
"message": "Yazı alanı",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Gönder düğmesi",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Kullanıcı adı alanını seçin",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -335,12 +339,16 @@
"description": "Choosing a TOTP field text when choosing Custom Login Fields."
},
"defineChooseStringFields": {
"message": "Metin alanlarını seçin",
"message": "Yazı alanlarını seçin",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Gönder düğmesini seçin",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Lütfen seçiminizi onaylayın ya da dizge alanları olarak ek alanlar seçin.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Lütfen seçiminizi onaylayın ya da yazı alanları olarak ek alanlar seçin.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Giriş alanlarını tuş takımıyla seçmek için sayıları kullanabilirsiniz.",
@ -359,9 +367,13 @@
"description": "General text for password."
},
"stringFields": {
"message": "Metin alanları",
"message": "Yazı alanları",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Gönder düğmesi",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- kullanıcı adı yok -",
"description": "Shown when no username is set in the credentials."
@ -403,7 +415,7 @@
"description": "Message shown when no password fields are found."
},
"fieldsPasswordFillNotAccepted": {
"message": "Parolanın bir düz metin alanına yazılması engellenir.",
"message": "Parolanın bir düz yazı alanına yazılması engellenir.",
"description": "Message shown when password fill to a plain text field is prevented."
},
"rememberNothingChanged": {
@ -734,6 +746,10 @@
"message": "Ayarları dışa aktar",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Tüm ayarları sıfırla",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Yeni parolaların kaydedileceği varsayılan grup:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Var olan ayarlar değiştirilecek. Ayarlar dosyasını içe aktarmak istediğinize emin misiniz?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "Tüm ayarları varsayılan değerlerine sıfırlamak istediğinize emin misiniz? ",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "KeePassXC-Browser ile bağlantısı kurulmuş KeePassXC veri tabanları.",
"description": "Info text about connected databases."

View file

@ -319,9 +319,13 @@
"description": "Clear save data button text when choosing Custom Login Fields."
},
"defineStringField": {
"message": "Поле рядка",
"message": "String Field",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "Submit Button",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "Виберіть поле імені користувача",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "Оберіть поля рядків",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "Choose submit button",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "Підтвердьте свій вибір або виберіть більше полів як рядків.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "Please confirm your selection or choose more fields as String Fields.",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "Ви також можете використовувати числа для вибору полів введення з клавіатури.",
@ -362,6 +370,10 @@
"message": "Поля рядків",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "Submit Button",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- без імені користувача -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "Експортувати налаштування",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "Reset all settings",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "Типова група для збереження нових паролів:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "Поточні налаштування будуть перевизначені. Ви дійсно хочете імпортувати файл налаштувань?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "All settings will be reset to defaults. Are you sure?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "Під'єднані бази даних до KeePassXC-Browser.",
"description": "Info text about connected databases."

View file

@ -322,6 +322,10 @@
"message": "字符串字段",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "提交按钮",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "选择用户名字段",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "选择字符串字段",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "选择提交按钮",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "请确认您的选择,或选择更多字段作为字符串字段。",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "您也可以使用键盘的数字键选择输入字段。",
@ -362,6 +370,10 @@
"message": "字符串字段",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "提交按钮",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- 没有用户名 -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "导出配置",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "重置所有设置",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "保存新密码的默认群组:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "当前配置将会被覆盖,确定导入?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "所有设置都将重置为默认。您确定吗?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "已连接到 KeePassXC-Browser 的数据库。",
"description": "Info text about connected databases."

View file

@ -303,7 +303,7 @@
"description": "More button text when choosing Custom Login Fields."
},
"defineReset": {
"message": "重",
"message": "重",
"description": "Reset button text when choosing Custom Login Fields."
},
"defineConfirm": {
@ -322,6 +322,10 @@
"message": "字串欄位",
"description": "Text for string field."
},
"defineSubmitButton": {
"message": "送出按鈕",
"description": "Text for Submit Button."
},
"defineChooseUsername": {
"message": "選擇用戶名稱欄位",
"description": "Choosing a username field text when choosing Custom Login Fields."
@ -338,9 +342,13 @@
"message": "選擇字串欄位",
"description": "Choose String Fields a selection text when choosing Custom Login Fields."
},
"defineChooseSubmitButton": {
"message": "選擇送出按鈕",
"description": "Choose submit button selection text when choosing Custom Login Fields."
},
"defineHelpText": {
"message": "請確認您的選擇,或是選擇更多欄位作為<em>字串欄位</em>。",
"description": "Confirm a selection text when choosing Custom Login Fields which contains string fields."
"message": "請確認您的選擇,或選擇更多欄位作為字串欄位",
"description": "Confirm a selection text when choosing Custom Login Fields which contains String Fields."
},
"defineKeyboardText": {
"message": "您也可以使用鍵盤的數字鍵選擇輸入欄位。",
@ -362,6 +370,10 @@
"message": "字串欄位",
"description": "General text for a String Fields."
},
"submitButton": {
"message": "送出按鈕",
"description": "Custom Submit Button text."
},
"credentialsNoUsername": {
"message": "- 無用戶名稱 -",
"description": "Shown when no username is set in the credentials."
@ -734,6 +746,10 @@
"message": "導出配置",
"description": "Export settings button text."
},
"optionsButtonResetSettings": {
"message": "重設所有設定",
"description": "Reset all settings button text."
},
"optionsLabelDefaultGroup": {
"message": "儲存新密碼的預設群組:",
"description": "Default group options text."
@ -1074,6 +1090,10 @@
"message": "目前設定將會被覆寫。真的要匯入設定檔案?",
"description": "Import settings confirmation dialog help text."
},
"optionsResetSettingsDialogText": {
"message": "所有設定都將被重置為預設值。您確定嗎?",
"description": "Reset all settings dialog text."
},
"optionsConnectedDatabasesText": {
"message": "已連接至 KeePassXC-Browser 的資料庫。",
"description": "Info text about connected databases."

View file

@ -24,7 +24,7 @@ const defaultSettings = {
downloadFaviconAfterSave: false,
passkeys: false,
passkeysFallback: true,
redirectAllowance: 1,
redirectAllowance: 3,
saveDomainOnly: true,
showGettingStartedGuideAlert: true,
showGroupNameInAutocomplete: true,

View file

@ -18,7 +18,7 @@ kpxcFill.fillAttributeToActiveElementWith = async function(attr) {
return;
}
kpxcFill.setValue(el, value[0]);
await kpxcFill.setValue(el, value[0]);
};
// Fill requested from the context menu. Active element is used for combination detection
@ -152,20 +152,20 @@ kpxcFill.fillTOTPFromUuid = async function(el, uuid) {
return;
}
kpxcFill.setTOTPValue(el, totp);
await kpxcFill.setTOTPValue(el, totp);
} else if (user.stringFields?.length > 0) {
const stringFields = user.stringFields;
for (const s of stringFields) {
const val = s['KPH: {TOTP}'];
if (val) {
kpxcFill.setTOTPValue(el, val);
await kpxcFill.setTOTPValue(el, val);
}
}
}
};
// Set normal or segmented TOTP value
kpxcFill.setTOTPValue = function(elem, val) {
kpxcFill.setTOTPValue = async function(elem, val) {
if (kpxc.credentials.length === 0) {
logDebug('Error: Credential list is empty.');
return;
@ -173,22 +173,22 @@ kpxcFill.setTOTPValue = function(elem, val) {
for (const comb of kpxc.combinations) {
if (comb.totpInputs?.length > 0) {
kpxcFill.fillSegmentedTotp(elem, val, comb.totpInputs);
await kpxcFill.fillSegmentedTotp(elem, val, comb.totpInputs);
return;
}
}
kpxcFill.setValue(elem, val);
await kpxcFill.setValue(elem, val);
};
// Fill TOTP in parts
kpxcFill.fillSegmentedTotp = function(elem, val, totpInputs) {
kpxcFill.fillSegmentedTotp = async function(elem, val, totpInputs) {
if (!totpInputs.includes(elem) || val.length < totpInputs.length) {
return;
}
for (let i = 0; i < totpInputs.length; ++i) {
kpxcFill.setValue(totpInputs[i], val[i]);
await kpxcFill.setValue(totpInputs[i], val[i]);
}
};
@ -271,7 +271,7 @@ kpxcFill.fillInCredentials = async function(combination, predefinedUsername, uui
return;
}
kpxcFill.setValueWithChange(combination.password, selectedCredentials.password);
await kpxcFill.setValueWithChange(combination.password, selectedCredentials.password);
await kpxc.setPasswordFilled(true);
}
@ -279,20 +279,20 @@ kpxcFill.fillInCredentials = async function(combination, predefinedUsername, uui
if (combination.username && usernameValue && combination.username !== combination.password &&
(!combination.username.value || combination.username.value !== usernameValue)) {
if (!passOnly) {
kpxcFill.setValueWithChange(combination.username, usernameValue);
await kpxcFill.setValueWithChange(combination.username, usernameValue);
}
}
// Fill StringFields
if (selectedCredentials.stringFields?.length > 0) {
kpxcFill.fillInStringFields(combination.fields, selectedCredentials.stringFields);
await kpxcFill.fillInStringFields(combination.fields, selectedCredentials.stringFields);
}
// Fill TOTP
if (kpxc.settings.autoFillSingleTotp && kpxc.entryHasTotp(selectedCredentials)) {
const totpCombination = combination?.totp || kpxc.combinations?.find(c => c.totp);
if (totpCombination?.totp) {
kpxcFill.fillTOTPFromUuid(totpCombination.totp, selectedCredentials.uuid);
await kpxcFill.fillTOTPFromUuid(totpCombination.totp, selectedCredentials.uuid);
}
}
@ -306,7 +306,7 @@ kpxcFill.fillInCredentials = async function(combination, predefinedUsername, uui
};
// Fills StringFields defined in Custom Fields
kpxcFill.fillInStringFields = function(fields, stringFields) {
kpxcFill.fillInStringFields = async function(fields, stringFields) {
const filledInFields = [];
if (fields && stringFields && fields?.length > 0 && stringFields?.length > 0) {
for (let i = 0; i < fields.length; i++) {
@ -318,7 +318,7 @@ kpxcFill.fillInStringFields = function(fields, stringFields) {
const currentField = fields[i];
if (currentField && stringFieldValue[0]) {
kpxcFill.setValue(currentField, stringFieldValue[0], true);
await kpxcFill.setValue(currentField, stringFieldValue[0], true);
filledInFields.push(currentField);
}
}
@ -353,14 +353,14 @@ kpxcFill.performAutoSubmit = async function(combination, skipAutoSubmit) {
};
// Special handling for setting value to select and checkbox elements
kpxcFill.setValue = function(field, value, forced = false) {
kpxcFill.setValue = async function(field, value, forced = false) {
if (field.matches('select')) {
value = value.toLowerCase().trim();
const options = field.querySelectorAll('option');
for (const o of options) {
if (o.textContent.toLowerCase().trim() === value) {
kpxcFill.setValueWithChange(field, o.value);
await kpxcFill.setValueWithChange(field, o.value);
return false;
}
}
@ -378,11 +378,11 @@ kpxcFill.setValue = function(field, value, forced = false) {
}
kpxcFill.setValueWithChange(field, value, forced);
await kpxcFill.setValueWithChange(field, value, forced);
};
// Sets a new value to input field and triggers necessary events
kpxcFill.setValueWithChange = function(field, value, forced = false) {
kpxcFill.setValueWithChange = async function(field, value, forced = false) {
if (!field || (field?.readOnly && !forced)) {
return;
}
@ -401,12 +401,23 @@ kpxcFill.setValueWithChange = function(field, value, forced = false) {
};
field.focus();
field.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, cancelable: false }));
field.dispatchEvent(new KeyboardEvent('keypress', { bubbles: true, cancelable: false }));
field.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true, cancelable: false }));
field.dispatchEvent(new Event('input', { bubbles: true, cancelable: false }));
field.dispatchEvent(new Event('change', { bubbles: true, cancelable: false }));
// Use a delay to allow focus events to trigger and to give some
// breathing room to frameworks that rely on promises to update their
// state, like React. Not doing so can break OTP input, see issue #2215.
await Promise.resolve();
field.dispatchEvent(new FocusEvent('focus', { bubbles: false, cancelable: false }));
field.dispatchEvent(new FocusEvent('focusin', { bubbles: true, cancelable: false }));
// https://w3c.github.io/uievents/#keypress-event-order
field.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, cancelable: false, key: value }));
field.dispatchEvent(new InputEvent('beforeinput', { bubbles: true, cancelable: false, inputType: 'insertText', data: value }));
field.dispatchEvent(new KeyboardEvent('keypress', { bubbles: true, cancelable: false, key: value }));
field.value = value;
field.dispatchEvent(new Event('input', { bubbles: true, cancelable: false }));
field.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true, cancelable: false, key: value }));
field.dispatchEvent(new Event('change', { bubbles: true, cancelable: false }));
// Some pages will not accept the value change without dispatching events directly to the document
dispatchLegacyEvent(field, 'input');

View file

@ -0,0 +1,242 @@
'use strict';
/**
* @Object kpxcIcons
* Icon handling.
*/
const kpxcIcons = {};
kpxcIcons.icons = [];
kpxcIcons.iconTypes = {
DEFAULT: 0, // Username icon
PASSWORD: 1,
TOTP: 2
};
// Adds an icon to input field
kpxcIcons.addIcon = async function(field, iconType) {
if (!field || !Object.values(kpxcIcons.iconTypes).includes(iconType)) {
return;
}
let iconSet = false;
if (iconType === kpxcIcons.iconTypes.DEFAULT && kpxcUsernameIcons.isValid(field)) {
kpxcUsernameIcons.newIcon(field, kpxc.databaseState);
iconSet = true;
} else if (iconType === kpxcIcons.iconTypes.PASSWORD && kpxcPasswordIcons.isValid(field)) {
kpxcPasswordIcons.newIcon(field, kpxc.databaseState);
iconSet = true;
} else if (iconType === kpxcIcons.iconTypes.TOTP && kpxcTOTPIcons.isValid(field)) {
kpxcTOTPIcons.newIcon(field, kpxc.databaseState);
iconSet = true;
}
if (iconSet) {
kpxcIcons.icons.push({
field: field,
iconType: iconType
});
}
};
// Adds all icons from a form struct
kpxcIcons.addIconsFromForm = async function(form) {
const addUsernameIcons = async function(c) {
if (kpxc.settings.showLoginFormIcon && await kpxc.passwordFilledWithExceptions(c) === false) {
// Special case where everything else has been hidden, but a single password field is now displayed.
// For example PayPal and Amazon is handled like this.
if (c.username && !c.password && c.passwordInputs.length === 1) {
kpxcIcons.addIcon(c.passwordInputs[0], kpxcIcons.iconTypes.DEFAULT);
}
if (c.username && !c.username.readOnly) {
kpxcIcons.addIcon(c.username, kpxcIcons.iconTypes.DEFAULT);
} else if (c.password && (!c.username || (c.username && c.username.readOnly))) {
// Single password field
kpxcIcons.addIcon(c.password, kpxcIcons.iconTypes.DEFAULT);
}
}
};
const addPasswordIcons = async function(c) {
// Show password icons also with forms without any username field
if (kpxc.settings.usePasswordGeneratorIcons
&& ((c.username && c.password) || (!c.username && c.passwordInputs.length > 0))) {
for (const input of c.passwordInputs) {
kpxcIcons.addIcon(input, kpxcIcons.iconTypes.PASSWORD);
}
}
};
const addTOTPIcons = async function(c) {
if (c.totp && kpxc.settings.showOTPIcon) {
kpxcIcons.addIcon(c.totp, kpxcIcons.iconTypes.TOTP);
}
};
await Promise.all([
await addUsernameIcons(form),
await addPasswordIcons(form),
await addTOTPIcons(form)
]);
};
kpxcIcons.calculateIconOffset = function(field, size) {
const offset = Math.floor((field.offsetHeight / 2) - (size / 2) - 1);
return (offset < 0) ? 0 : offset;
};
// Delete all icons that have been hidden from the page view
kpxcIcons.deleteAllHiddenIcons = function() {
kpxcIcons.deleteIcons(kpxcUsernameIcons.icons);
kpxcIcons.deleteIcons(kpxcPasswordIcons.icons);
kpxcIcons.deleteIcons(kpxcTOTPIcons.icons);
};
// Delete hidden icons from the list
kpxcIcons.deleteIcons = function(iconList) {
const deletedIcons = [];
for (const icon of iconList) {
if (icon.inputField && !kpxcFields.isVisible(icon.inputField)) {
const index = iconList.indexOf(icon);
icon.removeIcon();
iconList.splice(index, 1);
deletedIcons.push(icon.inputField);
// Delete the input field from detected fields so the icon can be detected again
const inputFieldIndex = kpxc.inputs.indexOf(icon.inputField);
if (inputFieldIndex >= 0) {
kpxc.inputs.splice(inputFieldIndex, 1);
}
}
}
// Remove the same icons from kpxcIcons.icons array
for (const input of deletedIcons) {
const index = kpxcIcons.icons.findIndex(e => e.field === input);
if (index >= 0) {
kpxcIcons.icons.splice(index, 1);
}
}
};
// Initializes all icons needed to be shown
kpxcIcons.initIcons = async function(combinations = []) {
if (combinations.length === 0) {
return;
}
for (const form of kpxcForm.savedForms) {
await kpxcIcons.addIconsFromForm(form);
}
// Check for other combinations that are not in any form,
// or there's a form that wasn't present in savedForms (and it's not null)
for (const c of combinations) {
if (!c.form || (c.form && !kpxcForm.savedForms.some(sf => sf.form === c.form))) {
await kpxcIcons.addIconsFromForm(c);
}
}
};
kpxcIcons.hasIcon = function(field) {
return !field ? false : kpxcIcons.icons.some(i => i.field === field);
};
kpxcIcons.monitorIconPosition = function(iconClass) {
// Handle icon position on resize
window.addEventListener('resize', function(e) {
kpxcIcons.updateIconPosition(iconClass);
});
// Handle icon position on scroll
window.addEventListener('scroll', function(e) {
kpxcIcons.updateIconPosition(iconClass);
});
window.addEventListener('transitionend', function(e) {
if (matchesWithNodeName(e.target, 'INPUT') || matchesWithNodeName(e.target, 'TEXTAREA')) {
kpxcIcons.updateIconPosition(iconClass);
}
});
};
kpxcIcons.setIconPosition = function(icon, field, rtl = false, segmented = false) {
const rect = field.getBoundingClientRect();
const size = Number(icon.getAttribute('size'));
const offset = kpxcIcons.calculateIconOffset(field, size);
const zoom = kpxcUI.bodyStyle.zoom || 1;
let left = kpxcUI.getRelativeLeftPosition(rect) / zoom;
let top = kpxcUI.getRelativeTopPosition(rect) / zoom;
// Add more space for the icon to show it at the right side of the field if TOTP fields are segmented
if (segmented) {
left += size + 10;
}
// Adjusts the icon offset for certain sites
const iconOffset = kpxcSites.iconOffset(left, top, size, field?.getLowerCaseAttribute('type'));
if (iconOffset) {
left = iconOffset[0];
top = iconOffset[1];
}
const scrollTop = kpxcUI.getScrollTop() / zoom;
const scrollLeft = kpxcUI.getScrollLeft() / zoom;
icon.style.top = Pixels(top + scrollTop + offset + 1);
icon.style.left = rtl
? Pixels(left + scrollLeft + offset)
: Pixels(left + scrollLeft + field.offsetWidth - size - offset);
};
// Sets the icons to corresponding database lock status
kpxcIcons.switchIcons = async function() {
const uuid = await sendMessage('page_get_login_id');
kpxcUsernameIcons.switchIcon(kpxc.databaseState, uuid);
kpxcPasswordIcons.switchIcon(kpxc.databaseState, uuid);
kpxcTOTPIcons.switchIcon(kpxc.databaseState, uuid);
};
/**
* Detects if the input field appears or disappears -> show/hide the icon
* - boundingClientRect with slightly (< -10) negative values -> hidden
* - intersectionRatio === 0 -> hidden
* - isIntersecting === false -> hidden
* - intersectionRatio > 0 -> shown
* - isIntersecting === true -> shown
*/
kpxcIcons.updateFromIntersectionObserver = function(iconClass, entries) {
for (const entry of entries) {
const rect = DOMRectToArray(entry.boundingClientRect);
if ((entry.intersectionRatio === 0 && !entry.isIntersecting) || (rect.some(x => x < -10))) {
iconClass.icon.style.display = 'none';
} else if (entry.intersectionRatio > 0 && entry.isIntersecting) {
iconClass.icon.style.display = 'block';
// Wait for possible DOM animations
setTimeout(() => {
kpxcIcons.setIconPosition(iconClass.icon, entry.target, iconClass.rtl, iconClass.segmented);
}, 400);
}
}
};
kpxcIcons.updateIconPosition = function(iconClass) {
if (iconClass.inputField && iconClass.icon) {
kpxcIcons.setIconPosition(iconClass.icon, iconClass.inputField, iconClass.rtl, iconClass.segmented);
}
};
const DOMRectToArray = function (domRect) {
return [
domRect.bottom,
domRect.height,
domRect.left,
domRect.right,
domRect.top,
domRect.width,
domRect.x,
domRect.y,
];
};

View file

@ -0,0 +1,67 @@
'use strict';
const MIN_ICON_SIZE = 14;
const MAX_ICON_SIZE = 24;
// Basic icon class
class Icon {
constructor(field, databaseState = DatabaseState.DISCONNECTED, segmented = false) {
this.databaseState = databaseState;
this.icon = null;
this.inputField = null;
this.rtl = kpxcUI.isRTL(field);
this.segmented = segmented;
try {
this.observer = new IntersectionObserver((entries) => {
kpxcIcons.updateFromIntersectionObserver(this, entries);
});
} catch (err) {
logError(err);
}
}
// Size the icon dynamically, but not greater than 24 or smaller than 14
calculateIconSize(field) {
return Math.max(Math.min(MAX_ICON_SIZE, field.offsetHeight - 4), MIN_ICON_SIZE);
}
// Creates a wrapper div that has the icon in Shadow DOM
createWrapper(styleSheetFilename) {
const styleSheet = createStylesheet(styleSheetFilename);
const wrapper = document.createElement('div');
wrapper.style.all = 'unset';
wrapper.style.display = 'none';
// Make sure the wrapper is positioned correctly without CSS styles affecting to it
wrapper.style.position = 'absolute';
wrapper.style.top = Pixels(0);
wrapper.style.left = Pixels(0);
// Waits for stylesheet to load before displaying the element
styleSheet.addEventListener('load', () => wrapper.style.display = 'block');
this.shadowRoot = wrapper.attachShadow({ mode: 'closed' });
this.shadowRoot.append(styleSheet);
this.shadowRoot.append(this.icon);
document.body.append(wrapper);
kpxcUI.observeWrapper(wrapper);
}
removeIcon() {
this.shadowRoot.removeChild(this.icon);
document.body.removeChild(this.shadowRoot.host);
}
switchIcon(state, uuid) {
if (!this.icon) {
return;
}
if (state === DatabaseState.UNLOCKED) {
this.icon.style.filter = kpxc.credentials.length === 0 && !uuid ? 'saturate(0%)' : 'saturate(100%)';
} else {
this.icon.style.filter = 'saturate(0%)';
}
}
}

View file

@ -1,116 +0,0 @@
'use strict';
/**
* @Object kpxcIcons
* Icon handling.
*/
const kpxcIcons = {};
kpxcIcons.icons = [];
kpxcIcons.iconTypes = { USERNAME: 0, PASSWORD: 1, TOTP: 2 };
// Adds an icon to input field
kpxcIcons.addIcon = async function(field, iconType) {
if (!field || iconType < 0 || iconType > 2) {
return;
}
let iconSet = false;
if (iconType === kpxcIcons.iconTypes.USERNAME && kpxcUsernameIcons.isValid(field)) {
kpxcUsernameIcons.newIcon(field, kpxc.databaseState);
iconSet = true;
} else if (iconType === kpxcIcons.iconTypes.PASSWORD && kpxcPasswordIcons.isValid(field)) {
kpxcPasswordIcons.newIcon(field, kpxc.databaseState);
iconSet = true;
} else if (iconType === kpxcIcons.iconTypes.TOTP && kpxcTOTPIcons.isValid(field)) {
kpxcTOTPIcons.newIcon(field, kpxc.databaseState);
iconSet = true;
}
if (iconSet) {
kpxcIcons.icons.push({
field: field,
iconType: iconType
});
}
};
// Adds all icons from a form struct
kpxcIcons.addIconsFromForm = async function(form) {
const addUsernameIcons = async function(c) {
if (kpxc.settings.showLoginFormIcon && await kpxc.passwordFilledWithExceptions(c) === false) {
// Special case where everything else has been hidden, but a single password field is now displayed.
// For example PayPal and Amazon is handled like this.
if (c.username && !c.password && c.passwordInputs.length === 1) {
kpxcIcons.addIcon(c.passwordInputs[0], kpxcIcons.iconTypes.USERNAME);
}
if (c.username && !c.username.readOnly) {
kpxcIcons.addIcon(c.username, kpxcIcons.iconTypes.USERNAME);
} else if (c.password && (!c.username || (c.username && c.username.readOnly))) {
// Single password field
kpxcIcons.addIcon(c.password, kpxcIcons.iconTypes.USERNAME);
}
}
};
const addPasswordIcons = async function(c) {
// Show password icons also with forms without any username field
if (kpxc.settings.usePasswordGeneratorIcons
&& ((c.username && c.password) || (!c.username && c.passwordInputs.length > 0))) {
for (const input of c.passwordInputs) {
kpxcIcons.addIcon(input, kpxcIcons.iconTypes.PASSWORD);
}
}
};
const addTOTPIcons = async function(c) {
if (c.totp && kpxc.settings.showOTPIcon) {
kpxcIcons.addIcon(c.totp, kpxcIcons.iconTypes.TOTP);
}
};
await Promise.all([
await addUsernameIcons(form),
await addPasswordIcons(form),
await addTOTPIcons(form)
]);
};
// Delete all icons that have been hidden from the page view
kpxcIcons.deleteHiddenIcons = function() {
kpxcUsernameIcons.deleteHiddenIcons();
kpxcPasswordIcons.deleteHiddenIcons();
kpxcTOTPIcons.deleteHiddenIcons();
};
// Initializes all icons needed to be shown
kpxcIcons.initIcons = async function(combinations = []) {
if (combinations.length === 0) {
return;
}
for (const form of kpxcForm.savedForms) {
await kpxcIcons.addIconsFromForm(form);
}
// Check for other combinations that are not in any form,
// or there's a form that wasn't present in savedForms (and it's not null)
for (const c of combinations) {
if (!c.form || (c.form && !kpxcForm.savedForms.some(sf => sf.form === c.form))) {
await kpxcIcons.addIconsFromForm(c);
}
}
};
kpxcIcons.hasIcon = function(field) {
return !field ? false : kpxcIcons.icons.some(i => i.field === field);
};
// Sets the icons to corresponding database lock status
kpxcIcons.switchIcons = async function() {
const uuid = await sendMessage('page_get_login_id');
kpxcUsernameIcons.switchIcon(kpxc.databaseState, uuid);
kpxcPasswordIcons.switchIcon(kpxc.databaseState, uuid);
kpxcTOTPIcons.switchIcon(kpxc.databaseState, uuid);
};

View file

@ -939,9 +939,14 @@ browser.runtime.onMessage.addListener(async function(req, sender) {
kpxcFill.fillAttributeToActiveElementWith(req.args);
} else if (req.action === 'frame_message') {
if (req.args?.[0] === 'frame_request_to_frames' && window.self !== window.top) {
// Handle message from top window in iframe
kpxcCustomLoginFieldsBanner.handleParentWindowMessage(req.args);
} else if (req.args?.[0] === 'frame_request_to_parent' && window.self === window.top) {
// Handle message from iframe in top window
kpxcCustomLoginFieldsBanner.handleTopWindowMessage(req.args);
} else if (req.args?.[0] === 'notification_from_frame' && window.self === window.top) {
// Handle notification from iframe in top window
kpxcUI.createNotification(req?.args[1], req?.args[2]);
}
} else if (req.action === 'ignore_site') {
kpxc.ignoreSite(req.args);

View file

@ -266,7 +266,7 @@ kpxcObserverHelper.handleObserverAdd = async function(target) {
kpxc.prepareCredentials();
}
kpxcIcons.deleteHiddenIcons();
kpxcIcons.deleteAllHiddenIcons();
};
// Removes monitored elements
@ -280,7 +280,7 @@ kpxcObserverHelper.handleObserverRemove = function(target) {
return;
}
kpxcIcons.deleteHiddenIcons();
kpxcIcons.deleteAllHiddenIcons();
};
// Handles CSS transitionend event

View file

@ -77,7 +77,7 @@
attestationObject: kpxcBase64ToArrayBuffer(publicKey.response.attestationObject),
clientDataJSON: kpxcBase64ToArrayBuffer(publicKey.response.clientDataJSON),
getAuthenticatorData: () => kpxcBase64ToArrayBuffer(publicKey.response?.authenticatorData),
getPublicKey: () => null,
getPublicKey: () => publicKey.response?.publicKey ? publicKey.response?.publicKey : null,
getPublicKeyAlgorithm: () => publicKey.response?.publicKeyAlgorithm,
getTransports: () => [ 'internal' ]
};

View file

@ -11,10 +11,6 @@ kpxcPasswordIcons.switchIcon = function(state) {
kpxcPasswordIcons.icons.forEach(u => u.switchIcon(state));
};
kpxcPasswordIcons.deleteHiddenIcons = function() {
kpxcUI.deleteHiddenIcons(kpxcPasswordIcons.icons);
};
kpxcPasswordIcons.isValid = function(field) {
if (!field
|| field.readOnly
@ -34,7 +30,7 @@ class PasswordIcon extends Icon {
this.nextFieldExists = false;
this.initField(field);
kpxcUI.monitorIconPosition(this);
kpxcIcons.monitorIconPosition(this);
}
}
@ -93,7 +89,7 @@ PasswordIcon.prototype.createIcon = function(field) {
icon.addEventListener('mousedown', ev => ev.stopPropagation());
icon.addEventListener('mouseup', ev => ev.stopPropagation());
kpxcUI.setIconPosition(icon, field, this.rtl);
kpxcIcons.setIconPosition(icon, field, this.rtl);
this.icon = icon;
this.createWrapper('css/pwgen.css');
if (kpxcFields.popoverSupported) {

View file

@ -1,6 +1,6 @@
'use strict';
const ignoreRegex = /(bank|coupon|postal|user|zip|promo).*code|(en|de)code(d|r)*|comment|author|error/i;
const ignoreRegex = /(bank|coupon|post(al)?|user|zip|promo).*code|(en|de)code(d|r)*|comment|author|error/i;
const ignoredTypes = [ 'email', 'password', 'username' ];
const allowedInputTypes = [ 'number', 'password', 'tel', 'text' ];
@ -36,10 +36,6 @@ kpxcTOTPIcons.switchIcon = function(state, uuid) {
kpxcTOTPIcons.icons.forEach(u => u.switchIcon(state, uuid));
};
kpxcTOTPIcons.deleteHiddenIcons = function() {
kpxcUI.deleteHiddenIcons(kpxcTOTPIcons.icons);
};
kpxcTOTPIcons.autoCompleteIsOneTimeCode = function(field) {
if (!field) {
return false;
@ -109,7 +105,7 @@ class TOTPFieldIcon extends Icon {
super(field, databaseState, segmented);
this.initField(field, segmented);
kpxcUI.monitorIconPosition(this);
kpxcIcons.monitorIconPosition(this);
}
}
@ -185,7 +181,7 @@ TOTPFieldIcon.prototype.createIcon = function(field, segmented = false) {
icon.addEventListener('mousedown', ev => ev.stopPropagation());
icon.addEventListener('mouseup', ev => ev.stopPropagation());
kpxcUI.setIconPosition(icon, field, this.rtl, segmented);
kpxcIcons.setIconPosition(icon, field, this.rtl, segmented);
this.icon = icon;
this.createWrapper('css/totp.css');
if (kpxcFields.popoverSupported) {

View file

@ -7,9 +7,6 @@ const MIN_INPUT_FIELD_OFFSET_WIDTH = 60;
const MIN_OPACITY = 0.7;
const MAX_OPACITY = 1;
const MIN_ICON_SIZE = 14;
const MAX_ICON_SIZE = 24;
const BLUE_BUTTON = 'kpxc-button kpxc-blue-button';
const GREEN_BUTTON = 'kpxc-button kpxc-green-button';
const ORANGE_BUTTON = 'kpxc-button kpxc-orange-button';
@ -32,69 +29,6 @@ const $ = function(elem) {
return document.querySelector(elem);
};
// Basic icon class
class Icon {
constructor(field, databaseState = DatabaseState.DISCONNECTED, segmented = false) {
this.databaseState = databaseState;
this.icon = null;
this.inputField = null;
this.rtl = kpxcUI.isRTL(field);
this.segmented = segmented;
try {
this.observer = new IntersectionObserver((entries) => {
kpxcUI.updateFromIntersectionObserver(this, entries);
});
} catch (err) {
logError(err);
}
}
// Size the icon dynamically, but not greater than 24 or smaller than 14
calculateIconSize(field) {
return Math.max(Math.min(MAX_ICON_SIZE, field.offsetHeight - 4), MIN_ICON_SIZE);
}
// Creates a wrapper div that has the icon in Shadow DOM
createWrapper(styleSheetFilename) {
const styleSheet = createStylesheet(styleSheetFilename);
const wrapper = document.createElement('div');
wrapper.style.all = 'unset';
wrapper.style.display = 'none';
// Make sure the wrapper is positioned correctly without CSS styles affecting to it
wrapper.style.position = 'absolute';
wrapper.style.top = Pixels(0);
wrapper.style.left = Pixels(0);
// Waits for stylesheet to load before displaying the element
styleSheet.addEventListener('load', () => wrapper.style.display = 'block');
this.shadowRoot = wrapper.attachShadow({ mode: 'closed' });
this.shadowRoot.append(styleSheet);
this.shadowRoot.append(this.icon);
document.body.append(wrapper);
kpxcUI.observeWrapper(wrapper);
}
switchIcon(state, uuid) {
if (!this.icon) {
return;
}
if (state === DatabaseState.UNLOCKED) {
this.icon.style.filter = kpxc.credentials.length === 0 && !uuid ? 'saturate(0%)' : 'saturate(100%)';
} else {
this.icon.style.filter = 'saturate(0%)';
}
}
removeIcon() {
this.shadowRoot.removeChild(this.icon);
document.body.removeChild(this.shadowRoot.host);
}
}
const kpxcUI = {};
kpxcUI.mouseDown = false;
@ -131,63 +65,6 @@ kpxcUI.createElement = function(type, classes, attributes, textContent) {
return element;
};
kpxcUI.monitorIconPosition = function(iconClass) {
// Handle icon position on resize
window.addEventListener('resize', function(e) {
kpxcUI.updateIconPosition(iconClass);
});
// Handle icon position on scroll
window.addEventListener('scroll', function(e) {
kpxcUI.updateIconPosition(iconClass);
});
window.addEventListener('transitionend', function(e) {
if (matchesWithNodeName(e.target, 'INPUT') || matchesWithNodeName(e.target, 'TEXTAREA')) {
kpxcUI.updateIconPosition(iconClass);
}
});
};
kpxcUI.updateIconPosition = function(iconClass) {
if (iconClass.inputField && iconClass.icon) {
kpxcUI.setIconPosition(iconClass.icon, iconClass.inputField, iconClass.rtl, iconClass.segmented);
}
};
kpxcUI.calculateIconOffset = function(field, size) {
const offset = Math.floor((field.offsetHeight / 2) - (size / 2) - 1);
return (offset < 0) ? 0 : offset;
};
kpxcUI.setIconPosition = function(icon, field, rtl = false, segmented = false) {
const rect = field.getBoundingClientRect();
const size = Number(icon.getAttribute('size'));
const offset = kpxcUI.calculateIconOffset(field, size);
const zoom = kpxcUI.bodyStyle.zoom || 1;
let left = kpxcUI.getRelativeLeftPosition(rect) / zoom;
let top = kpxcUI.getRelativeTopPosition(rect) / zoom;
// Add more space for the icon to show it at the right side of the field if TOTP fields are segmented
if (segmented) {
left += size + 10;
}
// Adjusts the icon offset for certain sites
const iconOffset = kpxcSites.iconOffset(left, top, size, field?.getLowerCaseAttribute('type'));
if (iconOffset) {
left = iconOffset[0];
top = iconOffset[1];
}
const scrollTop = kpxcUI.getScrollTop() / zoom;
const scrollLeft = kpxcUI.getScrollLeft() / zoom;
icon.style.top = Pixels(top + scrollTop + offset + 1);
icon.style.left = rtl
? Pixels(left + scrollLeft + offset)
: Pixels(left + scrollLeft + field.offsetWidth - size - offset);
};
kpxcUI.getScrollTop = function() {
return document.defaultView?.scrollY ?? document.scrollingElement?.scrollTop ?? 0;
};
@ -204,32 +81,6 @@ kpxcUI.getRelativeTopPosition = function(rect) {
return kpxcUI.bodyStyle.position.toLowerCase() === 'relative' ? rect.top - kpxcUI.bodyRect.top : rect.top;
};
kpxcUI.deleteHiddenIcons = function(iconList) {
const deletedIcons = [];
for (const icon of iconList) {
if (icon.inputField && !kpxcFields.isVisible(icon.inputField)) {
const index = iconList.indexOf(icon);
icon.removeIcon();
iconList.splice(index, 1);
deletedIcons.push(icon.inputField);
// Delete the input field from detected fields so the icon can be detected again
const inputFieldIndex = kpxc.inputs.indexOf(icon.inputField);
if (inputFieldIndex >= 0) {
kpxc.inputs.splice(inputFieldIndex, 1);
}
}
}
// Remove the same icons from kpxcIcons.icons array
for (const input of deletedIcons) {
const index = kpxcIcons.icons.findIndex(e => e.field === input);
if (index >= 0) {
kpxcIcons.icons.splice(index, 1);
}
}
};
kpxcUI.isRTL = function(field) {
if (!field) {
return false;
@ -300,41 +151,22 @@ kpxcUI.makeBannerDraggable = function(banner) {
});
};
/**
* Detects if the input field appears or disappears -> show/hide the icon
* - boundingClientRect with slightly (< -10) negative values -> hidden
* - intersectionRatio === 0 -> hidden
* - isIntersecting === false -> hidden
* - intersectionRatio > 0 -> shown
* - isIntersecting === true -> shown
*/
kpxcUI.updateFromIntersectionObserver = function(iconClass, entries) {
for (const entry of entries) {
const rect = DOMRectToArray(entry.boundingClientRect);
if ((entry.intersectionRatio === 0 && !entry.isIntersecting) || (rect.some(x => x < -10))) {
iconClass.icon.style.display = 'none';
} else if (entry.intersectionRatio > 0 && entry.isIntersecting) {
iconClass.icon.style.display = 'block';
// Wait for possible DOM animations
setTimeout(() => {
kpxcUI.setIconPosition(iconClass.icon, entry.target, iconClass.rtl, iconClass.segmented);
}, 400);
}
}
};
/**
* Creates a self-disappearing notification banner to DOM
* @param {string} type Notification type: (success, info, warning, error)
* @param {string} message The message shown
*/
kpxcUI.createNotification = function(type, message) {
kpxcUI.createNotification = async function(type, message) {
if (!kpxc.settings.showNotifications || !type || !message) {
return;
}
// Send the notification to top window from iframe
if (window.self !== window.top) {
await sendMessage('frame_message', [ 'notification_from_frame', type, message ]);
return;
}
// Removes notification from the body element
const removeNotification = function() {
// Catch cross-domain exception
@ -431,12 +263,12 @@ kpxcUI.createPageObserver = function() {
}
});
kpxcUI.pageObserver.observe(document.documentElement, OBSERVER_OPTIONS);
kpxcUI.pageObserver.observe(document.body, OBSERVER_OPTIONS);
};
const DOMRectToArray = function(domRect) {
return [ domRect.bottom, domRect.height, domRect.left, domRect.right, domRect.top, domRect.width, domRect.x, domRect.y ];
if (document?.documentElement) {
kpxcUI.pageObserver.observe(document.documentElement, OBSERVER_OPTIONS);
}
if (document?.body) {
kpxcUI.pageObserver.observe(document.body, OBSERVER_OPTIONS);
}
};
const initColorTheme = function(elem) {

View file

@ -12,10 +12,6 @@ kpxcUsernameIcons.switchIcon = function(state) {
kpxcUsernameIcons.icons.forEach(u => u.switchIcon(state));
};
kpxcUsernameIcons.deleteHiddenIcons = function() {
kpxcUI.deleteHiddenIcons(kpxcUsernameIcons.icons);
};
kpxcUsernameIcons.isValid = function(field) {
if (!field
|| field.offsetWidth < MIN_INPUT_FIELD_OFFSET_WIDTH
@ -34,7 +30,7 @@ class UsernameFieldIcon extends Icon {
super(field, databaseState);
this.initField(field);
kpxcUI.monitorIconPosition(this);
kpxcIcons.monitorIconPosition(this);
}
switchIcon(state) {
@ -113,7 +109,7 @@ UsernameFieldIcon.prototype.createIcon = function(field) {
icon.addEventListener('mousedown', ev => ev.stopPropagation());
icon.addEventListener('mouseup', ev => ev.stopPropagation());
kpxcUI.setIconPosition(icon, field, this.rtl);
kpxcIcons.setIconPosition(icon, field, this.rtl);
this.icon = icon;
this.createWrapper('css/username.css');
if (kpxcFields.popoverSupported) {

View file

@ -1,8 +1,8 @@
{
"manifest_version": 3,
"name": "KeePassXC-Browser",
"version": "1.9.10",
"version_name": "1.9.10",
"version": "1.9.11",
"version_name": "1.9.11",
"minimum_chrome_version": "93",
"description": "__MSG_extensionDescription__",
"author": "KeePassXC Team",
@ -53,7 +53,8 @@
"content/fields.js",
"content/fill.js",
"content/form.js",
"content/icons.js",
"content/icon.js",
"content/icon-handler.js",
"content/keepassxc-browser.js",
"content/observer-helper.js",
"content/pwgen.js",

View file

@ -352,8 +352,8 @@
<!-- Number of allowed redirects -->
<div class="form-group w-50 pb-2">
<label id="redirectAllowanceLabel" class="font-weight-normal" for="redirectAllowance" data-i18n="optionsRedirectAllowance" data-i18n-placeholder="1"></label>
<input type="range" class="form-range" id="redirectAllowance" name="redirectAllowance" min="1" max="11" step="1" value="1">
<label id="redirectAllowanceLabel" class="font-weight-normal" for="redirectAllowance" data-i18n="optionsRedirectAllowance" data-i18n-placeholder="3"></label>
<input type="range" class="form-range" id="redirectAllowance" name="redirectAllowance" min="1" max="11" step="1" value="3">
<div class="form-text help-text" data-i18n="optionsRedirectAllowanceHelpText"></div>
</div>

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "keepassxc-browser",
"version": "1.9.10",
"version": "1.9.11",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "keepassxc-browser",
"version": "1.9.10",
"version": "1.9.11",
"license": "GPL-3.0",
"dependencies": {
"@npmcli/fs": "^2.1.0"

View file

@ -1,6 +1,6 @@
{
"name": "keepassxc-browser",
"version": "1.9.10",
"version": "1.9.11",
"description": "KeePassXC-Browser",
"main": "build.js",
"devDependencies": {

View file

@ -62,6 +62,8 @@ async function testTotpFields() {
[ '', { id: '2fa', type: 'text', maxLength: '12' }, 'Ignore if field maxLength too long', false ],
[ '', { id: 'promocode', type: 'text', }, 'promocode id is not acceptable', false ],
[ '', { id: 'Promotional Code', type: 'text', }, 'Promotional Code id is not acceptable', false ],
[ '', { id: 'postcode', type: 'text', }, 'postcode id is not acceptable', false ],
[ '', { id: 'postalcode', type: 'text', }, 'postalcode id is not acceptable', false ],
[ '', { id: 'encode', type: 'text', }, 'encode id is not acceptable', false ],
[ '', { id: 'encodedText', type: 'text', }, 'encodedText is not acceptable', false ],
[ '', { id: 'decoder', type: 'text', }, 'decoder id is not acceptable', false ],