From 74dbb0d8e8bb2bca12869c8dbb3478e716abde94 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Tue, 25 Nov 2025 19:16:17 +0200 Subject: [PATCH 1/8] Update to 1.9.11 --- CHANGELOG | 17 +++++ dist/manifest_chromium.json | 4 +- dist/manifest_firefox.json | 2 +- keepassxc-browser/_locales/bg/messages.json | 26 ++++++- keepassxc-browser/_locales/da/messages.json | 26 ++++++- keepassxc-browser/_locales/de/messages.json | 24 ++++++- keepassxc-browser/_locales/el/messages.json | 26 ++++++- .../_locales/en_GB/messages.json | 26 ++++++- keepassxc-browser/_locales/es/messages.json | 24 ++++++- keepassxc-browser/_locales/fi/messages.json | 26 ++++++- keepassxc-browser/_locales/fr/messages.json | 24 ++++++- keepassxc-browser/_locales/he/messages.json | 26 ++++++- keepassxc-browser/_locales/hu/messages.json | 68 +++++++++++------- keepassxc-browser/_locales/id/messages.json | 26 ++++++- keepassxc-browser/_locales/it/messages.json | 34 +++++++-- keepassxc-browser/_locales/ja/messages.json | 26 ++++++- keepassxc-browser/_locales/ko/messages.json | 26 ++++++- keepassxc-browser/_locales/lt/messages.json | 26 ++++++- keepassxc-browser/_locales/nb/messages.json | 26 ++++++- keepassxc-browser/_locales/nl/messages.json | 24 ++++++- keepassxc-browser/_locales/pl/messages.json | 22 +++++- .../_locales/pt_BR/messages.json | 26 ++++++- .../_locales/pt_PT/messages.json | 26 ++++++- keepassxc-browser/_locales/ro/messages.json | 26 ++++++- keepassxc-browser/_locales/ru/messages.json | 70 ++++++++++++------- keepassxc-browser/_locales/sv/messages.json | 24 ++++++- keepassxc-browser/_locales/tr/messages.json | 34 +++++++-- keepassxc-browser/_locales/uk/messages.json | 26 ++++++- .../_locales/zh_CN/messages.json | 22 +++++- .../_locales/zh_TW/messages.json | 26 ++++++- keepassxc-browser/manifest.json | 4 +- package-lock.json | 4 +- package.json | 2 +- 33 files changed, 688 insertions(+), 131 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a8075c4..394b31c 100755 --- a/CHANGELOG +++ b/CHANGELOG @@ -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] diff --git a/dist/manifest_chromium.json b/dist/manifest_chromium.json index 93a1d4e..1da1cf0 100755 --- a/dist/manifest_chromium.json +++ b/dist/manifest_chromium.json @@ -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", diff --git a/dist/manifest_firefox.json b/dist/manifest_firefox.json index 1a4d993..6bbf771 100644 --- a/dist/manifest_firefox.json +++ b/dist/manifest_firefox.json @@ -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": { diff --git a/keepassxc-browser/_locales/bg/messages.json b/keepassxc-browser/_locales/bg/messages.json index 78581ba..07a975a 100644 --- a/keepassxc-browser/_locales/bg/messages.json +++ b/keepassxc-browser/_locales/bg/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/da/messages.json b/keepassxc-browser/_locales/da/messages.json index 468b1d6..c1e7d62 100644 --- a/keepassxc-browser/_locales/da/messages.json +++ b/keepassxc-browser/_locales/da/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/de/messages.json b/keepassxc-browser/_locales/de/messages.json index 7d2107c..e3121d3 100644 --- a/keepassxc-browser/_locales/de/messages.json +++ b/keepassxc-browser/_locales/de/messages.json @@ -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 Zeichenkettenfelder 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." diff --git a/keepassxc-browser/_locales/el/messages.json b/keepassxc-browser/_locales/el/messages.json index 8181ecd..5ab899a 100644 --- a/keepassxc-browser/_locales/el/messages.json +++ b/keepassxc-browser/_locales/el/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/en_GB/messages.json b/keepassxc-browser/_locales/en_GB/messages.json index ef8d012..5119d39 100644 --- a/keepassxc-browser/_locales/en_GB/messages.json +++ b/keepassxc-browser/_locales/en_GB/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/es/messages.json b/keepassxc-browser/_locales/es/messages.json index adea55a..b29c9ee 100644 --- a/keepassxc-browser/_locales/es/messages.json +++ b/keepassxc-browser/_locales/es/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/fi/messages.json b/keepassxc-browser/_locales/fi/messages.json index 0efef8d..bf335d3 100644 --- a/keepassxc-browser/_locales/fi/messages.json +++ b/keepassxc-browser/_locales/fi/messages.json @@ -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ä lisämerkkijonokentiksi.", - "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." diff --git a/keepassxc-browser/_locales/fr/messages.json b/keepassxc-browser/_locales/fr/messages.json index af7eae7..6382df4 100644 --- a/keepassxc-browser/_locales/fr/messages.json +++ b/keepassxc-browser/_locales/fr/messages.json @@ -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 d’envoi", + "description": "Text for Submit Button." + }, "defineChooseUsername": { "message": "Choisissez un champ de nom d’utilisateur", "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 d’envoi", + "description": "Choose submit button selection text when choosing Custom Login Fields." + }, "defineHelpText": { "message": "Confirmez votre choix ou choisissez d’autres 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 d’entrée avec le clavier.", @@ -362,6 +370,10 @@ "message": "Champs de type chaîne", "description": "General text for a String Fields." }, + "submitButton": { + "message": "Bouton d’envoi", + "description": "Custom Submit Button text." + }, "credentialsNoUsername": { "message": "– aucun nom d’utilisateur –", "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 l’enregistrement 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." diff --git a/keepassxc-browser/_locales/he/messages.json b/keepassxc-browser/_locales/he/messages.json index b98750d..e0678a7 100644 --- a/keepassxc-browser/_locales/he/messages.json +++ b/keepassxc-browser/_locales/he/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/hu/messages.json b/keepassxc-browser/_locales/hu/messages.json index a48e706..3a8911d 100644 --- a/keepassxc-browser/_locales/hu/messages.json +++ b/keepassxc-browser/_locales/hu/messages.json @@ -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 karakterlánc mezőkként.", - "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." } } diff --git a/keepassxc-browser/_locales/id/messages.json b/keepassxc-browser/_locales/id/messages.json index ca6bf42..f2b070d 100644 --- a/keepassxc-browser/_locales/id/messages.json +++ b/keepassxc-browser/_locales/id/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/it/messages.json b/keepassxc-browser/_locales/it/messages.json index b62d0a9..7c7acd2 100644 --- a/keepassxc-browser/_locales/it/messages.json +++ b/keepassxc-browser/_locales/it/messages.json @@ -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": { diff --git a/keepassxc-browser/_locales/ja/messages.json b/keepassxc-browser/_locales/ja/messages.json index 7ad01e1..e3c92e3 100644 --- a/keepassxc-browser/_locales/ja/messages.json +++ b/keepassxc-browser/_locales/ja/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/ko/messages.json b/keepassxc-browser/_locales/ko/messages.json index 209d721..a1d439a 100644 --- a/keepassxc-browser/_locales/ko/messages.json +++ b/keepassxc-browser/_locales/ko/messages.json @@ -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 데이터베이스가 KeePassXC-브라우저에 연결되어 있습니다.", "description": "Info text about connected databases." diff --git a/keepassxc-browser/_locales/lt/messages.json b/keepassxc-browser/_locales/lt/messages.json index 3695d0b..50d72c8 100644 --- a/keepassxc-browser/_locales/lt/messages.json +++ b/keepassxc-browser/_locales/lt/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/nb/messages.json b/keepassxc-browser/_locales/nb/messages.json index bdf904f..20901dc 100644 --- a/keepassxc-browser/_locales/nb/messages.json +++ b/keepassxc-browser/_locales/nb/messages.json @@ -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 KeePassXC–Browser.", "description": "Info text about connected databases." diff --git a/keepassxc-browser/_locales/nl/messages.json b/keepassxc-browser/_locales/nl/messages.json index 6cd60e6..5086e4a 100644 --- a/keepassxc-browser/_locales/nl/messages.json +++ b/keepassxc-browser/_locales/nl/messages.json @@ -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 tekenreeksvelden.", - "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." diff --git a/keepassxc-browser/_locales/pl/messages.json b/keepassxc-browser/_locales/pl/messages.json index 2603775..c01f963 100644 --- a/keepassxc-browser/_locales/pl/messages.json +++ b/keepassxc-browser/_locales/pl/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/pt_BR/messages.json b/keepassxc-browser/_locales/pt_BR/messages.json index 3836b40..8fc3c3a 100644 --- a/keepassxc-browser/_locales/pt_BR/messages.json +++ b/keepassxc-browser/_locales/pt_BR/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/pt_PT/messages.json b/keepassxc-browser/_locales/pt_PT/messages.json index 01999df..fd509ce 100644 --- a/keepassxc-browser/_locales/pt_PT/messages.json +++ b/keepassxc-browser/_locales/pt_PT/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/ro/messages.json b/keepassxc-browser/_locales/ro/messages.json index aa82958..2cd2be5 100644 --- a/keepassxc-browser/_locales/ro/messages.json +++ b/keepassxc-browser/_locales/ro/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/ru/messages.json b/keepassxc-browser/_locales/ru/messages.json index 7bdc75a..76620a9 100644 --- a/keepassxc-browser/_locales/ru/messages.json +++ b/keepassxc-browser/_locales/ru/messages.json @@ -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." } } diff --git a/keepassxc-browser/_locales/sv/messages.json b/keepassxc-browser/_locales/sv/messages.json index 816fded..764d4ba 100644 --- a/keepassxc-browser/_locales/sv/messages.json +++ b/keepassxc-browser/_locales/sv/messages.json @@ -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 Strängfält.", - "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." diff --git a/keepassxc-browser/_locales/tr/messages.json b/keepassxc-browser/_locales/tr/messages.json index 64a5cad..6bea857 100644 --- a/keepassxc-browser/_locales/tr/messages.json +++ b/keepassxc-browser/_locales/tr/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/uk/messages.json b/keepassxc-browser/_locales/uk/messages.json index dfe2ff2..22be924 100644 --- a/keepassxc-browser/_locales/uk/messages.json +++ b/keepassxc-browser/_locales/uk/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/zh_CN/messages.json b/keepassxc-browser/_locales/zh_CN/messages.json index 04fa2ba..decda74 100644 --- a/keepassxc-browser/_locales/zh_CN/messages.json +++ b/keepassxc-browser/_locales/zh_CN/messages.json @@ -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." diff --git a/keepassxc-browser/_locales/zh_TW/messages.json b/keepassxc-browser/_locales/zh_TW/messages.json index 590f70a..7cc8066 100644 --- a/keepassxc-browser/_locales/zh_TW/messages.json +++ b/keepassxc-browser/_locales/zh_TW/messages.json @@ -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": "請確認您的選擇,或是選擇更多欄位作為字串欄位。", - "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." diff --git a/keepassxc-browser/manifest.json b/keepassxc-browser/manifest.json index 93a1d4e..1da1cf0 100755 --- a/keepassxc-browser/manifest.json +++ b/keepassxc-browser/manifest.json @@ -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", diff --git a/package-lock.json b/package-lock.json index 042935e..00f9f39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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" diff --git a/package.json b/package.json index ea3fad9..0835d35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "keepassxc-browser", - "version": "1.9.10", + "version": "1.9.11", "description": "KeePassXC-Browser", "main": "build.js", "devDependencies": { From 43d0dc528fb06803eadfa0a48000923887ff8540 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Sat, 29 Nov 2025 14:04:07 +0200 Subject: [PATCH 2/8] Fix using invalid parameters with MutationObserver --- keepassxc-browser/content/ui.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/keepassxc-browser/content/ui.js b/keepassxc-browser/content/ui.js index e3a6d4a..1a77d3c 100644 --- a/keepassxc-browser/content/ui.js +++ b/keepassxc-browser/content/ui.js @@ -431,8 +431,12 @@ kpxcUI.createPageObserver = function() { } }); - kpxcUI.pageObserver.observe(document.documentElement, OBSERVER_OPTIONS); - kpxcUI.pageObserver.observe(document.body, OBSERVER_OPTIONS); + if (document?.documentElement) { + kpxcUI.pageObserver.observe(document.documentElement, OBSERVER_OPTIONS); + } + if (document?.body) { + kpxcUI.pageObserver.observe(document.body, OBSERVER_OPTIONS); + } }; const DOMRectToArray = function(domRect) { From fdbd077852386781cee95e19af501b3daeac4e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20V=C3=A4nttinen?= Date: Sat, 29 Nov 2025 16:33:02 +0200 Subject: [PATCH 3/8] Passkeys: Add publicKey to response (#2782) Passkeys: Add publicKey to response --- keepassxc-browser/content/passkeys.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keepassxc-browser/content/passkeys.js b/keepassxc-browser/content/passkeys.js index 6354532..e2e6217 100644 --- a/keepassxc-browser/content/passkeys.js +++ b/keepassxc-browser/content/passkeys.js @@ -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' ] }; From c639ce87423b3f2b35b8e6f0ee9d05bd4eeed2c1 Mon Sep 17 00:00:00 2001 From: Jack Dunn <56315967+JackDunnCodes@users.noreply.github.com> Date: Fri, 12 Dec 2025 14:29:55 +0000 Subject: [PATCH 4/8] Ignore "postcode" for TOTP (#2793) Ignore "postcode" for totp --- keepassxc-browser/content/totp-field.js | 2 +- tests/tests.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/keepassxc-browser/content/totp-field.js b/keepassxc-browser/content/totp-field.js index cd0874d..f471d2c 100644 --- a/keepassxc-browser/content/totp-field.js +++ b/keepassxc-browser/content/totp-field.js @@ -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' ]; diff --git a/tests/tests.js b/tests/tests.js index 15ab3f8..72dc07f 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -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 ], From 5dcc3c93d0c57deae68287d83d17b5a149c517b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9leste=20Wouters?= Date: Fri, 12 Dec 2025 15:30:56 +0100 Subject: [PATCH 5/8] Fix TOTP fill missing digits on some sites (fixes #2215) (#2794) Fixes Authelia and Epic Games OTP fill by addressing two underlying problems --- keepassxc-browser/content/fill.js | 57 ++++++++++++++++++------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/keepassxc-browser/content/fill.js b/keepassxc-browser/content/fill.js index b6b9571..9198c40 100644 --- a/keepassxc-browser/content/fill.js +++ b/keepassxc-browser/content/fill.js @@ -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'); From abba71e4199d45948374f22e04aab1a8d8c8572a Mon Sep 17 00:00:00 2001 From: SinnySupernova <155481713+SinnySupernova@users.noreply.github.com> Date: Fri, 12 Dec 2025 14:41:06 +0000 Subject: [PATCH 6/8] Set default redirect allowance to 3. fixes #2796 (#2797) --- keepassxc-browser/background/page.js | 2 +- keepassxc-browser/options/options.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keepassxc-browser/background/page.js b/keepassxc-browser/background/page.js index 86bbf57..1476a8b 100755 --- a/keepassxc-browser/background/page.js +++ b/keepassxc-browser/background/page.js @@ -24,7 +24,7 @@ const defaultSettings = { downloadFaviconAfterSave: false, passkeys: false, passkeysFallback: true, - redirectAllowance: 1, + redirectAllowance: 3, saveDomainOnly: true, showGettingStartedGuideAlert: true, showGroupNameInAutocomplete: true, diff --git a/keepassxc-browser/options/options.html b/keepassxc-browser/options/options.html index 4dd97d0..a9e6997 100644 --- a/keepassxc-browser/options/options.html +++ b/keepassxc-browser/options/options.html @@ -352,8 +352,8 @@
- - + +
From f3e0111accd486776696819c8d2af6336a09fba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20V=C3=A4nttinen?= Date: Fri, 12 Dec 2025 16:41:48 +0200 Subject: [PATCH 7/8] Show notifications always on the top window (#2789) --- keepassxc-browser/content/keepassxc-browser.js | 5 +++++ keepassxc-browser/content/ui.js | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/keepassxc-browser/content/keepassxc-browser.js b/keepassxc-browser/content/keepassxc-browser.js index 5a16bc2..031cf18 100755 --- a/keepassxc-browser/content/keepassxc-browser.js +++ b/keepassxc-browser/content/keepassxc-browser.js @@ -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); diff --git a/keepassxc-browser/content/ui.js b/keepassxc-browser/content/ui.js index 1a77d3c..be2d43c 100644 --- a/keepassxc-browser/content/ui.js +++ b/keepassxc-browser/content/ui.js @@ -330,11 +330,17 @@ kpxcUI.updateFromIntersectionObserver = function(iconClass, entries) { * @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 From e444eab33c3fac87a0fe0ced45c772168eed6e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20V=C3=A4nttinen?= Date: Tue, 16 Dec 2025 09:08:17 +0200 Subject: [PATCH 8/8] Refactor icon handling (#2791) Refactor icon handling --- dist/manifest_chromium.json | 3 +- dist/manifest_firefox.json | 3 +- keepassxc-browser/content/icon-handler.js | 242 +++++++++++++++++++ keepassxc-browser/content/icon.js | 67 +++++ keepassxc-browser/content/icons.js | 116 --------- keepassxc-browser/content/observer-helper.js | 4 +- keepassxc-browser/content/pwgen.js | 8 +- keepassxc-browser/content/totp-field.js | 8 +- keepassxc-browser/content/ui.js | 178 -------------- keepassxc-browser/content/username-field.js | 8 +- keepassxc-browser/manifest.json | 3 +- 11 files changed, 323 insertions(+), 317 deletions(-) create mode 100644 keepassxc-browser/content/icon-handler.js create mode 100644 keepassxc-browser/content/icon.js delete mode 100644 keepassxc-browser/content/icons.js diff --git a/dist/manifest_chromium.json b/dist/manifest_chromium.json index 1da1cf0..23e7f88 100755 --- a/dist/manifest_chromium.json +++ b/dist/manifest_chromium.json @@ -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", diff --git a/dist/manifest_firefox.json b/dist/manifest_firefox.json index 6bbf771..31ffefb 100644 --- a/dist/manifest_firefox.json +++ b/dist/manifest_firefox.json @@ -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", diff --git a/keepassxc-browser/content/icon-handler.js b/keepassxc-browser/content/icon-handler.js new file mode 100644 index 0000000..7d5a1c0 --- /dev/null +++ b/keepassxc-browser/content/icon-handler.js @@ -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, + ]; +}; diff --git a/keepassxc-browser/content/icon.js b/keepassxc-browser/content/icon.js new file mode 100644 index 0000000..bde3437 --- /dev/null +++ b/keepassxc-browser/content/icon.js @@ -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%)'; + } + } +} diff --git a/keepassxc-browser/content/icons.js b/keepassxc-browser/content/icons.js deleted file mode 100644 index f8e03c1..0000000 --- a/keepassxc-browser/content/icons.js +++ /dev/null @@ -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); -}; diff --git a/keepassxc-browser/content/observer-helper.js b/keepassxc-browser/content/observer-helper.js index 5df11e5..ddc521e 100644 --- a/keepassxc-browser/content/observer-helper.js +++ b/keepassxc-browser/content/observer-helper.js @@ -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 diff --git a/keepassxc-browser/content/pwgen.js b/keepassxc-browser/content/pwgen.js index 522f073..4899d24 100644 --- a/keepassxc-browser/content/pwgen.js +++ b/keepassxc-browser/content/pwgen.js @@ -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) { diff --git a/keepassxc-browser/content/totp-field.js b/keepassxc-browser/content/totp-field.js index f471d2c..a6507f3 100644 --- a/keepassxc-browser/content/totp-field.js +++ b/keepassxc-browser/content/totp-field.js @@ -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) { diff --git a/keepassxc-browser/content/ui.js b/keepassxc-browser/content/ui.js index be2d43c..652ca0d 100644 --- a/keepassxc-browser/content/ui.js +++ b/keepassxc-browser/content/ui.js @@ -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,31 +151,6 @@ 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) @@ -445,10 +271,6 @@ kpxcUI.createPageObserver = function() { } }; -const DOMRectToArray = function(domRect) { - return [ domRect.bottom, domRect.height, domRect.left, domRect.right, domRect.top, domRect.width, domRect.x, domRect.y ]; -}; - const initColorTheme = function(elem) { let theme = kpxc.settings['colorTheme']; if (theme === 'system') { diff --git a/keepassxc-browser/content/username-field.js b/keepassxc-browser/content/username-field.js index 3316bf6..3442585 100644 --- a/keepassxc-browser/content/username-field.js +++ b/keepassxc-browser/content/username-field.js @@ -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) { diff --git a/keepassxc-browser/manifest.json b/keepassxc-browser/manifest.json index 1da1cf0..23e7f88 100755 --- a/keepassxc-browser/manifest.json +++ b/keepassxc-browser/manifest.json @@ -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",