From 527994084b55ce76e6114ab7eafe150cae4d09ff Mon Sep 17 00:00:00 2001 From: ngocanhtve Date: Tue, 18 Jun 2024 01:13:01 +0000 Subject: [PATCH 001/119] Translated using Weblate (Vietnamese) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/vi/ --- app/src/main/res/values-vi/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 1aa407f9a..13adaf90a 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -387,7 +387,7 @@ Việc hợp nhất đã hoàn thành thành công Quyền Phiên bản %1$s - Xây dựng %1$s + Bản dựng %1$s Định cấu hình Không có thông tin xác thực sinh trắc học hoặc thiết bị nào được đăng ký. Cần cập nhật bảo mật sinh trắc học. @@ -622,7 +622,7 @@ Không giống như nhiều ứng dụng quản lý mật khẩu, ứng dụng này <strong>không có quảng cáo</strong>, <strong>phần mềm tự do được sao chép</strong> và không thu thập dữ liệu cá nhân trên máy chủ của nó, bất kể bạn sử dụng phiên bản nào. Bằng cách mua phiên bản chuyên nghiệp, bạn sẽ có quyền truy cập vào <strong>phong cách trực quan</strong> và bạn sẽ đặc biệt giúp <strong>thực hiện các dự án cộng đồng.</strong> <strong>phong cách trực quan</strong> có sẵn nhờ vào sự hào phóng của bạn. - Để giữ được quyền tự do và luôn hoạt động, chúng tôi tin tưởng vào <strong>sự đóng góp của bạn.</strong> + Để giữ được quyền tự do và luôn hoạt động, chúng tôi tin tưởng vào sự đóng góp của bạn. Tính năng này <strong>đang được phát triển</strong> và yêu cầu <strong>sự đóng góp của bạn</strong> để sớm được khả dụng. Bằng cách mua phiên bản <strong>pro</strong>, Bằng cách <strong>đóng góp</strong>, From 4f2bdeb2c908f36238c40f15f283c5a28eb99ce7 Mon Sep 17 00:00:00 2001 From: Kirill Isakov Date: Thu, 20 Jun 2024 16:50:20 +0000 Subject: [PATCH 002/119] Translated using Weblate (Russian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5a445a8cd..657efb331 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -266,9 +266,9 @@ Участвуйте Примите участие в проекте для повышения стабильности, безопасности и добавления новых возможностей. В отличие от многих других приложений управления паролями, здесь <strong>нет рекламы</strong>, и оно <strong>свободно от лицензирования</strong>. Приложение не собирает ваши личные данные на своих серверах независимо от версии, которую вы используете. - Купите Pro–версию и откройте доступ к этой <strong>теме</strong>. Покупая Pro-версию, вы помогаете <strong>разработчикам открытого ПО</strong>. + Купите Pro–версию и откройте доступ к этой теме. Покупая Pro-версию, вы помогаете разработчикам открытого ПО. Эти <strong>визуальные стили</strong> доступны благодаря вашей щедрости. - Для развития нашего проекта и его независимости нам необходима ваша <strong>поддержка</strong>. + Для развития нашего проекта и его независимости нам необходима ваша поддержка. Эта функция находится <strong>в разработке</strong> и требует вашего <strong>участия</strong>, чтобы стать доступной в ближайшее время. Покупая <strong>Pro</strong>–версию, <strong>Участвуя в проекте</strong>, From 64db137c6cc287be5d13bb83b4ce2087ee43a997 Mon Sep 17 00:00:00 2001 From: solokot Date: Thu, 20 Jun 2024 17:09:59 +0000 Subject: [PATCH 003/119] Translated using Weblate (Russian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 657efb331..1104fde8a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -266,9 +266,9 @@ Участвуйте Примите участие в проекте для повышения стабильности, безопасности и добавления новых возможностей. В отличие от многих других приложений управления паролями, здесь <strong>нет рекламы</strong>, и оно <strong>свободно от лицензирования</strong>. Приложение не собирает ваши личные данные на своих серверах независимо от версии, которую вы используете. - Купите Pro–версию и откройте доступ к этой теме. Покупая Pro-версию, вы помогаете разработчикам открытого ПО. + Купите Pro–версию и откройте доступ к этой теме. Покупая Pro-версию, вы помогаете разработчикам открытого ПО. Эти <strong>визуальные стили</strong> доступны благодаря вашей щедрости. - Для развития нашего проекта и его независимости нам необходима ваша поддержка. + Для развития нашего проекта и его независимости нам необходима ваша поддержка. Эта функция находится <strong>в разработке</strong> и требует вашего <strong>участия</strong>, чтобы стать доступной в ближайшее время. Покупая <strong>Pro</strong>–версию, <strong>Участвуя в проекте</strong>, From acc565d021def5265c36f8d1dd8fab26463ba3ca Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Sat, 22 Jun 2024 20:54:11 +0000 Subject: [PATCH 004/119] Translated using Weblate (German) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/ --- app/src/main/res/values-de/strings.xml | 66 +++++++++++++------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ae65d8bad..63d054f05 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -53,7 +53,7 @@ Vorhandene Datenbank öffnen Letzter Zugriff Abbrechen - Notizen + Hinweise Passwort bestätigen Erstellt Gültig bis @@ -64,7 +64,7 @@ Speichern Titel URL - Nutzername + Benutzername Die RC4/Arcfour-Stromverschlüsselung wird nicht unterstützt. KeePassDX kann diese URI-Adresse nicht verarbeiten. Datei konnte nicht erstellt werden @@ -80,7 +80,7 @@ Gib eine positive ganze Zahl in das Feld „Länge“ ein. Feldname Feldwert - Datei nicht gefunden. Versuche sie über den Dateimanager zu öffnen. + Datei nicht gefunden. Versuche, sie über den Dateimanager zu öffnen. Dateimanager Passwort generieren Passwort bestätigen @@ -124,7 +124,7 @@ Bearbeitung läuft … Schutz Schreibgeschützt - Abhängig von deinem Dateienmanager hat KeePassDX möglicherweise keine Schreibberechtigung. + Abhängig von deinem Dateimanager hat KeePassDX möglicherweise keine Schreibberechtigung. Entfernen Start Verschlüsselungsrunden @@ -174,7 +174,7 @@ Nicht vorhanden Verschlüsselung Schlüsselableitungsfunktion - Erweiterte ASCII + Erweiterter ASCII Erlauben Dienst für automatisches Ausfüllen kann nicht aktiviert werden. Kopie von %1$s @@ -184,20 +184,20 @@ Arbeitsspeichernutzung Arbeitsspeicher, der für die Schlüsselableitung gebraucht wird. Parallelisierung - Grad der Parallelisierung (d.h. Anzahl der Threads), der für die Schlüsselableitung genutzt wird. + Grad der Parallelisierung (d. h. Anzahl der Threads), der für die Schlüsselableitung genutzt wird. Sortieren Aufsteigend ↓ Gruppen oben Papierkorb unten Titel - Nutzername + Benutzername Erstellungsdatum Änderungsdatum Zugriffsdatum Automatisches Ausfüllen KeePassDX Auto-Formularausfüllung Mit KeePassDX anmelden - Standard Autofill-Service festlegen + Standard-Autofill-Service festlegen Automatisches Ausfüllen aktivieren, um Formulare in anderen Apps schnell auszufüllen Eintrag auswählen … Zwischenablage @@ -228,15 +228,15 @@ Existierende Datenbank öffnen Öffnet über den Dateimanager eine früher erstellte Datenbankdatei, um sie weiter zu verwenden. Datenbankelemente hinzufügen - Einträge helfen dabei digitale Konten zu verwalten. + Einträge helfen dabei, digitale Konten zu verwalten. \n \nGruppen/Ordner gliedern Einträge in der Datenbank. Einträge durchsuchen - Titel, Nutzernamen oder Inhalte anderer Felder eingeben, um Passwörter zu finden. + Titel, Benutzernamen oder Inhalt anderer Felder eingeben, um Passwörter zu finden. Eintrag bearbeiten Dem Eintrag eigene Felder hinzufügen. Die Felder können mit Querverweisen aus anderen Einträgen ergänzt werden. Ein starkes Passwort erstellen - Lassen Sie ein starkes Passwort erstellen, das mit Ihrem Eintrag verbunden wird, legen Sie es einfach anhand von Formularkriterien fest und vergessen Sie nicht Ihr Passwort zu sichern. + Erstelle ein starkes Passwort, das mit deinem Eintrag verbunden wird, lege es einfach anhand von Formularkriterien fest und vergiss nicht, dein Passwort zu sichern. Eigene Felder hinzufügen Ein zusätzliches Feld einfügen, einen Wert hinzufügen und diesen optional schützen. Datenbank entsperren @@ -287,8 +287,8 @@ Eintrag bearbeiten Die Datenbank konnte nicht geladen werden. Laden des Schlüssels fehlgeschlagen. Bitte versuchen, die „Speicherplatznutzung“ von KDF zu verringern. - Nutzernamen anzeigen - Nutzernamen in Liste anzeigen + Benutzernamen anzeigen + Benutzernamen in Eintragslisten anzeigen Build %1$s Magikeyboard Magikeyboard (KeePassDX) @@ -318,7 +318,7 @@ Defekte Datenbankverknüpfungen ausblenden Defekte Verknüpfungen in der Liste der zuletzt verwendeten Datenbanken ausblenden App nicht beenden … - Datenbank sperren, wenn im Wurzelordner die Zurück-Taste gedrückt wird + Datenbank sperren, wenn auf dem Hauptbildschirm die Taste „Zurück“ gedrückt wird Beim Schließen löschen Papierkorb Eintragsauswahl @@ -382,7 +382,7 @@ Sicherheitseinstellungen Hauptschlüsseleinstellungen Die Datenbank enthält doppelte UUIDs. - Problem lösen, indem neue UUIDs für Duplikate generiert werden um fortzufahren\? + Problem lösen, indem neue UUIDs für Duplikate generiert werden, um fortzufahren? Datenbank geöffnet Eintragsfelder mit der Zwischenablage des Geräts kopieren Geräteentsperrung verwenden, um eine Datenbank einfacher zu öffnen @@ -393,12 +393,12 @@ Maximale Größe Verlaufsumfang pro Eintrag begrenzen Passwortänderung empfehlen - (Nach Tagen) Ändern des Hauptschlüssels empfehlen + Ändern des Hauptschlüssels empfehlen (Tage) Passwortänderung erzwingen Ändern des Hauptschlüssels erforderlich (Tage) Änderung nächstes Mal erzwingen Ändern des Hauptschlüssels beim nächsten Mal erfordern (einmalig) - Standardnutzername + Standardbenutzername Eigene Datenbankfarbe Komprimierung Keine @@ -448,7 +448,7 @@ Option zur manuellen Auswahl des Datenbankeintrags anzeigen Zeigt die Sperrtaste in der Benutzeroberfläche an Sperrtaste anzeigen - Autofüll-Einstellungen + Einstellungen für automatisches Ausfüllen Zugriff auf die Datei durch den Dateimanager widerrufen Diese Bezeichnung existiert bereits. Die das Formular enthaltende App neu starten, um die Sperrung zu aktivieren. @@ -463,7 +463,7 @@ Element hinzufügen Filter Tastatur wechseln - Zurück wechseln + Zurückwechseln Datenbank-Anmeldebildschirm Nach dem Ausführen der automatischen Tastenaktion automatisch zur vorherigen Tastatur wechseln Auf dem Datenbank-Anmeldebildschirm automatisch zur vorherigen Tastatur wechseln @@ -476,7 +476,7 @@ Diese Daten trotzdem entfernen\? Das Entfernen nicht verknüpfter Daten kann die Größe der Datenbank reduzieren, allerdings auch Daten löschen, die von KeePass-Plugins genutzt werden. Das Hinzufügen dieser Datei wird die bestehende Datei ersetzen. - Eine KeePass-Datenbank soll nur kleine Dateien beinhalten (wie z.B. PGP-Schlüsseldateien). + Eine KeePass-Datenbank soll nur kleine Dateien beinhalten (wie z. B. PGP-Schlüsseldateien). \n \nDeine Datenbank könnte mit diesem Anhang sehr groß und leistungsschwach werden. %1$s hochladen @@ -485,7 +485,7 @@ Datei trotzdem hinzufügen\? Zeigt die mit einem Eintrag oder einer Gruppe verknüpfte UUID an UUID anzeigen - Daten speichern ist bei schreibgeschützt geöffneter Datenbank nicht möglich. + Datenspeicherung ist bei schreibgeschützt geöffneter Datenbank nicht möglich. Datenbank schließen Nach dem Sperren der Datenbank automatisch zur vorherigen Tastatur wechseln Datenbank sperren @@ -496,7 +496,7 @@ Speichermodus Suchmodus Speichern eines neuen Elements in einer schreibgeschützten Datenbank ist unzulässig - Bei manueller Eintragsauswahl Suchinformationen speichern, für leichtere zukünftige Verwendung + Bei manueller Eintragsauswahl Suchinformationen speichern, um sie später leichter verwenden zu können Fragen, ob Daten nach Formularausfüllung gespeichert werden sollen Speichern von Daten abfragen Suchinformationen speichern @@ -511,7 +511,7 @@ Eigenes Passwort mit Biometrie- oder Geräteanmeldedaten verknüpfen, um die Datenbank schnell zu entsperren. Geräteentsperrung der Datenbank Zeitlimit für Geräteentsperrung - Dauer der Geräteentsperrung bis sie zurückgesetzt wird + Dauer der Geräteentsperrung, bis sie zurückgesetzt wird Ablauf der Geräteentsperrung Bei Nutzung der Geräteentsperrung keine verschlüsselten Inhalte speichern Zeitlich begrenzte Geräteentsperrung @@ -546,7 +546,7 @@ Beim Ausführen einer Aktion in der Datenbank ist ein Fehler aufgetreten. Der vorhandene OTP-Typ wird von diesem Formular nicht erkannt, seine Validierung erzeugt Token möglicherweise nicht mehr korrekt. Informationen zu Einmalpasswörtern - Auf die Datei kann nicht zugegriffen werden. Bitte die Datenbank schließen und von ihrem Speicherort erneut öffnen. + Auf die Datei kann nicht zugegriffen werden. Bitte die Datenbank schließen und von ihrem Speicherort aus erneut öffnen. Fehler beim Exportieren der App-Einstellungen App-Einstellungen exportiert Fehler beim Importieren der App-Einstellungen @@ -566,13 +566,13 @@ KiB B Abgebrochen! - Autofüll-Vorschläge hinzugefügt. - Falls möglich, Autofüll-Vorschläge direkt auf kompatibler Tastatur anzeigen + Vorschläge zum automatischen Ausfüllen hinzugefügt. + Falls möglich, Vorschläge zum automatischen Ausfüllen direkt auf kompatibler Tastatur anzeigen Eigenschaften KeePassDX-Eigenschaften zur Verwaltung der App-Einstellungen Sicherer Hinweis Typ - Datum + Ausstellungsdatum Ausstellungsort Name Personalausweis @@ -582,14 +582,14 @@ Vorlagen Vorlagengruppe Dynamische Vorlagen zum Ausfüllen der Felder eines Eintrags verwenden - Vorlagen-Verwendung + Verwendung von Vorlagen Version Vorlage Standard Mitgliedschaft IBAN SWIFT/BIC - Bankname + Name der Bank Bank Konto Seed @@ -639,14 +639,14 @@ \nBitte die Kompatibilität und Sicherheit des Schlüsselspeichers vom Gerätehersteller und vom Ersteller der verwendeten ROM abgleichen. Passphrasen-Wortanzahl Passphrase - Passwörter kolorieren - Koloriere Passwortzeichen nach Typ + Passwörter einfärben + Passwortzeichen nach Typ einfärben Suchbildschirm Auf dem Suchbildschirm automatisch zur vorherigen Tastatur wechseln Entropie: %1$s Bit Entropie: Hoch Entropie: Berechnen … - Mindestens jedes Zeichen einmal + Mindestens ein Zeichen von jedem Zeichen beinhalten Trennzeichen Zeichen ignorieren @@ -679,7 +679,7 @@ Automatische Eingabe <strong>Es werden keine Benutzerdaten ausgelesen</strong>, diese Anwendung stellt keine Verbindung zu einem Server her, arbeitet nur lokal und respektiert vollständig die Privatsphäre der Benutzer. Zusammenführung erfolgreich abgeschlossen - Tastatur, Automatisches Ausfüllen, Zwischenablage + Tastatur, automatisches Ausfüllen, Zwischenablage Biometrie, Geräteanmeldedaten Metadaten, Papierkorb, Vorlagen, Verlauf Suche, Sperre, Verlauf, Eigenschaften From 8534672c3307bd76daf687a1a00ade14dc3626fe Mon Sep 17 00:00:00 2001 From: Masowick Date: Sun, 23 Jun 2024 16:43:47 +0000 Subject: [PATCH 005/119] Translated using Weblate (German) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/ --- app/src/main/res/values-de/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 63d054f05..a50db085e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -80,7 +80,7 @@ Gib eine positive ganze Zahl in das Feld „Länge“ ein. Feldname Feldwert - Datei nicht gefunden. Versuche, sie über den Dateimanager zu öffnen. + Datei nicht gefunden. Bitte versuchen, sie über den Dateimanager zu öffnen. Dateimanager Passwort generieren Passwort bestätigen @@ -124,7 +124,7 @@ Bearbeitung läuft … Schutz Schreibgeschützt - Abhängig von deinem Dateimanager hat KeePassDX möglicherweise keine Schreibberechtigung. + Abhängig vom Dateimanager hat KeePassDX möglicherweise keine Schreibberechtigung. Entfernen Start Verschlüsselungsrunden @@ -228,7 +228,7 @@ Existierende Datenbank öffnen Öffnet über den Dateimanager eine früher erstellte Datenbankdatei, um sie weiter zu verwenden. Datenbankelemente hinzufügen - Einträge helfen dabei, digitale Konten zu verwalten. + Einträge helfen digitale Konten zu verwalten. \n \nGruppen/Ordner gliedern Einträge in der Datenbank. Einträge durchsuchen @@ -236,7 +236,7 @@ Eintrag bearbeiten Dem Eintrag eigene Felder hinzufügen. Die Felder können mit Querverweisen aus anderen Einträgen ergänzt werden. Ein starkes Passwort erstellen - Erstelle ein starkes Passwort, das mit deinem Eintrag verbunden wird, lege es einfach anhand von Formularkriterien fest und vergiss nicht, dein Passwort zu sichern. + Lassen Sie ein starkes Passwort erstellen, das mit Ihrem Eintrag verbunden wird, legen Sie es einfach anhand von Formularkriterien fest und vergessen Sie nicht Ihr Passwort zu sichern. Eigene Felder hinzufügen Ein zusätzliches Feld einfügen, einen Wert hinzufügen und diesen optional schützen. Datenbank entsperren @@ -476,16 +476,16 @@ Diese Daten trotzdem entfernen\? Das Entfernen nicht verknüpfter Daten kann die Größe der Datenbank reduzieren, allerdings auch Daten löschen, die von KeePass-Plugins genutzt werden. Das Hinzufügen dieser Datei wird die bestehende Datei ersetzen. - Eine KeePass-Datenbank soll nur kleine Dateien beinhalten (wie z. B. PGP-Schlüsseldateien). + Eine KeePass-Datenbank soll nur kleine Dateien beinhalten (wie z. B. PGP-Schlüsseldateien). \n -\nDeine Datenbank könnte mit diesem Anhang sehr groß und leistungsschwach werden. +\nMit diesem Anhang könnte die Datenbank sehr groß werden und damit die Leistung beeinträchtigen. %1$s hochladen Anhang hinzufügen Entfernt Anhänge, die in der Datenbank enthalten, aber keinem Eintrag zugeordnet sind Datei trotzdem hinzufügen\? Zeigt die mit einem Eintrag oder einer Gruppe verknüpfte UUID an UUID anzeigen - Datenspeicherung ist bei schreibgeschützt geöffneter Datenbank nicht möglich. + Das Speichern von Daten ist bei einer schreibgeschützt geöffneter Datenbank nicht möglich. Datenbank schließen Nach dem Sperren der Datenbank automatisch zur vorherigen Tastatur wechseln Datenbank sperren From 4032e52317f384e6da47d2b2d5ff7b7f341921d9 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 24 Jun 2024 12:32:05 +0200 Subject: [PATCH 006/119] fix: Upgrade Foreground service and version to 4.1.0 --- CHANGELOG | 3 + app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 17 ++++- .../AdvancedUnlockNotificationService.kt | 12 ++- .../AttachmentFileNotificationService.kt | 20 +++-- .../ClipboardEntryNotificationService.kt | 73 ++++++++----------- .../DatabaseTaskNotificationService.kt | 6 +- .../KeyboardEntryNotificationService.kt | 11 ++- .../keepass/services/NotificationService.kt | 62 +++++++++++++++- .../services/NotificationServiceType.kt | 9 +++ .../metadata/android/en-US/changelogs/132.txt | 1 + .../metadata/android/fr-FR/changelogs/132.txt | 1 + 12 files changed, 158 insertions(+), 65 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/services/NotificationServiceType.kt create mode 100644 fastlane/metadata/android/en-US/changelogs/132.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/132.txt diff --git a/CHANGELOG b/CHANGELOG index cb8629844..1b3445661 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +KeePassDX(4.1.0) + * Upgrade to API 34 (Android 14) + KeePassDX(4.0.8) * Fix graphical bug that prevented databases from being opened on some versions of Android #1848 #1850 diff --git a/app/build.gradle b/app/build.gradle index fe431a2c4..a9a765060 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,15 +5,15 @@ apply plugin: 'kotlin-kapt' android { namespace 'com.kunzisoft.keepass' - compileSdkVersion 33 + compileSdkVersion 34 buildToolsVersion "33.0.2" defaultConfig { applicationId "com.kunzisoft.keepass" minSdkVersion 15 - targetSdkVersion 33 - versionCode = 131 - versionName = "4.0.8" + targetSdkVersion 34 + versionCode = 132 + versionName = "4.1.0" multiDexEnabled true testApplicationId = "com.kunzisoft.keepass.tests" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ffcccd1e6..070c5251c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,10 @@ android:anyDensity="true" /> + + + @@ -235,10 +248,6 @@ - diff --git a/app/src/main/java/com/kunzisoft/keepass/services/AdvancedUnlockNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/AdvancedUnlockNotificationService.kt index 45e0b0ccf..f61929682 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/AdvancedUnlockNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/AdvancedUnlockNotificationService.kt @@ -86,11 +86,19 @@ class AdvancedUnlockNotificationService : NotificationService() { val notificationTimeoutMilliSecs = PreferencesUtil.getAdvancedUnlockTimeout(this) // Not necessarily a foreground service if (mTimerJob == null && notificationTimeoutMilliSecs != TimeoutHelper.NEVER) { - defineTimerJob(notificationBuilder, notificationTimeoutMilliSecs) { + defineTimerJob( + notificationBuilder, + NotificationServiceType.ADVANCED_UNLOCK, + notificationTimeoutMilliSecs + ) { sendBroadcast(Intent(REMOVE_ADVANCED_UNLOCK_KEY_ACTION)) } } else { - startForeground(notificationId, notificationBuilder.build()) + startForegroundCompat( + notificationId, + notificationBuilder, + NotificationServiceType.ADVANCED_UNLOCK + ) } return mActionTaskBinder diff --git a/app/src/main/java/com/kunzisoft/keepass/services/AttachmentFileNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/AttachmentFileNotificationService.kt index c15e7988c..974db311c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/AttachmentFileNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/AttachmentFileNotificationService.kt @@ -36,13 +36,13 @@ import com.kunzisoft.keepass.model.AttachmentState import com.kunzisoft.keepass.model.EntryAttachmentState import com.kunzisoft.keepass.model.StreamDirection import com.kunzisoft.keepass.tasks.BinaryDatabaseManager -import com.kunzisoft.keepass.utils.getParcelableExtraCompat import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile +import com.kunzisoft.keepass.utils.getParcelableExtraCompat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.util.* +import java.util.LinkedList import java.util.concurrent.CopyOnWriteArrayList @@ -282,15 +282,21 @@ class AttachmentFileNotificationService: LockNotificationService() { AttachmentState.ERROR -> { ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_DETACH) try { - notificationManager?.notify( - attachmentNotification.notificationId, - builder.build() - ) + checkNotificationsPermission(this) { + notificationManager?.notify( + attachmentNotification.notificationId, + builder.build() + ) + } } catch (e: SecurityException) { Log.e(TAG, "Unable to notify the attachment state", e) } } else -> { - startForeground(attachmentNotification.notificationId, builder.build()) + startForegroundCompat( + attachmentNotification.notificationId, + builder, + NotificationServiceType.ATTACHMENT + ) } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationService.kt index fe32743fa..b33213891 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationService.kt @@ -19,16 +19,12 @@ */ package com.kunzisoft.keepass.services -import android.Manifest import android.app.Activity import android.app.PendingIntent import android.content.Context import android.content.Intent -import android.content.pm.PackageManager import android.os.Build import android.util.Log -import android.widget.Toast -import androidx.core.content.ContextCompat import com.kunzisoft.keepass.R import com.kunzisoft.keepass.model.EntryInfo import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_TOKEN_FIELD @@ -196,23 +192,29 @@ class ClipboardEntryNotificationService : LockNotificationService() { //Get settings val notificationTimeoutMilliSecs = PreferencesUtil.getClipboardTimeout(this) if (notificationTimeoutMilliSecs != NEVER) { - defineTimerJob(builder, notificationTimeoutMilliSecs, { - val newGeneratedValue = fieldToCopy.getGeneratedValue(mEntryInfo) - // New auto generated value - if (generatedValue != newGeneratedValue) { - generatedValue = newGeneratedValue - clipboardHelper?.copyToClipboard( - fieldToCopy.label, - generatedValue, - fieldToCopy.isSensitive - ) + defineTimerJob( + builder, + NotificationServiceType.CLIPBOARD, + notificationTimeoutMilliSecs, + { + val newGeneratedValue = fieldToCopy.getGeneratedValue(mEntryInfo) + // New auto generated value + if (generatedValue != newGeneratedValue) { + generatedValue = newGeneratedValue + clipboardHelper?.copyToClipboard( + fieldToCopy.label, + generatedValue, + fieldToCopy.isSensitive + ) + } + }, + { + stopNotificationAndSendLockIfNeeded() + // Clean password only if no next field + if (nextFields.size <= 0) + clipboardHelper?.cleanClipboard() } - }) { - stopNotificationAndSendLockIfNeeded() - // Clean password only if no next field - if (nextFields.size <= 0) - clipboardHelper?.cleanClipboard() - } + ) } else { // No timer checkNotificationsPermission { @@ -226,12 +228,11 @@ class ClipboardEntryNotificationService : LockNotificationService() { } private fun checkNotificationsPermission(action: () -> Unit) { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) - == PackageManager.PERMISSION_GRANTED) { - action.invoke() - } else { - showPermissionErrorIfNeeded(this) - } + checkNotificationsPermission( + this, + PreferencesUtil.isClipboardNotificationsEnable(this), + action + ) } override fun onTaskRemoved(rootIntent: Intent?) { @@ -255,26 +256,14 @@ class ClipboardEntryNotificationService : LockNotificationService() { const val EXTRA_CLIPBOARD_FIELDS = "EXTRA_CLIPBOARD_FIELDS" const val ACTION_CLEAN_CLIPBOARD = "ACTION_CLEAN_CLIPBOARD" - private fun showPermissionErrorIfNeeded(context: Context) { - if (PreferencesUtil.isClipboardNotificationsEnable(context)) { - Toast.makeText(context, R.string.warning_copy_permission, Toast.LENGTH_LONG).show() - } - } - fun checkAndLaunchNotification( activity: Activity, entry: EntryInfo ) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - if (ContextCompat.checkSelfPermission( - activity, - Manifest.permission.POST_NOTIFICATIONS - ) == PackageManager.PERMISSION_GRANTED) { - launchNotificationIfAllowed(activity, entry) - } else { - showPermissionErrorIfNeeded(activity) - } - } else { + checkNotificationsPermission( + activity, + PreferencesUtil.isClipboardNotificationsEnable(activity) + ) { launchNotificationIfAllowed(activity, entry) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index cbdf7dbd5..9d6c0baf3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -591,7 +591,11 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } // Create the notification - startForeground(notificationId, notificationBuilder.build()) + startForegroundCompat( + notificationId, + notificationBuilder, + NotificationServiceType.DATABASE_TASK + ) } private fun removeIntentData(intent: Intent?) { diff --git a/app/src/main/java/com/kunzisoft/keepass/services/KeyboardEntryNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/KeyboardEntryNotificationService.kt index e37093774..9986b304a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/KeyboardEntryNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/KeyboardEntryNotificationService.kt @@ -111,13 +111,18 @@ class KeyboardEntryNotificationService : LockNotificationService() { .setContentIntent(null) .setDeleteIntent(pendingDeleteIntent) - notificationManager?.cancel(notificationId) - notificationManager?.notify(notificationId, builder.build()) + checkNotificationsPermission(this, PreferencesUtil.isKeyboardNotificationEntryEnable(this)) { + notificationManager?.notify(notificationId, builder.build()) + } // Timeout only if notification clear is available if (PreferencesUtil.isClearKeyboardNotificationEnable(this)) { if (mNotificationTimeoutMilliSecs != TimeoutHelper.NEVER) { - defineTimerJob(builder, mNotificationTimeoutMilliSecs) { + defineTimerJob( + builder, + NotificationServiceType.KEYBOARD, + mNotificationTimeoutMilliSecs + ) { stopNotificationAndSendLockIfNeeded() } } diff --git a/app/src/main/java/com/kunzisoft/keepass/services/NotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/NotificationService.kt index 8cb27eef0..a3eb2bf9b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/NotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/NotificationService.kt @@ -1,17 +1,30 @@ package com.kunzisoft.keepass.services +import android.Manifest import android.app.NotificationChannel import android.app.NotificationManager import android.app.Service +import android.content.Context import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC +import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE +import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE import android.os.Build import android.os.IBinder import android.util.TypedValue +import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.stylish.Stylish -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch abstract class NotificationService : Service() { @@ -74,7 +87,32 @@ abstract class NotificationService : Service() { } } + protected fun startForegroundCompat(notificationId: Int, + builder: NotificationCompat.Builder, + type: NotificationServiceType + ) { + @Suppress("DEPRECATION") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val foregroundServiceTimer = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + FOREGROUND_SERVICE_TYPE_SPECIAL_USE + } else { + FOREGROUND_SERVICE_TYPE_NONE + } + val foregroundType = when (type) { + NotificationServiceType.DATABASE_TASK -> FOREGROUND_SERVICE_TYPE_DATA_SYNC + NotificationServiceType.ATTACHMENT -> FOREGROUND_SERVICE_TYPE_DATA_SYNC + NotificationServiceType.CLIPBOARD -> foregroundServiceTimer + NotificationServiceType.KEYBOARD -> foregroundServiceTimer + NotificationServiceType.ADVANCED_UNLOCK -> foregroundServiceTimer + } + startForeground(notificationId, builder.build(), foregroundType) + } else { + startForeground(notificationId, builder.build()) + } + } + protected fun defineTimerJob(builder: NotificationCompat.Builder, + type: NotificationServiceType, timeoutMilliseconds: Long, actionAfterASecond: (() -> Unit)? = null, actionEnd: () -> Unit) { @@ -87,7 +125,7 @@ abstract class NotificationService : Service() { builder.setProgress(100, (currentTime * 100 / timeoutInSeconds).toInt(), false) - startForeground(notificationId, builder.build()) + startForegroundCompat(notificationId, builder, type) delay(1000) if (currentTime <= 0) { actionEnd() @@ -114,5 +152,25 @@ abstract class NotificationService : Service() { companion object { private const val CHANNEL_ID = "com.kunzisoft.keepass.notification.channel" private const val CHANNEL_NAME = "KeePassDX notification" + + fun checkNotificationsPermission( + context: Context, + showError: Boolean = true, + action: () -> Unit + ) { + if (ContextCompat.checkSelfPermission(context, + Manifest.permission.POST_NOTIFICATIONS) + == PackageManager.PERMISSION_GRANTED) { + action.invoke() + } else { + if (showError) { + Toast.makeText( + context, + R.string.warning_copy_permission, + Toast.LENGTH_LONG + ).show() + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/services/NotificationServiceType.kt b/app/src/main/java/com/kunzisoft/keepass/services/NotificationServiceType.kt new file mode 100644 index 000000000..dd5213517 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/services/NotificationServiceType.kt @@ -0,0 +1,9 @@ +package com.kunzisoft.keepass.services + +enum class NotificationServiceType { + DATABASE_TASK, + ATTACHMENT, + CLIPBOARD, + KEYBOARD, + ADVANCED_UNLOCK +} \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt new file mode 100644 index 000000000..dad2ff6c8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -0,0 +1 @@ + * Upgrade to API 34 (Android 14) \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/132.txt b/fastlane/metadata/android/fr-FR/changelogs/132.txt new file mode 100644 index 000000000..55a28801c --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/132.txt @@ -0,0 +1 @@ + * Mise à jour vers API 34 (Android 14) \ No newline at end of file From f4b7db667fee74efa65457ed9ee23d57da9d550a Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 24 Jun 2024 12:59:33 +0200 Subject: [PATCH 007/119] fix: Broadcast Receiver #1730 --- .../main/java/com/igreenwood/loupe/Loupe.kt | 10 ++++++--- .../app/database/CipherDatabaseAction.kt | 11 ++++++---- .../keepass/database/DatabaseTaskProvider.kt | 5 +++-- .../keepass/utils/BroadcastAction.kt | 22 ++++++++++--------- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/igreenwood/loupe/Loupe.kt b/app/src/main/java/com/igreenwood/loupe/Loupe.kt index 0fe5177f6..a6f36bb45 100644 --- a/app/src/main/java/com/igreenwood/loupe/Loupe.kt +++ b/app/src/main/java/com/igreenwood/loupe/Loupe.kt @@ -38,7 +38,11 @@ import android.graphics.RectF import android.graphics.drawable.BitmapDrawable import android.os.Build import android.util.TypedValue -import android.view.* +import android.view.GestureDetector +import android.view.MotionEvent +import android.view.ScaleGestureDetector +import android.view.View +import android.view.ViewGroup import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.DecelerateInterpolator import android.view.animation.Interpolator @@ -202,7 +206,7 @@ class Loupe(imageView: ImageView, container: ViewGroup) : View.OnTouchListener, override fun onDown(e: MotionEvent): Boolean = true override fun onScroll( - e1: MotionEvent, + e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float @@ -220,7 +224,7 @@ class Loupe(imageView: ImageView, container: ViewGroup) : View.OnTouchListener, } override fun onFling( - e1: MotionEvent, + e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseAction.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseAction.kt index d193466fc..d20edeb8a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseAction.kt @@ -27,6 +27,7 @@ import android.net.Uri import android.os.IBinder import android.util.Base64 import android.util.Log +import androidx.core.content.ContextCompat import com.kunzisoft.keepass.database.element.binary.BinaryData.Companion.BASE64_FLAG import com.kunzisoft.keepass.model.CipherEncryptDatabase import com.kunzisoft.keepass.services.AdvancedUnlockNotificationService @@ -69,9 +70,11 @@ class CipherDatabaseAction(context: Context) { @Synchronized private fun attachService(performedAction: () -> Unit) { - applicationContext.registerReceiver(mAdvancedUnlockBroadcastReceiver, IntentFilter().apply { - addAction(AdvancedUnlockNotificationService.REMOVE_ADVANCED_UNLOCK_KEY_ACTION) - }) + ContextCompat.registerReceiver(applicationContext, mAdvancedUnlockBroadcastReceiver, + IntentFilter().apply { + addAction(AdvancedUnlockNotificationService.REMOVE_ADVANCED_UNLOCK_KEY_ACTION) + }, ContextCompat.RECEIVER_EXPORTED + ) mServiceConnection = object : ServiceConnection { override fun onServiceConnected(name: ComponentName?, serviceBinder: IBinder?) { @@ -97,7 +100,7 @@ class CipherDatabaseAction(context: Context) { private fun detachService() { try { applicationContext.unregisterReceiver(mAdvancedUnlockBroadcastReceiver) - } catch (e: Exception) {} + } catch (_: Exception) {} mServiceConnection?.let { AdvancedUnlockNotificationService.unbindService(applicationContext, it) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/DatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/DatabaseTaskProvider.kt index 6ef9efcd8..cd38f0046 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/DatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/DatabaseTaskProvider.kt @@ -40,6 +40,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale import androidx.core.content.ContextCompat +import androidx.core.content.ContextCompat.RECEIVER_NOT_EXPORTED import androidx.fragment.app.FragmentActivity import androidx.lifecycle.lifecycleScope import com.kunzisoft.keepass.R @@ -330,11 +331,11 @@ class DatabaseTaskProvider( } } } - context.registerReceiver(databaseTaskBroadcastReceiver, + ContextCompat.registerReceiver(context, databaseTaskBroadcastReceiver, IntentFilter().apply { addAction(DATABASE_START_TASK_ACTION) addAction(DATABASE_STOP_TASK_ACTION) - } + }, RECEIVER_NOT_EXPORTED ) // Check if a service is currently running else do nothing diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt index b496e7faf..8d42310fa 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt @@ -29,6 +29,7 @@ import android.content.Intent import android.content.IntentFilter import android.os.Build import android.util.Log +import androidx.core.content.ContextCompat import com.kunzisoft.keepass.R import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.magikeyboard.MagikeyboardService @@ -45,9 +46,9 @@ const val LOCK_ACTION = "com.kunzisoft.keepass.LOCK" const val REMOVE_ENTRY_MAGIKEYBOARD_ACTION = "com.kunzisoft.keepass.REMOVE_ENTRY_MAGIKEYBOARD" const val BACK_PREVIOUS_KEYBOARD_ACTION = "com.kunzisoft.keepass.BACK_PREVIOUS_KEYBOARD" -class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() { +class LockReceiver(private var lockAction: () -> Unit) : BroadcastReceiver() { - var mLockPendingIntent: PendingIntent? = null + private var mLockPendingIntent: PendingIntent? = null var backToPreviousKeyboardAction: (() -> Unit)? = null override fun onReceive(context: Context, intent: Intent) { @@ -60,7 +61,7 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() { } Intent.ACTION_SCREEN_OFF -> { if (PreferencesUtil.isLockDatabaseWhenScreenShutOffEnable(context)) { - mLockPendingIntent = PendingIntent.getBroadcast(context, + val lockPendingIntent = PendingIntent.getBroadcast(context, 4575, Intent(intent).apply { action = LOCK_ACTION @@ -71,6 +72,7 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() { 0 } ) + this.mLockPendingIntent = lockPendingIntent // Launch the effective action after a small time val first: Long = System.currentTimeMillis() + context.getString(R.string.timeout_screen_off).toLong() (context.getSystemService(ALARM_SERVICE) as AlarmManager?)?.let { alarmManager -> @@ -80,20 +82,20 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() { alarmManager.set( AlarmManager.RTC_WAKEUP, first, - mLockPendingIntent + lockPendingIntent ) } else { alarmManager.setExact( AlarmManager.RTC_WAKEUP, first, - mLockPendingIntent + lockPendingIntent ) } } else { alarmManager.set( AlarmManager.RTC_WAKEUP, first, - mLockPendingIntent + lockPendingIntent ) } } @@ -120,9 +122,9 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() { } private fun cancelLockPendingIntent(context: Context) { - mLockPendingIntent?.let { + mLockPendingIntent?.let { lockPendingIntent -> val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager? - alarmManager?.cancel(mLockPendingIntent) + alarmManager?.cancel(lockPendingIntent) mLockPendingIntent = null } } @@ -131,7 +133,7 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() { fun Context.registerLockReceiver(lockReceiver: LockReceiver?, registerKeyboardAction: Boolean = false) { lockReceiver?.let { - registerReceiver(it, IntentFilter().apply { + ContextCompat.registerReceiver(this, it, IntentFilter().apply { addAction(Intent.ACTION_SCREEN_OFF) addAction(Intent.ACTION_SCREEN_ON) addAction(LOCK_ACTION) @@ -139,7 +141,7 @@ fun Context.registerLockReceiver(lockReceiver: LockReceiver?, addAction(REMOVE_ENTRY_MAGIKEYBOARD_ACTION) addAction(BACK_PREVIOUS_KEYBOARD_ACTION) } - }) + }, ContextCompat.RECEIVER_EXPORTED) } } From 8d2de40df6ae9073030ea05a35b8ff1136ca9acc Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 24 Jun 2024 13:14:52 +0200 Subject: [PATCH 008/119] fix: Upgrade all modules to API 34 #1730 --- app/build.gradle | 1 - crypto/build.gradle | 5 ++--- database/build.gradle | 5 ++--- icon-pack/build.gradle | 5 ++--- icon-pack/classic/build.gradle | 5 ++--- icon-pack/material/build.gradle | 5 ++--- .../main/java/com/kunzisoft/keepass/icon/IconPack.kt | 10 ++++++---- 7 files changed, 16 insertions(+), 20 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a9a765060..224b0dc6d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,6 @@ apply plugin: 'kotlin-kapt' android { namespace 'com.kunzisoft.keepass' compileSdkVersion 34 - buildToolsVersion "33.0.2" defaultConfig { applicationId "com.kunzisoft.keepass" diff --git a/crypto/build.gradle b/crypto/build.gradle index dabc737ed..20634e48f 100644 --- a/crypto/build.gradle +++ b/crypto/build.gradle @@ -5,13 +5,12 @@ plugins { android { namespace 'com.kunzisoft.encrypt' - compileSdkVersion 33 - buildToolsVersion "33.0.2" + compileSdkVersion 34 ndkVersion "21.4.7075529" defaultConfig { minSdkVersion 15 - targetSdkVersion 33 + targetSdkVersion 34 multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/database/build.gradle b/database/build.gradle index 5d094478f..b11df6359 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -3,12 +3,11 @@ apply plugin: 'kotlin-android' android { namespace 'com.kunzisoft.keepass.database' - compileSdkVersion 33 - buildToolsVersion "33.0.2" + compileSdkVersion 34 defaultConfig { minSdkVersion 15 - targetSdk 33 + targetSdk 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/icon-pack/build.gradle b/icon-pack/build.gradle index 5285bb64c..bceaec7f5 100644 --- a/icon-pack/build.gradle +++ b/icon-pack/build.gradle @@ -3,12 +3,11 @@ apply plugin: 'kotlin-android' android { namespace 'com.kunzisoft.keepass.icon' - compileSdkVersion 33 - buildToolsVersion '33.0.2' + compileSdkVersion 34 defaultConfig { minSdkVersion 14 - targetSdkVersion 33 + targetSdkVersion 34 } compileOptions { diff --git a/icon-pack/classic/build.gradle b/icon-pack/classic/build.gradle index 24d79b865..c5262974d 100644 --- a/icon-pack/classic/build.gradle +++ b/icon-pack/classic/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.library' android { namespace 'com.kunzisoft.keepass.icon.classic' - compileSdkVersion 33 - buildToolsVersion '33.0.2' + compileSdkVersion 34 defaultConfig { minSdkVersion 14 - targetSdkVersion 33 + targetSdkVersion 34 } resourcePrefix 'classic_' diff --git a/icon-pack/material/build.gradle b/icon-pack/material/build.gradle index ada0c8d61..b4dfe5d79 100644 --- a/icon-pack/material/build.gradle +++ b/icon-pack/material/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.library' android { namespace 'com.kunzisoft.keepass.icon.material' - compileSdkVersion 33 - buildToolsVersion '33.0.2' + compileSdkVersion 34 defaultConfig { minSdkVersion 14 - targetSdkVersion 33 + targetSdkVersion 34 } resourcePrefix 'material_' diff --git a/icon-pack/src/main/java/com/kunzisoft/keepass/icon/IconPack.kt b/icon-pack/src/main/java/com/kunzisoft/keepass/icon/IconPack.kt index 3996e336a..d60a59029 100644 --- a/icon-pack/src/main/java/com/kunzisoft/keepass/icon/IconPack.kt +++ b/icon-pack/src/main/java/com/kunzisoft/keepass/icon/IconPack.kt @@ -19,18 +19,19 @@ */ package com.kunzisoft.keepass.icon +import android.annotation.SuppressLint import android.content.Context import android.content.res.Resources import android.util.SparseIntArray -import java.util.* +import java.util.Locale /** * Class who construct dynamically database icons contains in a separate library * * - * It only supports icons with specific nomenclature **[stringId]_[%2d]_32dp** - * where [stringId] contains in a string xml attribute with id **resource_id** and - * [%2d] 2 numerical numbers between 00 and 68 included, + * It only supports icons with specific nomenclature **{stringId}_{%2d}_32dp** + * where {stringId} contains in a string xml attribute with id **resource_id** and + * {%2d} 2 numerical numbers between 00 and 68 included, * * * See *icon-pack-classic* module as sample @@ -41,6 +42,7 @@ import java.util.* * @param packageName Context of the app to retrieve the resources * @param resourceId String Id of the pack (ex : com.kunzisoft.keepass.icon.classic.R.string.resource_id) */ +@SuppressLint("DiscouragedApi") class IconPack(packageName: String, resources: Resources, resourceId: Int) { private val icons: SparseIntArray = SparseIntArray() From afc034b4956ddc59503c83961a334db3fcebca5e Mon Sep 17 00:00:00 2001 From: shuvashish76 Date: Mon, 24 Jun 2024 19:00:43 +0530 Subject: [PATCH 009/119] Improved IzzyOnDroid shield --- README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 97fc4c9e8..8189bcb26 100644 --- a/README.md +++ b/README.md @@ -50,14 +50,12 @@ Optional visual styles are accessible after a contribution (and a congratulatory *[F-Droid](https://f-droid.org/packages/com.kunzisoft.keepass.libre/) is the recommended way of installing, a libre software project that verifies all the libraries and app code is libre software.* -| Source | Status | Version | +| Source | Status | [Version](https://github.com/Kunzisoft/KeePassDX/wiki/FAQ#why-a-libre-and-free-version) | |--------|--------|---------| -| [Google Play](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free) | ![PlayStore release](https://img.shields.io/endpoint?color=green&logo=google-play&logoColor=green&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dcom.kunzisoft.keepass.free%26gl%3DUS%26hl%3Den%26l%3DGoogle%2520Play%26m%3D%24version) | Free + [Pro](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro) | -| [F-Droid](https://f-droid.org/en/packages/com.kunzisoft.keepass.libre/) | ![F-Droid Version](https://img.shields.io/f-droid/v/com.kunzisoft.keepass.libre?logo=F-Droid) | Libre | -| [IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/com.kunzisoft.keepass.free) | ![IzzyOnDroid Version](https://img.shields.io/endpoint?url=https://apt.izzysoft.de/fdroid/api/v1/shield/com.kunzisoft.keepass.free&label=IzzyOnDroid) | Free | -| [GitHub](https://github.com/Kunzisoft/KeePassDX/releases) / [Obtainium](https://github.com/ImranR98/Obtainium) | ![GitHub Release](https://img.shields.io/github/v/release/Kunzisoft/KeePassDX?include_prereleases&logo=GitHub) | Free & Libre | - -[Version [differences](https://github.com/Kunzisoft/KeePassDX/wiki/FAQ#why-a-libre-and-free-version)] +| [Google Play](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free) | ![Google Play Release](https://img.shields.io/endpoint?color=blue&logo=google-play&logoColor=green&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dcom.kunzisoft.keepass.free%26gl%3DUS%26hl%3Den%26l%3DGoogle%2520Play%26m%3D%24version) | Free + [Pro](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro) | +| [F-Droid](https://f-droid.org/en/packages/com.kunzisoft.keepass.libre/) | ![F-Droid Version](https://img.shields.io/f-droid/v/com.kunzisoft.keepass.libre?logo=F-Droid&label=F-Droid) | Libre | +| [IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/com.kunzisoft.keepass.free) | ![IzzyOnDroid Version](https://img.shields.io/endpoint?&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAADAFBMVEUA0////wAA0v8A0v8A0////wD//wAFz/QA0/8A0/8A0/8A0/8A0v///wAA0/8A0/8A0/8A0/8A0//8/gEA0/8A0/8B0/4A0/8A0/8A0/+j5QGAwwIA0//C9yEA0/8A0/8A0/8A0/8A0/8A0/+n4SAA0/8A0/8A0/+o6gCw3lKt7QCv5SC+422b3wC19AC36zAA0/+d1yMA0/8A0/+W2gEA0/+w8ACz8gCKzgG7+QC+9CFLfwkA0/8A0////wAA0/8A0/8A0/8A0/+f2xym3iuHxCGq5BoA1P+m2joI0vONyiCz3mLO7oYA0/8M1Piq3Ei78CbB8EPe8LLj9Ly751G77zWQ1AC96UYC0fi37CL//wAA0/8A0////wD//wCp3jcA0/+j3SGj2i/I72Sx4zHE8FLB8zak1kYeycDI6nRl3qEA0/7V7psA0v6WzTa95mGi2RvB5XkPy9zH5YJ3uwGV1yxVihRLiwdxtQ1ZkAf//wD//wD//wD//wD//wCn5gf//wD//wD//wD//wD//wAA0/+h4A3R6p8A0/+X1w565OD6/ARg237n9csz2vPz+gNt37V/vifO8HW68B/L6ZOCwxXY8KRQsWRzhExAtG/E612a1Rd/pTBpmR9qjysduKVhmxF9mTY51aUozK+CsDSA52T//wD//wAA0////wD//wBJ1JRRxFWjzlxDyXRc0pGT1wCG0CWB3VGUzSTh8h6c0TSr5CCJ5FFxvl6s4H3m8xML0/DA5CvK51EX1N+Y2gSt4Dag3ChE3fax2ki68yO57NF10FRZnUPl88eJxhuCxgCz5EOLwEGf1DFutmahzGW98x0W1PGk3R154MHE6bOn69qv3gy92oG90o+Hn07B7rhCmiyMwECv1nO+0pQfwrCo57xF2daXsVhKrEdenQAduaee1Bsjr42z5D9RoCXy+QNovXpy2Z5MtWDO/TiSukaF3UtE1K6j3B4YwLc5wXlzpyIK0u5zy3uJqg4pu5RTpkZmpVKyAP8A0wBHcExHcEyBUSeEAAABAHRSTlP///9F9wjAAxD7FCEGzBjd08QyEL39abMd6///8P/ZWAnipIv/cC6B//7////////L/1Dz/0D///////86/vYnquY3/v///5T//v///17///////////////84S3QNB/8L/////////////7r/////NP////9l/////wPD4yis/x7Ym2lWSP+em////0n////////v///////////////////7//7pdGN3Urr6/+v/6aT////+//H/o2P/1v+7r7jp4PM/3p4g////g///K///481LxO///v////9w////8v/////9/p3J///a+P9v/5KR/+n///+p/xf//8P//wAAe7FyaAAABCZJREFUSMdj+E8iYKBUgwIHnwQ3N7cEHxcH+///VayoAE0Dh41qR7aBnCIQ8MsJKHH9/99czYYMWlA0cIkJGjMgAKfq//9RNYzIgLcBWYOTiCgDMhDn+B9bh6LebiWyH6L5UZQzONoAHWSHoqEpDkkDsyKqelv1//9rG1HUN9YihZK9AKp6BkG+/6xNqA5ajhSsCkrIipmYGGRa//9vQXVQXSySBnkWJOUMfn5Myuz/G3hR1NdEIUUchwiy+bkTsg4dbW/fu6W/e1c3XMMy5JiOZkFxUFZo74mgKTqaKXu0+2HqVwkja3BH9kFu361JwcHTfPJD4mdfe8ULAdVRyGlJAcVFfg+CQOozZ4XrJ85+JgwBsVXIGriQw5Tp4ZScezd8JiWnBupru30qwJZa+ZAjmWlC8fUZM4qB6kPnLNSPLMWqQQ5ZQ5aOzs1HmamBaQHzFs6y+qAmJCTE8f9/QgKSBg4DJPWc6zVDQkIC09JkZSPD38kukpExFpT4z67uYI/QwCOOCCK/izvu5CWl6AcEWMnKWml7LWbKZfH9/99UkknQHhGsynDz+65eWXv3/JmJrq5eXienVlRUfH/z8VvCf45soKQIH1yDEQsszrp6gwq9C73T87xcXadKl5TkFev4A/2tygmSBqYXqAYJmK+ZuoJydDR1vP09DA0NOy2kpdML81+U/heCpH1JU3jig7lJ5nKOT4i/t6ZHkqGzs4lJmIVHfrj+JR4HqLQSD0yDkCNEpGNn5ix9D03/eJdElTZdKV2TpNOhkwt8YUlNUgimgV0dLMBvf1gz1MolPd5FRcVNSkpDQ8owJeBCDyIhrIDnOD5QcuIU+3/2QKSs9laQ+noNLS0zLWdtqyP7mBAFAw88TwsJgMuJYweBGjYngtWbmeuZOW+bvNQToUFOAlFqOBk4Ov3/L7Z60/aN0p1tUhpa5nqWlub7C3p2I9QzyAghlUvczOz/1fhzPT3XSIfpSmmYAdVbmm1gV0dSz8DSilpUQsqCddIWIA3meuZaJqdMJZEzl6gRqgZIWZAxUdoizERXN8yi5MltcZTChzMaRQM3JNUWHS8rL/+yaPGvMmvr5ywoGoxtkDWwQ+Pb89ycBeWfGSJeL/la+RS1eOPnRtbQKgMRjZg+t8x6PkP273nWQAoFOPAgaeAThKXAmXMrK39Kmr5fsuBlBqoXfJGLe3VbmHjG9Mczi9T//3h7vygXtcDlQtJg44iQiIjIBRbGPO7gghPJy0ZIxT2HOLIUgwxQzsgYrUR350HSIMaJLidhgKY+mw+pflBDrX8E7OGBjPCAPc76gQFSTqAIiYrb/8dRP4CyosJ/rmwU5XIxHMilt4QBJwsSkBMClxOQULBlkRRwEONmR2kJcDGjADX2/+xO8r5iqjExqmLyrWpcPFRta1BfAwCtyN3XpuJ4RgAAAABJRU5ErkJggg==&url=https://apt.izzysoft.de/fdroid/api/v1/shield/com.kunzisoft.keepass.free&label=IzzyOnDroid) | Free | +| [GitHub](https://github.com/Kunzisoft/KeePassDX/releases) / [Obtainium](https://github.com/ImranR98/Obtainium) | ![GitHub Release](https://img.shields.io/github/v/release/Kunzisoft/KeePassDX?include_prereleases&logo=GitHub&label=GitHub) | Free & Libre | ## Verify the authenticity of the downloaded app from GitHub 1- Download the latest app from [GitHub releases](https://github.com/Kunzisoft/KeePassDX/releases/latest).
@@ -75,6 +73,7 @@ You should get this output: ``` SHA256: 7D:55:B8:AF:21:03:81:AA:BF:96:0F:07:E1:7C:F7:85:7B:6D:2A:64:2C:A2:DA:6B:F0:BD:F1:B2:00:36:2F:04 ``` + ## Frequently Asked Questions Other questions? You can read the [FAQ](https://github.com/Kunzisoft/KeePassDX/wiki/FAQ) From c47e7edc9ea4292b0981fb905a893b9851571e25 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Mon, 24 Jun 2024 08:20:54 +0000 Subject: [PATCH 010/119] Translated using Weblate (German) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/ --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a50db085e..46cd6f56a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -485,7 +485,7 @@ Datei trotzdem hinzufügen\? Zeigt die mit einem Eintrag oder einer Gruppe verknüpfte UUID an UUID anzeigen - Das Speichern von Daten ist bei einer schreibgeschützt geöffneter Datenbank nicht möglich. + Das Speichern von Daten ist bei einer schreibgeschützt geöffneten Datenbank nicht möglich. Datenbank schließen Nach dem Sperren der Datenbank automatisch zur vorherigen Tastatur wechseln Datenbank sperren From 499152d066a468c50aece716097888c62da6d5d9 Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Mon, 24 Jun 2024 11:18:10 +0000 Subject: [PATCH 011/119] Translated using Weblate (German) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/ --- app/src/main/res/values-de/strings.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 46cd6f56a..407babb6e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -184,7 +184,7 @@ Arbeitsspeichernutzung Arbeitsspeicher, der für die Schlüsselableitung gebraucht wird. Parallelisierung - Grad der Parallelisierung (d. h. Anzahl der Threads), der für die Schlüsselableitung genutzt wird. + Grad der Parallelisierung (d. h. Anzahl der Threads), der für die Schlüsselableitung genutzt wird. Sortieren Aufsteigend ↓ Gruppen oben @@ -228,7 +228,7 @@ Existierende Datenbank öffnen Öffnet über den Dateimanager eine früher erstellte Datenbankdatei, um sie weiter zu verwenden. Datenbankelemente hinzufügen - Einträge helfen digitale Konten zu verwalten. + Einträge helfen, digitale Konten zu verwalten. \n \nGruppen/Ordner gliedern Einträge in der Datenbank. Einträge durchsuchen @@ -236,7 +236,7 @@ Eintrag bearbeiten Dem Eintrag eigene Felder hinzufügen. Die Felder können mit Querverweisen aus anderen Einträgen ergänzt werden. Ein starkes Passwort erstellen - Lassen Sie ein starkes Passwort erstellen, das mit Ihrem Eintrag verbunden wird, legen Sie es einfach anhand von Formularkriterien fest und vergessen Sie nicht Ihr Passwort zu sichern. + Lassen Sie ein starkes Passwort erstellen, das mit Ihrem Eintrag verbunden wird, legen Sie es einfach anhand von Formularkriterien fest und vergessen Sie nicht, Ihr Passwort zu sichern. Eigene Felder hinzufügen Ein zusätzliches Feld einfügen, einen Wert hinzufügen und diesen optional schützen. Datenbank entsperren @@ -626,8 +626,8 @@ Suchfilter Aktuelle Gruppe Groß-/Kleinschreibung beachten - Zusammenführen von … - Kopie speichern unter … + Zusammenführen von … + Kopie speichern unter … Navigationskopfzeile Navigationsleiste schließen Navigationsleiste öffnen @@ -636,6 +636,7 @@ Diese Funktion speichert verschlüsselte Anmeldedaten im sicheren Schlüsselspeicher dieses Geräts. \n \nJe nach der internen API-Implementierung des Betriebssystems kann sie eingeschränkt sein. +\n \nBitte die Kompatibilität und Sicherheit des Schlüsselspeichers vom Gerätehersteller und vom Ersteller der verwendeten ROM abgleichen. Passphrasen-Wortanzahl Passphrase From b3f8ce9c169559f619993611f556148e2b767bdc Mon Sep 17 00:00:00 2001 From: searinminecraft <114207889+searinminecraft@users.noreply.github.com> Date: Thu, 27 Jun 2024 04:53:55 +0000 Subject: [PATCH 012/119] Translated using Weblate (Filipino) Currently translated at 46.4% (306 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fil/ --- app/src/main/res/values-fil/strings.xml | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index f92d348c0..84be809f5 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -279,4 +279,32 @@ Magbukas ng umiiral na vault Gumawa ng bagong vault Mabilis na paghahanap + Humiling ng paghahanap kapag bumubukas ng database + Subdomain na paghahanap + Maghanap ng mga web domain gamit ang mga constraint ng subdomain + Gumagawa ng bagong database… + Nagtatrabaho… + Naka-write protect + Nalalaman ng mga duplicate na UUID ang database. + Lutasin ang problema sa pamamagitan ng pag-generate ng mga bagong UUID sa mga duplicate para magpatuloy? + Mode ng pag-save + Sinusubaybayan kung saan naka-imbak ang mga keyfile + Tandaan ang mga hardware key + Ipakita ang mga kamakailang file + Pinapakita ang mga lokasyon ng mga kamakailang database + Itago ang mga sirang link ng database + I-import ang mga setting ng app + Pumili ng file upang i-import ang mga setting ng app + I-export ang mga setting ng app + Gumawa ng file para i-export ang mga setting ng app + Mode ng paghahanap + Mode ng pagpili + Mode ng pagrehistro + Sinusubaybayan kung saan naka-imbak ang mga database + Tandaan ang mga lokasyon ng keyfile + Sinusubaybayan ang mga ginamit na hardware key + Itago ang mga sirang link sa listahan ng mga kamakailang database + Depende sa iyong file manager, hindi maaring pinapayagan ang KeePassDX na mag-write sa iyong storage. + Proteksyon + Tandaan ang mga lokasyon ng database \ No newline at end of file From bf1b84dfeae65a5b2fe6ec741fa639ed84dff4ed Mon Sep 17 00:00:00 2001 From: Ben Towali Date: Sun, 30 Jun 2024 18:56:02 +0000 Subject: [PATCH 013/119] Translated using Weblate (Estonian) Currently translated at 9.2% (61 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/et/ --- app/src/main/res/values-et/strings.xml | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index a3edae8b2..09686bcde 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -18,4 +18,47 @@ Lisa kirje Muuda kirjet Aegumine + Sulud + Luba + Lõikepuhver puhastatud + Taust + Ava fail + Lisa kirje + Lisa grupp + Ühekordse salasõna info + Kirje ikoon + Andmebaasi värv + Valideeri + Loobu muudatustest? + Loobu + Salasõna generaator + Salasõna pikkus + Kirje esiplaani värv + Kirje taustavärv + Lisa väli + Lisa manus + Eemalda väli + Uuenda + Kustuta + Kopeeri %1$s lõikepuhverisse + Andmebaas + Mallid + Dekrüpteerin andmebaasi sisu… + Numbrid + Loobun + Märkmed + Kinnita salasõna + Loodud + Aegub + Aegunud + UUID + Ajalugu + Manused + Võtmefail + Muudetud + Otsitav + Ei leidnud kirje sisu. + Salasõna + Salvesta + Pealkiri \ No newline at end of file From e0f563befbb000b19d5265d09c7e3e9822653170 Mon Sep 17 00:00:00 2001 From: WebTrans Date: Mon, 1 Jul 2024 01:08:37 +0000 Subject: [PATCH 014/119] Translated using Weblate (Hebrew) Currently translated at 44.3% (292 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/ --- app/src/main/res/values-iw/strings.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index d32de8094..291a6ef23 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -124,7 +124,8 @@ גרסת מסד נתונים לא נתמכת. רישית גרסה %1$s - הזן סיסמה ו/או קובץ מפתח כדי לפתוח את מסד הנתונים. גבה את קובץ מסד הנתונים שלך במקום בטוח לאחר כל שינוי. + הזן סיסמה ו/או קובץ מפתח כדי לפתוח את מסד הנתונים. +\nגבה את קובץ מסד הנתונים שלך במקום בטוח לאחר כל שינוי. קטן בינוני @@ -322,4 +323,5 @@ זכור מיקומי מסדי הנתונים מצב שמירה מצב בחירה + חיפוש, לנעול, היסטוריה, מאפיינים \ No newline at end of file From af5b36752c6688fc8b14cb2e27af503f9e7a580d Mon Sep 17 00:00:00 2001 From: Ben Towali Date: Sun, 30 Jun 2024 19:20:57 +0000 Subject: [PATCH 015/119] Translated using Weblate (Estonian) Currently translated at 19.8% (131 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/et/ --- app/src/main/res/values-et/strings.xml | 70 ++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 09686bcde..6eff61daf 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -61,4 +61,74 @@ Salasõna Salvesta Pealkiri + Periood (sekundites) + Ühekordse salasõna tüüp + Numbrid + Otsingu filtrid + Praegune grupp + Algoritm + Debeet- / Krediitkaart + Versioon + Kasutajanimi + Lõikepuhvri viga + Mõned seadmed ei luba rakendustel kasutada lõikepuhvrit. + Lisa sõlm + Sõlme lapsed + Faili info + Laiendatud ASCII + Lõikepuhver aegus + Ei saanud puhastada lõikepuhverit + Lisa üksikasi + Salasõna märkeruut + Võtmefaili märkruut + Füüsilise võtme märkruut + Mandaatide info + Navigatsiooni päis + Hangin andmebaasi võtme… + Salasõnafraasi sõnade arv + Kasuta vaikeandmebaasina + Viimati juurde pääsetud + Ootan väljakutse taotlust… + Ootan väljakutse vastust… + Number + CVV + PIN + ID kaart + Nimi + E-mail + E-maili aadress + Wi-Fi + SSID + Tüüp + Krüptoraha rahakott + Seeme + Konto + Pank + Panga nimi + Füüsiline võti + Regulaaravaldis + Omaja + Väljastamise asukoht + Väljastamise päev + Automaatne trükkimine + Automaatse trükkimise järjestus + Avalik võti + Privaatne võti + Märgendid + Kohandatud andmed + Seadista ühekordne salasõna + Saladus + Loendur + SWIFT / BIC + IBAN + Standart + Mall + Ei saanud lugeda andmebaasi. + Sisesta nimi. + Vali võtmefail. + Salasõnad ei klapi. + Polnud võimalik luua andmebaasi fail. + URL + Ei saanud luua faili + Ühekordne salasõna \ No newline at end of file From 7d6c211de1bdd1da0921a02db4a05bf9b57127a1 Mon Sep 17 00:00:00 2001 From: Fqwe1 Date: Wed, 3 Jul 2024 13:27:20 +0000 Subject: [PATCH 016/119] Translated using Weblate (Ukrainian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/uk/ --- app/src/main/res/values-uk/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index ca26a8961..1cd9ffd51 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -700,4 +700,5 @@ Божественна Спрощенна Місячна + Перезавантажте базу даних з останніми змінами. \ No newline at end of file From 330f375a30433d9188e22d8088d1956a7725b1af Mon Sep 17 00:00:00 2001 From: Salih ARSLAN Date: Sat, 6 Jul 2024 03:06:13 +0000 Subject: [PATCH 017/119] Translated using Weblate (Turkish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/ --- app/src/main/res/values-tr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f6c7e6afa..89956c9f7 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -324,7 +324,7 @@ Parolayı sil Veri tabanına bağlantı denemesinden sonra girilen parolayı siler Alt düğüm - Parola görünürlüğünü değiştirmeyi tekrarla + ­Parola görünürlüğünü değiştirmeyi tekrarla Arka plan Güncelle Alanları kapat From 325b878f0af2740053f1baeba0eae81942130bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kemal=20Karag=C3=B6z?= Date: Mon, 8 Jul 2024 08:03:56 +0000 Subject: [PATCH 018/119] Translated using Weblate (Turkish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/ --- app/src/main/res/values-tr/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 89956c9f7..e4428d09d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -18,8 +18,8 @@ along with KeePassDX. If not, see . --> Geri bildirim - Ana sayfa - KeePass parola yöneticisinin Android uygulaması + Ana Sayfa + KeePass Parola Yöneticisi\'nin Android uygulama uyarlaması Kabul et Girdi ekle Girdi düzenle @@ -32,14 +32,14 @@ Uygulama Parantez Genişletilmiş ASCII - Niyet eylemini kabul eden bir dosya yöneticisi. ACTION_CREATE_DOCUMENT ve ACTION_OPEN_DOCUMENT veri tabanı dosyaları oluşturmak, açmak ve kaydetmek için gereklidir. + Veritabanı dosyalarını oluşturmak, açmak ve kaydetmek için ACTION_CREATE_DOCUMENT ve ACTION_OPEN_DOCUMENT intent eylemlerini kabul eden bir dosya yöneticisi gereklidir. İzin ver Pano temizlendi Pano hatası Bazı aygıtlar, uygulamaların panoyu kullanmasına izin vermez. Pano temizlenemedi Pano zaman aşımı - Panodaki depolama süresi (aygıtınız tarafından destekleniyorsa) + Panodaki depolama süresi (eğer aygıtınız tarafından destekleniyorsa) Veri tabanı Erişildi İptal From f64d085e7b9d41bff57b70215625a90e20444f48 Mon Sep 17 00:00:00 2001 From: j Date: Wed, 10 Jul 2024 00:37:04 +0000 Subject: [PATCH 019/119] Translated using Weblate (Lithuanian) Currently translated at 61.0% (402 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/lt/ --- app/src/main/res/values-lt/strings.xml | 112 ++++++++++++++++++++++--- 1 file changed, 100 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 425213c90..2836679c1 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -70,7 +70,7 @@ Apsauga Versija %1$s Įspėjimas - Atidaryti esamą duomenų bazę + Atidaryti esamą saugyklą Įveskite teigiamą sveikąjį skaičių „Ilgio“ lauke. Pašalinti Šaknis @@ -144,7 +144,7 @@ Pasirinkti rakto failą. Nepavyko užkrauti duomenų bazės. Turi būti pasirinktas bent vienas slaptažodžio generavimo tipas. - Sukurti naują duomenų bazę + Sukurti naują saugyklą Duomenų bazės spalva Nepavyko sukurti failo Nepavyko įkelti rakto. Pabandykite sumažinti KDF \"Atminties naudojimas\". @@ -187,7 +187,7 @@ Kuriama duomenų bazė… %1$s kopija Formų pildymas - Pažangus atrakinimas + Įrenginio atrakinimas Saugumo nustatymai Priklausomai nuo jūsų failų tvarkyklės, KeePassDX gali būti neleidžiama rašyti į jūsų saugyklą. Prisiminti aparatinės įrangos raktus @@ -295,7 +295,7 @@ Sujungti duomenis Iš naujo įkelti duomenis Sujungti iš … - Ištrinti išplėstinio atrakinimo raktą + Ištrinti įrenginio atrakinimo raktą Apsaugotas nuo rašymo Galima keisti Ištuštinti šiukšliadėžę @@ -321,18 +321,18 @@ Viena duomenų bazė jau atidaryta, pirmiausia ją uždarykite, kad atidaryti naują Tęsti be šifravimo rakto\? Nebegaliojantys įrašai nėra rodomi - Importuoti programėlės savybes - Eksportuoti programėlės savybes + Importuoti programėlės nustatymus + Eksportuoti programėlės nustatymus Slėpti sugedusias nuorodas paskutinių duomenų bazių sąraše - Pasirinkite failą programėlės savybių importui + Pasirinkite failą programėlės nustatymų importui Įklijuoti Kopijuoti Išspręsti problemą generuojant naujus UUID dublikatams, kad tęsti\? Paieškos režimas Įrašymo režimas - Programėlės savybės importuotos - Įvyko klaida programėlės savybių importo metu - Programėlės savybės eksportuotos + Programėlės nustatymai importuoti + Įvyko klaida programėlės nustatymų importo metu + Programėlės nustatymai eksportuoti Atšaukti Įrašyti kopiją į … Atkurti istoriją @@ -343,8 +343,96 @@ Seka, kur saugomos duomenų bazės Prisiminti raktų failų vietas Sukūrimas - Sukurkite failą programėlės savybių eksportui + Sukurkite failą programėlės nustatymų eksportui KeePassDX savybės programėlės nustatymams valdyti - Įvyko klaida programėlės savybių eksporto metu + Įvyko klaida programėlės nustatymų eksporto metu Atminties naudojimas + Šiukšliadėžės grupė + Pagrindinio rakto nustatymai + Leidimas + Įveskite slaptažodį ir spustelėkite šį mygtuką. + Ar vis tiek įkelti failą? + Failo pavadinimas + Ikonos pavadinimas + Duomenys + Duomenų suspaudimas + Šio failo įkėlimas pakeis esamą failą. + Neleidote programėlei naudoti tikslaus laikmačio, todėl funkcijos, kurioms reikia laikmačio, nebus atliekamos naudojant tikslų laiką. + Failo \"hash\" reikšmė nėra garantuota, nes \"Android\" gali keisti jo duomenis. Norėdami užtikrinti teisingą vientisumą, pakeiskite failo plėtinį į .bin. + Biometriniai duomenys ar prietaiso įgaliojimai neįrašomi. + Automatinio pildymo nustatymai + Nustatyti numatytąją automatinio pildymo paslaugą + Ekrano užraktas + Biometrinis atrakinimas + Rodyti UUID + Išvaizda + Biometriniai duomenys + Įgalinkite automatinį pildymą, kad galėtumėte greitai užpildyti formas kitose programose + Paspauskite \"Atgal\", kad užrakintumėte + Naudotojo sąsajoje rodomas užrakto mygtukas + Įrenginio atrakinimas + Informacija + Iššūkis jau prašytas + Neįmanoma apjungti su duomenų baze V1 + Duomenų bazės vieta nežinoma, duomenų bazės veiksmo atlikti negalima. + Raktas negali būti tuščias. + Sugadintas failas. + Slapta frazė + Paieška, užraktas, istorija, savybės + Keisti, atnaujinti + Lygiagretumas + Ar pašalinti šiuos duomenis? + Nerekomenduojama pridėti tuščią raktų failą. + Sujunkite duomenis, perrašykite išorinius pakeitimus išsaugodami saugyklą arba iš naujo įkelkite ją su naujausiais pakeitimais. + Perkrovus saugyklą, bus ištrinti vietoje pakeisti duomenys. + Atrakinti + Kelias + Prieš ištrinant grupes ir įrašus perkelia juos į \"šiukšliadėžės\" grupę + Perkrauti saugyklą su naujausiais pakeitimais. + Vėliau + Klausti + Apjungimas sėkmingai įvykdytas + Konfigūruoti + Reikalingas biometrinių duomenų saugumo atnaujinimas. + Jei naudojate įrenginio atrakinimo atpažinimą, vis tiek turite prisiminti pagrindinį saugyklos raktą + Įrenginio atrakinimo klaida: %1$s + Istorija + Nustatymai + Temos, spalvos, atributai + Bendri + Automatinis pildymas + \"KeePassDX\" formų automatinis pildymas + Prisijunkti naudojant \"KeePassDX + Nustato numatytąjį generuojamų slaptažodžių ilgį + Generuojamo slaptažodžio ilgis + Slaptažodžio simboliai + Nustatyti leistinus slaptažodžių generatoriaus simbolius + Saugykla ayidaryta + Priskirti pagrindinį raktą + Duomenų suspaudimas sumažina saugyklos dydį + Pašalinti nesusietus duomenis + Šifravimas, rakto išvedimo funkcija + Reikalinga %1$s tvarkyklė. + Klaviatūra, automatinis pildymas, iškarpinė + Metaduomenys, šiukšliadėžė, šablonai, istorija + Didesnis šifravimo transformacijų kiekis užtikrina didesnę apsaugą nuo \"brutalios jėgos\" atakų, tačiau gali labai sulėtinti įkėlimą ir išsaugojimą. + Lygiagretumo laipsnis (t. y. gijų skaičius), kurį naudoja rakto išvedimo funkcija. + \"KeePass\" saugykla turėtų saugoti tik nedidelius pagalbinius failus (pvz., PGP raktų failus). +\n +\nJūsų saugykla gali būti labai didelė ir dėl to gali sumažėti jos našumas. + Raktų failo turinys niekada neturėtų būti keičiamas, o geriausiu atveju jame turėtų būti atsitiktinai sugeneruoti duomenys. + Pašalinus nesusietus duomenis gali sumažėti saugyklos dydis, tačiau taip pat gali būti pašalinti \"KeePass\" papildiniams naudojami duomenys. + Saugyklos faile esanti informacija buvo pakeista už programos ribų. + Transformacijų kiekis + Slaptažodžių spalvinimas + Slaptažodžio simbolių spalvinimas pagal tipą + Rodyti OTP Token + Rodo UUID, susietą su įrašu arba grupe. + Įrenginyje įdiegta \"Android\" %1$s versija, bet reikia %2$s arba naujesnės versijos. + Užrakinti saugyklą po kelių sekundžių nuo ekranas išjungimo + Leidžia nuskaityti biometrinius duomenis tam, kad atverti saugyklą + Šiukšliadėžės naudojimas + Įrenginio atrakinimo atpažinimas + Rodyti užrakto mygtuką + Turinys \ No newline at end of file From 4345e75b20efbba86a2bb8031b22911214de69be Mon Sep 17 00:00:00 2001 From: Renko Date: Tue, 9 Jul 2024 13:54:11 +0000 Subject: [PATCH 020/119] Translated using Weblate (Romanian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ro/ --- app/src/main/res/values-ro/strings.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 412cc0404..cf3b2f53a 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -391,7 +391,7 @@ îi încurajați pe dezvoltatori să creeze noi caracteristici și să rezolve problemele în conformitate cu observațiile dvs. Mulțumesc mult pentru contribuție. Muncim din greu pentru a lansa rapid această caracteristică. - Nu uitați să mențineți aplicația la zi instalând noi versiuni. + Nu uitați să vă mențineți aplicația la zi instalând noi actualizări. Descărcați Contribuie Descărcați %1$s @@ -687,4 +687,13 @@ Urmează sistemul Luminos Întunecat + Pădure + Divin + Simplu + Lună + Soare + Răspunde + Kunzită + Reîncarcă baza de date cu noile schimbări. + Clasic \ No newline at end of file From ac65cadb1b7fa086f31624312133036ccf9369b8 Mon Sep 17 00:00:00 2001 From: searinminecraft <114207889+searinminecraft@users.noreply.github.com> Date: Fri, 12 Jul 2024 06:01:10 +0000 Subject: [PATCH 021/119] Translated using Weblate (Filipino) Currently translated at 47.0% (310 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fil/ --- app/src/main/res/values-fil/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 84be809f5..3b0c3d3d2 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -307,4 +307,8 @@ Depende sa iyong file manager, hindi maaring pinapayagan ang KeePassDX na mag-write sa iyong storage. Proteksyon Tandaan ang mga lokasyon ng database + Mga property ng KeePassDX para ipamahala ang mga setting ng app + Na-import ang mga setting ng app + Error habang nagi-import ng mga setting ng app + Na-export ang mga setting ng app \ No newline at end of file From a27f1181eaff82fc195c500f612ea458f8e90703 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sun, 14 Jul 2024 12:01:05 +0000 Subject: [PATCH 022/119] Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_PT/ --- app/src/main/res/values-pt-rPT/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 68fbfefc3..446b6d2b1 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -700,4 +700,5 @@ Lua Sol Claro + Recarregar a base de dados com as alterações mais recentes. \ No newline at end of file From 9a9410de2bedfb8b0f7a4de55a344b61d0b01b86 Mon Sep 17 00:00:00 2001 From: The One Date: Sun, 28 Jul 2024 20:31:25 +0000 Subject: [PATCH 023/119] Translated using Weblate (Swedish) Currently translated at 63.2% (417 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sv/ --- app/src/main/res/values-sv/strings.xml | 32 +++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 2dfd03c0b..8410c650b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -43,9 +43,10 @@ Dekrypterar databasinnehåll… Använd som standarddatabas Siffror - KeePassDX © %1$d Kunzisoft kommer helt utan garantier. Detta är fri programvara och du är välkommen att distribuera den utifrån villkoren i GPL version 3 eller senare. + KeePassDX © %1$d Kunzisoft är öppen källkod och utan reklam. +\nDen tillhandahålls i befintligt skick, under GPLv3-licens, utan någon garanti. Öppna befintlig databas - Senast använd + Åtkomst Avbryt Anteckningar Bekräfta lösenord @@ -70,7 +71,7 @@ Lösenorden matchar inte. \"Transformationsrundor\" är för stort. Sätter värdet till 2147483648. Varje sträng måste ha ett fältnamn. - Ange ett positivt heltal i fältet för längd. + Ange ett positivt heltal i fältet \"Längd\". Fältnamn Fältvärde Filhanterare @@ -475,4 +476,29 @@ Antal ord i Lösenordsfras Offentlig nyckel Privat nyckel + Det går inte att hämta databas-URI. + Det går inte att bygga om listan på rätt sätt. + Frö + Den befintliga OTP-typen känns inte igen av det här formuläret, dess validering kanske inte längre genererar token korrekt. + Hållare + Detta ord är reserverat och kan inte användas. + Den här texten stämmer inte överens med det begärda objektet. + Rubrik för navigering + Navigeringspanelen är öppen + Stäng navigeringspanelen + Anpassade data + Förgrundsfärg för inmatning + Förgrundsfärg för inmatning + Väntar på utmaningsförfrågan… + Väntar på utmaningssvaret… + Ärva + Sekvens för automatisk typ + Reguljärt uttryck + Plats för utfärdande + Bevis + Säker anteckning + XML-filen är felaktig. + Det är inte tillåtet att spara ett nytt objekt i en skrivskyddad databas + Fältnamnet finns redan. + Auto-typ \ No newline at end of file From 692e15511731d52ae3f453b05db85fa48cddd8a7 Mon Sep 17 00:00:00 2001 From: Patricio Carrau Date: Mon, 29 Jul 2024 21:23:01 +0000 Subject: [PATCH 024/119] Translated using Weblate (French) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a77d536ec..125da7379 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -639,6 +639,7 @@ Cette fonction permet de stocker des données d\'identification chiffrées dans le KeyStore sécurisé de votre appareil. \n \nSelon l\'implémentation de l\'API native du système d\'exploitation, il se peut qu\'elle ne soit pas entièrement fonctionnelle. +\n \nVérifiez la compatibilité et la sécurité du KeyStore auprès du fabricant de votre appareil et du créateur de la ROM que vous utilisez. Nombre de mots Écran de recherche From 8d88c949564326ba425344da3627ed825ee3a33c Mon Sep 17 00:00:00 2001 From: Hierax Swiftwing Date: Tue, 30 Jul 2024 02:03:40 +0200 Subject: [PATCH 025/119] Added translation using Weblate (Serbian) --- app/src/main/res/values-sr/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-sr/strings.xml diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-sr/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From cef9f6ae3b6a52b7ac317e2a2c05326693934ba2 Mon Sep 17 00:00:00 2001 From: Thom Date: Tue, 30 Jul 2024 10:27:47 +0000 Subject: [PATCH 026/119] Translated using Weblate (Danish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/ --- app/src/main/res/values-da/strings.xml | 28 ++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 6865986bb..22f5e8a9e 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -441,7 +441,7 @@ Blokeringsliste der forhindrer automatisk udfyldning af apps Blokeringsliste for applikation Skift automatisk tilbage til det forrige tastatur efter udførelse af \"Automatisk tastehandling\" - Automatisk tastehandling + Skift tilbage Skift automatisk tilbage til det forrige tastatur på databasens legitimationsskærm Skærm til databaselegitimationsoplysninger Skift tastatur @@ -497,12 +497,12 @@ KiB B Annulleret! - Avanceret database-oplåsning + Database-oplåsning Forslag til autofyld tilføjet. Vælg post Tilbage til forrige tastatur Brugerdefinerede felter - Slet alle krypteringsnøgler relateret til avanceret oplåsningsgenkendelse\? + Seletealle krypteringsnøgler relateret til enhedsoplåsningsgenkendelse? Tryk for at slette enhedens oplåsningsnøgler Indhold Indtast adgangskoden, og klik derefter på denne knap. @@ -591,7 +591,7 @@ Tilladelse Skabelongruppe Manuelt valg - Hold skærmen tændt, når du ser på posten + Hold skærmen tændt, når du læser eller redigere et indlæg Hold skærmen tændt Søgeskærm Skift automatisk tilbage til det tidligere tastatur på søgeskærmen @@ -645,8 +645,8 @@ Brug dynamiske skabeloner til at udfylde felterne i en post Denne funktion gemmer krypterede legitimationsdata i den sikre KeyStore på din enhed. \n -\nAfhængigt af operativsystemets indbyggede API-implementering er den muligvis ikke fuldt funktionel. -\nKontroller KeyStore\'s kompatibilitet og sikkerhed med producenten af din enhed og skaberen af den ROM, du bruger. +\nAfhængigt af operativsystemets indbyggede API-implementering er funktionen muligvis ikke fuldt funktionsdygtig. +\nKontroller kompatibiliteten og sikkerheden af KeyStore med producenten af din enhed og skaberen af den ROM, du bruger. Entropi: %1$s bit Overvej tegn <strong>Der hentes ingen brugerdata</strong>, denne applikation opretter ikke forbindelse til nogen server, kører kun lokalt og respekterer fuldt ud brugernes privatliv. @@ -685,4 +685,20 @@ Søg, lås, historik, egenskaber Senere Temaer, farver, attributter + Skov + Guddommelig + Klassisk + Lys + Mørk + Bekræft ændring + Genindlæs databasen med de seneste ændringer. + Husk at validere dine indtastede data og sikre, at din database er gemt. +\n +\nHvis en automatisk lås aktiveres uden, at ændringerne er blevet gemt, kan det resultere i tab af data. + Simpel + Måne + Sol + Besvar + Kunzite + Følg systemets tilstand \ No newline at end of file From 029485bace3b6d3d3711c3cef9426ac98364022b Mon Sep 17 00:00:00 2001 From: Hierax Swiftwing Date: Tue, 30 Jul 2024 12:57:32 +0000 Subject: [PATCH 027/119] Translated using Weblate (Serbian) Currently translated at 8.6% (57 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sr/ --- app/src/main/res/values-sr/strings.xml | 67 +++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index a6b3daec9..d04bacd9c 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1,2 +1,67 @@ - \ No newline at end of file + + Контакт + Повратне информације + Управљач лозинки KeePass за Андроид + Нов унос + Уређивање уноса + Нова скупина + Главни кључ + Безбједност + Позадина + Међуспремник испражњен + Неки уређаји не допуштају апликацијама кориштење међуспремника. + Није могуће испразнити међуспремник + Информације о датотеци + Икона уноса + Боја базе података + Дужина лозинке + Знаменке + Приступљено + Дебитна/кредитна картица + Име + Наслов + Бројач + Знаменке + Алгоритам + Број + Врста + Лозинка + Власник + Мјесто издавања + Корисничко име + Име банке + Дужина + Дужина + Лозинка + Лозинка + О апликацији + Никада + Брза претрага + Заштита + Размак + Филтар + Упозорење + Касније + Опште + Међуспремник + Садржај + Назив датотеке + Путања + Изглед + Ручни одабир + KiB + Истекли уноси нису приказани + Информације + Почетна страна + Апликација + Банка + + Погрешан алгоритам. + Изглед + Сучеље + GiB + MiB + B + Информације о једнократној лозинци + \ No newline at end of file From 8239275770e7103df3f74989a269e4678b56a655 Mon Sep 17 00:00:00 2001 From: Hierax Swiftwing Date: Wed, 31 Jul 2024 00:42:54 +0000 Subject: [PATCH 028/119] Translated using Weblate (Serbian) Currently translated at 9.1% (60 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sr/ --- app/src/main/res/values-sr/strings.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index d04bacd9c..1ca737bdf 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -56,7 +56,7 @@ Почетна страна Апликација Банка - + Погрешан алгоритам. Изглед Сучеље @@ -64,4 +64,7 @@ MiB B Информације о једнократној лозинци + Истиче + Јавни кључ + Чланство \ No newline at end of file From ee284abf8d28ba1066b242e5a3322912d15a7249 Mon Sep 17 00:00:00 2001 From: Alex Bruinsma Date: Tue, 6 Aug 2024 15:37:16 +0000 Subject: [PATCH 029/119] Translated using Weblate (Dutch) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nl/ --- app/src/main/res/values-nl/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e8b1ad35e..a07884f82 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -19,9 +19,9 @@ Dutch translation by Erik Devriendt, corrected by Erik Jan Meijer --> - Opmerkingen + Feedback Startpagina - Android-implementatie van KeePass-wachtwoordbeheer + Android-implementatie van KeePass-wachtwoordmanager Accepteren Item toevoegen Groep toevoegen @@ -431,7 +431,7 @@ Weggooien Wijzigingen weggooien\? Valideren - Donatie + Bijdrage Contact Start de app met het formulier opnieuw op om de blokkering te activeren. Blokkering van automatisch invullen From 907accbcc9724d6441fea29884c9c3ef6facd0f7 Mon Sep 17 00:00:00 2001 From: Keterion Date: Sun, 11 Aug 2024 14:52:18 +0000 Subject: [PATCH 030/119] Translated using Weblate (English) Currently translated at 99.8% (658 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/en/ --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73da0df2a..dc5ff0194 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -206,7 +206,7 @@ Unable to get the response from the challenge. Cancelled by user. Driver for %1$s is required. - Unable to merge from a database V1. + Unable to merge with a kdb database file Database location is unknown, database action cannot be performed. Hardware key is not supported. "Key cannot be empty." From a0fd0a71a2a2d622121bed9ee87889da23737f33 Mon Sep 17 00:00:00 2001 From: Keterion Date: Sun, 11 Aug 2024 14:52:18 +0000 Subject: [PATCH 031/119] Translated using Weblate (Catalan) Currently translated at 96.0% (633 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ca/ --- app/src/main/res/values-ca/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index cfc3a6ee6..9509a94a5 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -664,4 +664,4 @@ Puja %1$s S\'està finalitzant… Entropia: %1$s bit - + \ No newline at end of file From 3b600683692d557fdbaee4830962687362de2a22 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Sun, 11 Aug 2024 15:03:22 +0000 Subject: [PATCH 032/119] Translated using Weblate (German) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/ --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 407babb6e..d2f77c666 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -664,7 +664,7 @@ Challenge-Anfrage abwarten … Vom Benutzer abgebrochen. Treiber für %1$s ist erforderlich. - Die Zusammenführung aus einer Datenbank V1 ist nicht möglich. + Das Zusammenführen mit einer kdb-Datenbankdatei ist nicht möglich. Der Speicherort der Datenbank ist unbekannt, Datenbankaktion kann nicht ausgeführt werden. Der Hardwareschlüssel wird nicht unterstützt. Der Schlüssel darf nicht leer sein. From 76acec93fd289bfd3152f9369c00d7378b7b12bc Mon Sep 17 00:00:00 2001 From: Keterion Date: Sun, 11 Aug 2024 14:59:45 +0000 Subject: [PATCH 033/119] Translated using Weblate (German) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/ --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d2f77c666..ccf6879a6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -250,7 +250,7 @@ Wählen, wie Einträge und Gruppen sortiert werden. Mitmachen Mithelfen, um Stabilität und Sicherheit zu verbessern sowie weitere Funktionen zu ermöglichen. - Anders als viele Passwortmanager ist dieser <strong>werbefrei</strong>, <strong>quelloffen</strong>, <strong>freie Copyleft-Software</strong> und keine persönlichen Daten werden auf Servern gesammelt, egal welche Version du verwendest. + Anders als viele Passwortmanager ist dieser werbefrei, quelloffen, freie Copyleft-Software und keine persönlichen Daten werden auf Servern gesammelt, egal welche Version man verwendet. Mit dem Kauf der Pro-Version erhältst du Zugriff auf diesen <strong>visuellen Stil</strong> und unterstützt insbesondere <strong>die Umsetzung gemeinschaftlicher Projekte.</strong> Dieser <strong>visuelle Stil</strong> ist dank deiner Großzügigkeit verfügbar. Um unsere Freiheit zu erhalten und stets aktiv zu bleiben, zählen wir auf deinen <strong>Beitrag.</strong> From 3b0655354d72d9c6200c2d5c253bb1e0c5eb6b8b Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sun, 11 Aug 2024 15:11:52 +0000 Subject: [PATCH 034/119] Translated using Weblate (Spanish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/ --- app/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 53d6cd44d..b94a5973d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -651,7 +651,7 @@ Modo captura de pantalla La llave física no está soportada. <strong>No se recuperan datos del usuario</strong>, esta aplicación no se conecta a ningún servidor, funciona solo localmente y respeta completamente la privacidad del usuario. - Imposible fusionar desde una base de datos V1. + Imposible fusionar con un archivo de la base de datos kdb Cancelado por el usuario. Imposible obtener la respuesta del desafío. Autocompletar From 66ef6fd9d89d9fb833178354dc4441dc0d7c8e3d Mon Sep 17 00:00:00 2001 From: Alex Bruinsma Date: Sun, 11 Aug 2024 15:09:39 +0000 Subject: [PATCH 035/119] Translated using Weblate (Dutch) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nl/ --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index a07884f82..03beff885 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -660,7 +660,7 @@ Toestaan dat andere apps schermopnames maken van deze app Schermopname-modus Auto-Type - Samenvoegen vanuit database V1 niet mogelijk. + Het is niet mogelijk je database samen te voegen met een kdb database Kies een fysieke sleutel. Houdt de gebruikte fysieke sleutels bij <strong>Er worden geen gebruikersgegevens opgehaald</strong>, deze applicatie maakt geen verbinding met een server, werkt alleen lokaal en respecteert volledig de privacy van gebruikers. From 795cd099f4a05d316ed5f7ecd6820fd6254c8a95 Mon Sep 17 00:00:00 2001 From: Matthaiks Date: Sun, 11 Aug 2024 14:57:31 +0000 Subject: [PATCH 036/119] Translated using Weblate (Polish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/ --- app/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 23733e20c..59aee6bc9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -650,7 +650,7 @@ Wyzwanie już zażądane Odpowiedź już udzielona. Anulowano przez użytkownika. - Nie można scalić z bazą danych V1. + Nie można scalić z plikiem bazy danych KDB Lokalizacja bazy danych jest nieznana, nie można wykonać działania bazy danych. Klucz sprzętowy nie jest obsługiwany. Klucz nie może być pusty. From d874125dc1887db46a84bc53b9375c0a9b31d333 Mon Sep 17 00:00:00 2001 From: Wellington Terumi Uemura Date: Mon, 12 Aug 2024 08:51:18 +0000 Subject: [PATCH 037/119] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 84a8c541a..c0736f584 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -648,7 +648,7 @@ Aguardando a resposta do desafio… Cancelado pelo usuário. A chave física não é suportada. - Não é possível mesclar a partir de um banco de dados V1. + Não é possível mesclar a partir de um arquivo de banco de dados kbd Localização do banco de dados desconhecida, a ação do banco de dados não pode ser executada. A chave não pode estar vazia. <strong>Nenhum dado do usuário é coletado</strong>, este aplicativo não se conecta a nenhum servidor, funciona apenas localmente e respeita totalmente a privacidade dos usuários. From c95543b8b01322e2ca41563b0b815526b5fbb1af Mon Sep 17 00:00:00 2001 From: solokot Date: Sun, 11 Aug 2024 15:03:10 +0000 Subject: [PATCH 038/119] Translated using Weblate (Russian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1104fde8a..940067962 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -652,7 +652,7 @@ Ответ уже предоставлен. Вызов уже запрошен Невозможно получить ответ на вызов. - Невозможно выполнить объединение из базы V1. + Невозможно выполнить объединение с базой паролей в формате kdb. Аппаратный ключ не поддерживается. Ключ не может быть пустым. Файл повреждён. From 859882d24fafac52b66378c2404f0d8f00b5175e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Mon, 12 Aug 2024 08:05:34 +0000 Subject: [PATCH 039/119] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 94408a0e8..dbb20c8a6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -655,7 +655,7 @@ 已提供响应。 无法从挑战获取响应。 被用户取消。 - 无法从 v1 版数据库进行合并。 + 无法与 kdb 数据库文件合并 数据库位置未知,无法进行数据库操作。 不支持的硬件密钥。 %1$s 的驱动是必需的。 From 1844a269cb1120d88b0479d7e3ffd74c736d6b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Sun, 11 Aug 2024 15:08:22 +0000 Subject: [PATCH 040/119] Translated using Weblate (Turkish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/ --- app/src/main/res/values-tr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index e4428d09d..04587d158 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -642,7 +642,7 @@ <strong>Hiçbir kullanıcı verisi alınmaz</strong>, bu uygulama herhangi bir sunucuya bağlanmaz, yalnızca yerel olarak çalışır ve kullanıcıların gizliliğine tamamen saygı duyar. Anahtar boş olamaz. Donanım anahtarlarını hatırla - V1 veri tabanından birleştirme yapılamıyor. + kdb veri tabanı dosyasıyla birleştirme yapılamıyor Veri tabanı konumu bilinmiyor, veri tabanı eylemi gerçekleştirilemiyor. Donanım anahtarı desteklenmiyor. Bozuk dosya. From e333bd08a449389e1c5dbc0cb93e43d265952f0c Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Sun, 11 Aug 2024 19:46:07 +0000 Subject: [PATCH 041/119] Translated using Weblate (Bulgarian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/bg/ --- app/src/main/res/values-bg/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index a6af863e2..0ddb8c679 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -499,7 +499,7 @@ Заключване на екрана Премахване на несвързани данни Добавяне на файла въпреки това? - Обединяване от хранилище V1 е невъзможно. + Не е възможно обединяване с хранилище във формат KBD Количество памет, използвана от функцията за извличане на ключове. Има отворено хранилище, затворете го, за да отворите друго При добавяне на този файл ще бъде заменен вече съществуващ. From fb3f057adf94a351d7ad8ba1b1cc891562446056 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sun, 11 Aug 2024 22:28:37 +0000 Subject: [PATCH 042/119] Translated using Weblate (Albanian) Currently translated at 54.9% (362 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sq/ --- app/src/main/res/values-sq/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 3784a7e71..676cf5322 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -174,7 +174,7 @@ Ndodhi një gabim teksa hiqeshin të dhëna kartele. Ndodhi një gabim teksa kryhej një veprim te baza e të dhënave. Anuluar nga përdoruesi. - S’arrihet të përzihet që prej një baze të dhënash V1. + S’arrihet të përzihet me një kartelë baze të dhënash kdb Emër fushe Vlerë fushe Kartelë e dëmtuar. From c52957ccfe8da86dfb7ed6a165cf36f1cd8941d5 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Tue, 13 Aug 2024 20:36:55 +0000 Subject: [PATCH 043/119] Translated using Weblate (Czech) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/cs/ --- app/src/main/res/values-cs/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 288e72d0a..49f859ffa 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -654,7 +654,7 @@ Odezvu nelze z výzvy obdržet. Zrušeno uživatelem. Ovladač pro %1$s je nutný. - Spojení z databáze V1 nelze provést. + Nepodařilo se sloučit s databázovým souborem kdb Hardwarový klíč není podporován. Klíč nemůže být prázdný. Režim screenshotu From c0240b047beb287e11e257cc2a617b3655d84f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=A3=CE=A4=CE=91=CE=A5=CE=A1=CE=9F=CE=A3=20=CE=94=CE=91?= =?UTF-8?q?=CE=9B=CE=99=CE=91=CE=9A=CE=9F=CE=A0=CE=9F=CE=A5=CE=9B=CE=9F?= =?UTF-8?q?=CE=A3?= Date: Tue, 13 Aug 2024 10:27:45 +0000 Subject: [PATCH 044/119] Translated using Weblate (Greek) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/el/ --- app/src/main/res/values-el/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b50a8a961..fc992551a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -662,7 +662,7 @@ Η πρόκληση έχει ήδη ζητηθεί Η απάντηση έχει ήδη δοθεί. Η θέση της βάσης δεδομένων είναι άγνωστη, η ενέργεια της βάσης δεδομένων δεν μπορεί να εκτελεστεί. - Δεν είναι δυνατή η συγχώνευση από μια βάση δεδομένων V1. + Δεν είναι δυνατή η συγχώνευση με μια βάση δεδομένων kdb Το κλειδί δεν μπορεί να είναι κενό. Κατεστραμμένο αρχείο. <strong>Δεν ανακτώνται δεδομένα χρήστη</strong>, αυτή η εφαρμογή δεν συνδέεται με κανένα διακομιστή, λειτουργεί μόνο τοπικά και σέβεται πλήρως το απόρρητο των χρηστών. From 8c3267b345b037daacaa8491e93d2078b5453dcf Mon Sep 17 00:00:00 2001 From: jonnysemon Date: Tue, 13 Aug 2024 18:24:42 +0000 Subject: [PATCH 045/119] Translated using Weblate (Arabic) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/ --- app/src/main/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index cf2fc357d..6c81bb726 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -620,7 +620,7 @@ تقدم الرد بالفعل. غير قادر على الحصول على رد من التحدي. مطلوب تعريف لـ%1$s. - تعذر الدمج من قاعدة بيانات V1. + غير قادر على الدمج مع ملف قاعدة بيانات kdb موقع قاعدة البيانات غير معروف، لا يمكن تنفيذ إجراء قاعدة البيانات. القياس الحيوي، بيانات اعتماد الجهاز البيانات الوصفية، سلة المحذوفات، القوالب، التاريخ From 4a4c7b8b6b5f7d3be09fee4588ba0981cbdf6bef Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Tue, 13 Aug 2024 10:08:05 +0000 Subject: [PATCH 046/119] Translated using Weblate (Croatian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hr/ --- app/src/main/res/values-hr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index f0b24c76a..159e4b821 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -640,7 +640,7 @@ VELIKA SLOVA Hardverski ključ Odaberi hardverski ključ. - Spajanje iz baze podataka V1 nije moguće. + Spajanje s kdb datotekom baze podataka nije moguće Mjesto baze podataka nije poznato, radnja baze podataka se ne može izvršiti. Korisnik je prekinuo radnju. Potreban je pogon za %1$s. From 99600ad8d81911c63bdae5b59dee3dcc2d576e72 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 14 Aug 2024 10:31:13 +0000 Subject: [PATCH 047/119] Translated using Weblate (Ukrainian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/uk/ --- app/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 1cd9ffd51..f4f176ee6 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -649,7 +649,7 @@ Хибний XML. Відповідь уже надана. Вимагається драйвер для %1$s. - Не вдалося об\'єднати з базою даних V1. + Не вдалося об\'єднати з файлом бази даних kdb Пам\'ятати апаратні ключі Пам\'ятати використовувані апаратні ключі Режим знімка екрана From d7c77333157d89db51d779345eb2b9f7c6cd214c Mon Sep 17 00:00:00 2001 From: Renko Date: Wed, 14 Aug 2024 20:16:15 +0000 Subject: [PATCH 048/119] Translated using Weblate (Romanian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ro/ --- app/src/main/res/values-ro/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index cf3b2f53a..ee146da01 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -528,7 +528,7 @@ Nu s-a reușit să obțină răspunsul la provocare. Anulat de utilizator. Driver-ul pentru %1$s este necesară. - Nu s-a putut fuziona de la o bază de date V1. + Nu s-a putut fuziona cu o bază de date de format kdb Locația bazei de date este necunoscută, acțiunea bazei de date nu poate fi efectuată. Mod de înregistrare Reține cheile hardware From 75b800054fea6263cda90ac546dece6a2f137e0b Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Thu, 15 Aug 2024 12:59:53 +0000 Subject: [PATCH 049/119] Translated using Weblate (Spanish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/ --- app/src/main/res/values-es/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b94a5973d..afcba5c08 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -651,7 +651,7 @@ Modo captura de pantalla La llave física no está soportada. <strong>No se recuperan datos del usuario</strong>, esta aplicación no se conecta a ningún servidor, funciona solo localmente y respeta completamente la privacidad del usuario. - Imposible fusionar con un archivo de la base de datos kdb + Imposible fusionar desde una base de datos V1. Cancelado por el usuario. Imposible obtener la respuesta del desafío. Autocompletar @@ -661,7 +661,7 @@ Desafío ya solicitado Respuesta ya recibida. Se necesita un controlador para %1$s. - La ubicación de la base de datos es desconocida, la acción de la base de datos no se puede realizar. + Se desconoce la ubicación de la base de datos, no se puede realizar la acción de la base de datos. La clave no puede estar vacía. Archivo dañado. Recordar llaves físicas From 2f012d8cf24ad4e02ecafc33a15cd454b6bed404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8D=85=E7=AB=A5=E4=B9=B1=EF=BC=88=E3=81=97=E3=81=A9?= =?UTF-8?q?=E3=82=89=E3=82=93=EF=BC=89?= Date: Wed, 21 Aug 2024 10:53:45 +0000 Subject: [PATCH 050/119] Translated using Weblate (Japanese) Currently translated at 98.0% (646 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ja/ --- app/src/main/res/values-ja/strings.xml | 109 +++++++++++++++++-------- 1 file changed, 74 insertions(+), 35 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ee58d44f3..3e58c9bbc 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -167,7 +167,7 @@ 設定 アプリの設定 フォームの入力 - 高度なロック解除 + デバイスのロック解除 データベースの設定 セキュリティの設定 マスターキーの設定 @@ -218,7 +218,7 @@ データベースへの壊れたリンクを非表示にする 最近使ったデータベースの一覧で、壊れたリンクを非表示にします ルート - すべてのデータで使用するデータベース暗号化アルゴリズムです。 + すべてのデータに使用されるデータベース暗号化アルゴリズム 暗号化アルゴリズム用の鍵を生成するために、マスターキーはランダムなソルト付き鍵導出関数を使用して変換されます。 変換ラウンド 変換ラウンドを増やすことでブルートフォース攻撃に対する保護が強化されますが、読み込みと保存がとても遅くなる可能性があります。 @@ -295,14 +295,14 @@ ユーザーがルート画面上で戻るボタンをタップしたとき、データベースをロックします ロックボタンを表示 ユーザー インターフェースにロックボタンを表示します - 高度なロック解除 - 高度なロック解除を使用して、データベースをより簡単に開きます + デバイスのロック解除 + デバイスのロック解除を使用してデータベースをより簡単に開きます 生体認証によるロック解除 生体情報をスキャンしてデータベースを開くことができるようにします プロンプトを自動で開く - データベースに設定されている場合、高度なロック解除を自動的に要求します + データベースがデバイスのロックを使用するように設定されている場合は、デバイスのロック解除を自動的に要求します 暗号鍵を削除 - 高度なロック解除に関するすべての暗号鍵を削除します + デバイスのロック解除認識に関連するすべての暗号化キーを削除します この機能を起動できませんでした。 デバイスは Android %1$s を実行していますが、%2$s 以降が必要です。 対応するハードウェアが見つかりませんでした。 @@ -380,7 +380,7 @@ キーボードの切り替え データベース認証情報の画面 データベース認証情報の画面で、切り替え前のキーボードへ自動的に戻します - 自動キーアクション + スイッチバック [自動キーアクション] の実行後、切り替え前のキーボードへ自動的に戻します データベースをロック データベースのロック後、切り替え前のキーボードへ自動的に戻します @@ -479,33 +479,33 @@ 保存モード 検索モード フィールド名はすでに存在します。 - 高度なロック解除用の鍵を削除 - 高度なロック解除を使って認証できませんでした + デバイスのロック解除キーを削除する + デバイスのロック解除を認識できませんでした エンター バックスペース 前のキーボードに戻る カスタム フィールド - 高度なロック解除に関する暗号鍵をすべて削除しますか? + デバイスのロック解除認識に関連するすべての暗号化キーを削除しますか? デバイス認証情報を使用してデータベースを開くことができるようにします デバイス認証情報によるロック解除 デバイス認証情報 パスワードを入力し、このボタンをタップします。 - 高度なロック解除プロンプトを初期化できません。 - 高度なロック解除のエラー:%1$s - 高度なロック解除用の鍵が読み取れません。削除してロック解除の手順をやり直してください。 - 高度なロック解除を使ってデータベース認証情報を取り出します - 高度なロック解除を使ってデータベースを開く - 高度なロック解除を使用する場合も、主たる認証情報は記憶する必要があります。 - 高度なロック解除の認証 + デバイスのロック解除プロンプトを初期化できません。 + デバイスのロック解除エラー: %1$s + デバイスのロック解除キーを読み取ることができません。削除して、ロック解除認識手順を繰り返してください。 + デバイスのロック解除データを使用してデータベースの資格情報を抽出する + デバイスのロック解除認識 + デバイスのロック解除認識を使用する場合でも、Vault のメイン資格情報を覚えておく必要があります。 + デバイスのロック解除のリンク エントリーを選択 スキャンした生体情報またはデバイス認証情報にパスワードをリンクして、データベースのロックをすばやく解除します。 - データベースの高度なロック解除 - 高度なロック解除のタイムアウト - コンテンツを削除して高度なロック解除を終了するまでの期間 - 高度なロック解除の有効期限 - 高度なロック解除に使用する暗号化コンテンツを保存しません - 一時的な高度なロック解除 - タップして高度なロック解除用の鍵を削除する + デバイスデータベースのロック解除 + デバイスのロック解除タイムアウト + コンテンツを削除するまでのデバイスのロック解除使用期間 + デバイスのロック解除の有効期限 + デバイスのロック解除を使用するために暗号化されたコンテンツを保存しないでください + 一時的なデバイスロック解除 + タップしてデバイスのロック解除キーを削除します コンテンツ データベースの URI が取得できません。 自動入力候補が追加されました。 @@ -531,16 +531,16 @@ ファイルデータのアップロード中にエラーが発生しました。 アップロードしようとしているファイルが大きすぎます。 ワンタイムパスワードについて - アプリのプロパティをインポートするファイルを選択します - アプリのプロパティをインポートする + アプリ設定をインポートするファイルを選択 + アプリ設定をインポート プロパティ - アプリのプロパティのエクスポート時にエラーが発生しました - アプリのプロパティをエクスポートしました - アプリのプロパティのインポート時にエラーが発生しました - アプリのプロパティをインポートしました + アプリ設定のエクスポート中にエラーが発生しました + アプリ設定をエクスポートしました + アプリ設定のインポート中にエラーが発生しました + アプリ設定をインポートしました アプリの設定を管理する KeePassDX のプロパティ - アプリのプロパティをエクスポートするファイルを作成します - アプリのプロパティをエクスポートする + アプリ設定をエクスポートするためのファイルを作成する + アプリ設定をエクスポート データベースに対するアクションの実行中にエラーが発生しました。 この単語は予約語のため使用できません。 グループをここに移動できません。 @@ -616,10 +616,11 @@ 文字数:%1$d エントロピー:高 データベースがすでに開いているため、まず閉じてから新しく開き直してください - この機能は、暗号化された認証情報をデバイスの安全な KeyStore に保存します。 + この機能により、暗号化された認証情報がデバイスの安全なキーストアに保存されます。 \n -\nオペレーティング システムのネイティブ API の実装によっては、完全に機能しない場合があります。 -\nKeyStore の互換性と安全性については、お使いのデバイスの製造元および使用するROMの作成者にご確認ください。 +\nオペレーティング システムのネイティブ API 実装によっては、完全に機能しない場合があります。 +\n +\nデバイスの製造元と使用している ROM の作成者に、キーストアの互換性とセキュリティを確認してください。 ナビゲーション ドロワーが開いています ナビゲーション ドロワーが閉じています 自動入力シークエンス @@ -652,4 +653,42 @@ データベースの場所が不明です。データベースへの操作を実行できません。 %1$s 用のドライバーが必要です。 自動入力 + チャレンジはすでにリクエストされています + クラシック + + シンプル + 神聖な + チャレンジの応答を待っています… + チャレンジリクエストを待っています… + 回答はすでに提供されています。 + チャレンジからの応答を取得できません。 + kdb データベース ファイルとマージできません + 生体認証、デバイス認証 + メタデータ、ごみ箱、テンプレート、履歴 + 暗号化、鍵導出機能 + 変化、再生 + 後で + エントリを検証する + 最新の変更を加えてデータベースを再ロードします。 + 通知権限を使用すると、データベースのステータスを表示し、簡単にアクセスできるボタンでロックすることができます。 +\n +\nこの権限を有効にしないと、別のアプリケーションがフォアグラウンドにある場合、バックグラウンドで開いているデータベースは表示されません。 + 話す + マージが正常に完了しました + 設定する + テーマ、色、属性 + ロックを解除します + ムーン + ダーク + ライト + サン + 返事 + インフォ + 検索、ロック、履歴、プロパティ + キーボード、オートフィル、クリップボード + クリップボード通知機能を使用するには、通知許可が必要です。 + デバイスのロック解除リンク + 入力内容を検証し、データベースを保存することを忘れないでください。 +\n +\n自動ロックがアクティブ化され、変更を行ったことを忘れると、データが失われる恐れがあります。 \ No newline at end of file From 94a0e17cfca0879d6ffe0d325ee36f5008df1def Mon Sep 17 00:00:00 2001 From: Random Date: Fri, 23 Aug 2024 11:09:47 +0000 Subject: [PATCH 051/119] Translated using Weblate (Italian) Currently translated at 99.8% (658 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/ --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index aeea7e1b2..58722ba8b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -650,7 +650,7 @@ File danneggiato. Consenti alle app di terze parti di registrare o acquisire schermate dell\'app Annullato dall\'utente. - Impossibile eseguire l\'unione da un database V1. + Impossibile unire con un file database kdb Il percorso del database è sconosciuto, non è possibile eseguire l\'azione sul database. Ricorda le chiavi hardware Tiene traccia delle chiavi hardware usate From 24bc1424b9e6860f8e1c762fa144037d30c5cbd0 Mon Sep 17 00:00:00 2001 From: SC Date: Thu, 22 Aug 2024 18:14:08 +0000 Subject: [PATCH 052/119] Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_PT/ --- app/src/main/res/values-pt-rPT/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 446b6d2b1..4c438c748 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -606,7 +606,7 @@ Desafio já solicitado Resposta já fornecida. Não foi possível obter a resposta do desafio. - Não é possível fundir a partir de uma base de dados V1. + Não é possível fundir com um ficheiro de base de dados kdb A localização da base de dados é desconhecida, a ação da base de dados não pode ser executada. A chave física não é suportada. A chave não pode estar vazia. From 6c99fefad04305e19e41dd84d4a3b015da71dd34 Mon Sep 17 00:00:00 2001 From: SC Date: Thu, 22 Aug 2024 18:14:36 +0000 Subject: [PATCH 053/119] Translated using Weblate (Portuguese) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt/ --- app/src/main/res/values-pt/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 083336e20..c34c182be 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -625,7 +625,7 @@ Chave física Selecione uma chave física. XML malformado. - Não é possível fundir a partir de uma base de dados V1. + Não é possível fundir com um ficheiro de base de dados kdb Cancelado pelo utilizador. É necessário o driver para %1$s. A localização da base de dados é desconhecida, a ação da base de dados não pode ser executada. @@ -678,4 +678,5 @@ Escuro Lua Resposta + Recarregar a base de dados com as alterações mais recentes. \ No newline at end of file From 78d1e4a12aaf5a56cde9661fd5e2f61039ad4129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sun, 1 Sep 2024 15:01:24 +0000 Subject: [PATCH 054/119] Translated using Weblate (Estonian) Currently translated at 24.8% (164 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/et/ --- app/src/main/res/values-et/strings.xml | 99 +++++++++++++++++--------- 1 file changed, 66 insertions(+), 33 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 6eff61daf..000a4683f 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -20,16 +20,16 @@ Aegumine Sulud Luba - Lõikepuhver puhastatud + Lõikelaud on tühjendatud Taust Ava fail Lisa kirje Lisa grupp - Ühekordse salasõna info + Ühekordse salasõna teave Kirje ikoon Andmebaasi värv Valideeri - Loobu muudatustest? + Kas loobume muudatustest? Loobu Salasõna generaator Salasõna pikkus @@ -43,11 +43,11 @@ Kopeeri %1$s lõikepuhverisse Andmebaas Mallid - Dekrüpteerin andmebaasi sisu… + Dekrüpteerime andmebaasi sisu… Numbrid - Loobun + Katkesta Märkmed - Kinnita salasõna + Korda salasõna Loodud Aegub Aegunud @@ -61,43 +61,43 @@ Salasõna Salvesta Pealkiri - Periood (sekundites) + Kestus (sekundites) Ühekordse salasõna tüüp Numbrid - Otsingu filtrid + Otsingufiltrid Praegune grupp Algoritm Debeet- / Krediitkaart Versioon Kasutajanimi - Lõikepuhvri viga - Mõned seadmed ei luba rakendustel kasutada lõikepuhvrit. + Lõikelaua viga + Mõned seadmed ei luba rakendustel kasutada lõikelauda. Lisa sõlm - Sõlme lapsed - Faili info + Sõlme järglassõlmed + Faili teave Laiendatud ASCII - Lõikepuhver aegus - Ei saanud puhastada lõikepuhverit + Lõikelaua sisu aegus + Ei saanud tühjendada lõikelauda Lisa üksikasi Salasõna märkeruut Võtmefaili märkruut Füüsilise võtme märkruut Mandaatide info Navigatsiooni päis - Hangin andmebaasi võtme… - Salasõnafraasi sõnade arv + Laadime andmebaasi võtme… + Sõnu salafraasis Kasuta vaikeandmebaasina - Viimati juurde pääsetud - Ootan väljakutse taotlust… - Ootan väljakutse vastust… - Number + Viimati kasutatud + Ootame pretensioonipäringut… + Ootame pretensioonivastust… + Kaardinumber CVV PIN ID kaart Nimi - E-mail - E-maili aadress - Wi-Fi + E-post + E-posti aadress + WiFi SSID Tüüp Krüptoraha rahakott @@ -107,28 +107,61 @@ Panga nimi Füüsiline võti Regulaaravaldis - Omaja + Kaardiomanik Väljastamise asukoht Väljastamise päev - Automaatne trükkimine - Automaatse trükkimise järjestus + Automaatne sisestus + Automaatse sisestuse järjestus Avalik võti - Privaatne võti - Märgendid + Privaatvõti + Sildid Kohandatud andmed - Seadista ühekordne salasõna + Võta kasutusele ühekordne salasõna Saladus Loendur SWIFT / BIC IBAN - Standart + Standard Mall - Ei saanud lugeda andmebaasi. + Andmebaasi lugemine ei õnnestunud. Sisesta nimi. Vali võtmefail. Salasõnad ei klapi. - Polnud võimalik luua andmebaasi fail. + Andmebaasi faili loomine ei õnnestunud. URL - Ei saanud luua faili + Faili loomine eo õnnestunud Ühekordne salasõna + Lõikelauale kopeeritud andmete hoidmise aeg (kui sinu seade sellist võimalust toetab) + Sulge väljad + Tõstutundlik + Vali raudvaraline võti. + Pole piisavat mälu kogu sinu andmebaasi laadimiseks. + Vigane XML. + Andmebaasi laadimine ei õnnestunud. + Selline silt on juba olemas. + Turvaline märge + Liikmelisus + KeePassDX ei oska töödelda seda võrguaadressi. + Palun kontrolli, et asukoht on õige. + Kirjet ei saa siia tõsta. + Kirjet ei saa siia kopeerida. + Gruppi ei saa siia kopeerida. + Selle salasõna ja võtmefailiga ei saa andmebaasi luua. + Andmebaasi salvestamine ei õnnestunud. + Salafraas + Selline väljanimi on juba olemas. + Fail, mida sa proovid üles laadida, on liiga suur. + Faili andmete üleslaadimisel tekkis viga. + Faili andmed on juba olemas. + Faili andmete eemaldamisel tekkis viga. + Andmebaasiga toimingu tegemisel tekkis viga. + Raudvaraline võti pole toetatud. + Välja nimi + Välja väärtus + Faili ei õnnestunud leida. Proovi teda avada failibrauseriga. + Failihaldur + Loo salasõna + Kinnita salasõna + Loodud salasõna + Võti ei tohi olla tühi. \ No newline at end of file From 019ec4de9a169b8a3cec668888431f1f9a4780c9 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 6 Sep 2024 09:54:35 +0200 Subject: [PATCH 055/119] fix: Avoid DEPENDENCY_INFO_BLOCK --- app/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 224b0dc6d..561308a84 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,6 +35,13 @@ android { } } + dependenciesInfo { + // Disables dependency metadata when building APKs. + includeInApk = false + // Disables dependency metadata when building Android App Bundles. + includeInBundle = false + } + flavorDimensions "version" productFlavors { libre { From 0a7ffbcc8f1589f41be75dff59b524b734b3a769 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 6 Sep 2024 10:31:41 +0200 Subject: [PATCH 056/119] fix: Make the apk verification even clearer #1831 --- README.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 97fc4c9e8..586a1b3b0 100644 --- a/README.md +++ b/README.md @@ -60,21 +60,24 @@ Optional visual styles are accessible after a contribution (and a congratulatory [Version [differences](https://github.com/Kunzisoft/KeePassDX/wiki/FAQ#why-a-libre-and-free-version)] ## Verify the authenticity of the downloaded app from GitHub -1- Download the latest app from [GitHub releases](https://github.com/Kunzisoft/KeePassDX/releases/latest).
-2- Open the directory where you saved the downloaded file in the Terminal on Linux/MacOS.
-3- You must have `keytool` command installed.
-4- Depending on the flavor you downloaded, run: +- Download the latest app from [GitHub releases](https://github.com/Kunzisoft/KeePassDX/releases/latest).
+- Open the directory where you saved the downloaded file in the Terminal. +- Make sure that you have `keytool` installed by running: ``` -keytool -printcert -jarfile KeePassDX-*-libre.apk | grep '7D:55:B8:AF:21:03:81:AA:BF:96:0F:07:E1:7C:F7:85:7B:6D:2A:64:2C:A2:DA:6B:F0:BD:F1:B2:00:36:2F:04' -``` -Or: -``` -keytool -printcert -jarfile KeePassDX-*-free.apk | grep '7D:55:B8:AF:21:03:81:AA:BF:96:0F:07:E1:7C:F7:85:7B:6D:2A:64:2C:A2:DA:6B:F0:BD:F1:B2:00:36:2F:04' -``` -You should get this output: -``` -SHA256: 7D:55:B8:AF:21:03:81:AA:BF:96:0F:07:E1:7C:F7:85:7B:6D:2A:64:2C:A2:DA:6B:F0:BD:F1:B2:00:36:2F:04 +keytool -version ``` +- Depending on the flavor you downloaded, run: + + - For the `libre` flavor: + ```shell + (keytool -printcert -jarfile KeePassDX-*-libre.apk | grep -q '7D:55:B8:AF:21:03:81:AA:BF:96:0F:07:E1:7C:F7:85:7B:6D:2A:64:2C:A2:DA:6B:F0:BD:F1:B2:00:36:2F:04' && echo && echo && echo "The app is safe to be installed.") || (echo && echo && echo "The app is not safe to be installed.") + ``` + + - For the `free` flavor: + ```shell + (keytool -printcert -jarfile KeePassDX-*-free.apk | grep -q '7D:55:B8:AF:21:03:81:AA:BF:96:0F:07:E1:7C:F7:85:7B:6D:2A:64:2C:A2:DA:6B:F0:BD:F1:B2:00:36:2F:04' && echo && echo && echo "The app is safe to be installed.") || (echo && echo && echo "The app is not safe to be installed.") + ``` +You should get an output that tells you if the app is safe to be installed or not. ## Frequently Asked Questions Other questions? You can read the [FAQ](https://github.com/Kunzisoft/KeePassDX/wiki/FAQ) From ffcfe966d2156803014e5463372beabe3d685b27 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 6 Sep 2024 15:55:36 +0200 Subject: [PATCH 057/119] fix: Add warning for KeyFile length #1780 --- .../SetMainCredentialDialogFragment.kt | 36 +++++++++++-------- app/src/main/res/values/strings.xml | 1 + 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt index 9a28fd940..0efb572c7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt @@ -159,9 +159,7 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { keyFileSelectionView.error = null keyFileCheckBox.isChecked = true keyFileSelectionView.uri = pathUri - if (lengthFile <= 0L) { - showEmptyKeyFileConfirmationDialog() - } + showLengthKeyFileConfirmationDialog(lengthFile) } } } @@ -339,21 +337,31 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { } } - private fun showEmptyKeyFileConfirmationDialog() { + private fun showLengthKeyFileConfirmationDialog(length: Long) { activity?.let { val builder = AlertDialog.Builder(it) builder.setMessage(SpannableStringBuilder().apply { - append(getString(R.string.warning_empty_keyfile)) - append("\n\n") append(getString(R.string.warning_empty_keyfile_explanation)) - append("\n\n") - append(getString(R.string.warning_sure_add_file)) - }) - .setPositiveButton(android.R.string.ok) { _, _ -> } - .setNegativeButton(android.R.string.cancel) { _, _ -> - keyFileCheckBox.isChecked = false - keyFileSelectionView.uri = null - } + var warning = false + if (length <= 0L) { + warning = true + append("\n\n") + append(getString(R.string.warning_empty_keyfile)) + } else if (length > 10485760L) { + warning = true + append("\n\n") + append(getString(R.string.warning_large_keyfile)) + } + if (warning) { + append("\n\n") + append(getString(R.string.warning_sure_add_file)) + } + }) + .setPositiveButton(android.R.string.ok) { _, _ -> } + .setNegativeButton(android.R.string.cancel) { _, _ -> + keyFileCheckBox.isChecked = false + keyFileSelectionView.uri = null + } mEmptyKeyFileConfirmationDialog = builder.create() mEmptyKeyFileConfirmationDialog?.show() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73da0df2a..ce7563d7d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -373,6 +373,7 @@ Removing unlinked data may decrease the size of your database but may also delete data used for KeePass plugins. Remove this data anyway? It is not recommended to add an empty keyfile. + It is not recommended to add a large keyfile, this may prevent the database from opening. The content of the keyfile should never be changed, and in the best case, should contain randomly generated data. The information contained in your database file has been modified outside the app. Merge the data, overwrite the external modifications by saving the database or reload it with the latest changes. From 850c46f8813c980119e2a89a03d8ee342d0d8715 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 6 Sep 2024 17:13:24 +0200 Subject: [PATCH 058/119] feat: Generate keyfile #1290 --- .../SetMainCredentialDialogFragment.kt | 30 +++++++++++++++++++ .../res/drawable/ic_file_key_white_24dp.xml | 9 ++++++ .../layout/fragment_set_main_credential.xml | 9 ++++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 49 insertions(+) create mode 100644 app/src/main/res/drawable/ic_file_key_white_24dp.xml diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt index 0efb572c7..098441077 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt @@ -45,6 +45,11 @@ import com.kunzisoft.keepass.view.HardwareKeySelectionView import com.kunzisoft.keepass.view.KeyFileSelectionView import com.kunzisoft.keepass.view.PassKeyView import com.kunzisoft.keepass.view.applyFontVisibility +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.security.SecureRandom + class SetMainCredentialDialogFragment : DatabaseDialogFragment() { @@ -60,6 +65,7 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { private lateinit var passwordRepeatView: TextView private lateinit var keyFileCheckBox: CompoundButton + private lateinit var keyFileGenerateButton: View private lateinit var keyFileSelectionView: KeyFileSelectionView private lateinit var hardwareKeyCheckBox: CompoundButton @@ -147,12 +153,21 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { passwordRepeatView.applyFontVisibility() keyFileCheckBox = rootView.findViewById(R.id.keyfile_checkbox) + keyFileGenerateButton = rootView.findViewById(R.id.keyfile_generate) keyFileSelectionView = rootView.findViewById(R.id.keyfile_selection) hardwareKeyCheckBox = rootView.findViewById(R.id.hardware_key_checkbox) hardwareKeySelectionView = rootView.findViewById(R.id.hardware_key_selection) mExternalFileHelper = ExternalFileHelper(this) + mExternalFileHelper?.buildCreateDocument { createdFileUri -> + createdFileUri?.let { uri -> + createKeyFile(uri) + keyFileSelectionView.error = null + keyFileCheckBox.isChecked = true + keyFileSelectionView.uri = uri + } + } mExternalFileHelper?.buildOpenDocument { uri -> uri?.let { pathUri -> pathUri.getDocumentFile(requireContext())?.length()?.let { lengthFile -> @@ -163,6 +178,9 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { } } } + keyFileGenerateButton.setOnClickListener { + mExternalFileHelper?.createDocument(DEFAULT_KEYFILE_NAME) + } keyFileSelectionView.setOpenDocumentClickListener(mExternalFileHelper) hardwareKeySelectionView.selectionListener = { hardwareKey -> @@ -200,6 +218,16 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { return super.onCreateDialog(savedInstanceState) } + private fun createKeyFile(uri: Uri) { + CoroutineScope(Dispatchers.IO).launch { + activity?.contentResolver?.openOutputStream(uri)?.use { outputStream -> + val randomBytes = ByteArray(DEFAULT_KEYFILE_SIZE) + SecureRandom().nextBytes(randomBytes) + outputStream.write(randomBytes) + } + } + } + private fun approveMainCredential() { val errorPassword = verifyPassword() val errorKeyFile = verifyKeyFile() @@ -370,6 +398,8 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { companion object { private const val ALLOW_NO_MASTER_KEY_ARG = "ALLOW_NO_MASTER_KEY_ARG" + private const val DEFAULT_KEYFILE_NAME = "keyfile.bin" + private const val DEFAULT_KEYFILE_SIZE = 128 fun getInstance(allowNoMasterKey: Boolean): SetMainCredentialDialogFragment { val fragment = SetMainCredentialDialogFragment() diff --git a/app/src/main/res/drawable/ic_file_key_white_24dp.xml b/app/src/main/res/drawable/ic_file_key_white_24dp.xml new file mode 100644 index 000000000..71d66dd50 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_key_white_24dp.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_set_main_credential.xml b/app/src/main/res/layout/fragment_set_main_credential.xml index 76c65f01a..1f615c38c 100644 --- a/app/src/main/res/layout/fragment_set_main_credential.xml +++ b/app/src/main/res/layout/fragment_set_main_credential.xml @@ -121,6 +121,15 @@ android:layout_height="wrap_content" android:text="@string/entry_keyfile"/> + + Corrupted file.
File manager Generate password + Generate keyfile Confirm password Generated password Group name From 8177c9c34b0620bdb1b81fe59626f37643b12c3b Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 6 Sep 2024 18:13:12 +0200 Subject: [PATCH 059/119] fix: textColorHighlight #1711 --- app/src/main/res/values/colors.xml | 8 ++++---- app/src/main/res/values/styles.xml | 2 ++ app/src/main/res/values/styles_classic.xml | 2 ++ app/src/main/res/values/styles_divine.xml | 2 ++ app/src/main/res/values/styles_kunzite.xml | 2 ++ app/src/main/res/values/styles_moon.xml | 2 ++ app/src/main/res/values/styles_reply.xml | 2 ++ app/src/main/res/values/styles_simple.xml | 2 ++ app/src/main/res/values/styles_sun.xml | 2 ++ 9 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 15608b0a5..49bdd17de 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -216,7 +216,7 @@ #DBDDDF #D8DCDF #D3D8DC - #DEE5D8 + #D8E4E5 #404649 #72796F #F0F1EB @@ -356,7 +356,7 @@ #F1F7FD #EEF7FF #EAF5FF - #DEE5D8 + #D8E2E5 #404649 #72796F #F0F1EB @@ -426,7 +426,7 @@ #DBEEFE #D5ECFF #D2EBFF - #DEE5D8 + #D8DFE5 #404649 #72796F #F0F1EB @@ -496,7 +496,7 @@ #FFE4E5 #FBDEDF #FADBDC - #DEE5D8 + #E5DBD8 #494040 #796F6F #F0F1EB diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5c20be48b..19103591e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -59,6 +59,7 @@ @color/forest_theme_light_inverseOnSurface @color/forest_theme_light_inverseSurface @color/forest_theme_light_inversePrimary + @color/forest_theme_light_surfaceVariant true false @@ -153,6 +154,7 @@ @color/forest_theme_night_inverseOnSurface @color/forest_theme_night_inverseSurface @color/forest_theme_night_inversePrimary + @color/forest_theme_night_surfaceVariant true false diff --git a/app/src/main/res/values/styles_classic.xml b/app/src/main/res/values/styles_classic.xml index bfb67f937..c3012f20b 100644 --- a/app/src/main/res/values/styles_classic.xml +++ b/app/src/main/res/values/styles_classic.xml @@ -53,6 +53,7 @@ @color/classic_theme_light_inverseOnSurface @color/classic_theme_light_inverseSurface @color/classic_theme_light_inversePrimary + @color/classic_theme_light_surfaceVariant @color/classic_theme_light_textPrimary @color/classic_theme_light_background @@ -92,6 +93,7 @@ @color/classic_theme_night_inverseOnSurface @color/classic_theme_night_inverseSurface @color/classic_theme_night_inversePrimary + @color/classic_theme_night_surfaceVariant @color/classic_theme_night_textPrimary @color/classic_theme_night_background diff --git a/app/src/main/res/values/styles_divine.xml b/app/src/main/res/values/styles_divine.xml index ac4315637..d9b23f71d 100644 --- a/app/src/main/res/values/styles_divine.xml +++ b/app/src/main/res/values/styles_divine.xml @@ -53,6 +53,7 @@ @color/divine_theme_light_inverseOnSurface @color/divine_theme_light_inverseSurface @color/divine_theme_light_inversePrimary + @color/divine_theme_light_surfaceVariant @color/divine_theme_light_textPrimary @color/divine_theme_light_background @@ -92,6 +93,7 @@ @color/divine_theme_night_inverseOnSurface @color/divine_theme_night_inverseSurface @color/divine_theme_night_inversePrimary + @color/divine_theme_night_surfaceVariant @color/divine_theme_night_textPrimary @color/divine_theme_night_background diff --git a/app/src/main/res/values/styles_kunzite.xml b/app/src/main/res/values/styles_kunzite.xml index 96e78b9c4..ad5c25b7c 100644 --- a/app/src/main/res/values/styles_kunzite.xml +++ b/app/src/main/res/values/styles_kunzite.xml @@ -53,6 +53,7 @@ @color/purple_theme_light_inverseOnSurface @color/purple_theme_light_inverseSurface @color/purple_theme_light_inversePrimary + @color/purple_theme_light_surfaceVariant @color/purple_theme_light_textPrimary @color/purple_theme_light_background @@ -92,6 +93,7 @@ @color/purple_theme_night_inverseOnSurface @color/purple_theme_night_inverseSurface @color/purple_theme_night_inversePrimary + @color/purple_theme_night_surfaceVariant @color/purple_theme_night_textPrimary @color/purple_theme_night_background diff --git a/app/src/main/res/values/styles_moon.xml b/app/src/main/res/values/styles_moon.xml index 4f81e851d..faca6f57a 100644 --- a/app/src/main/res/values/styles_moon.xml +++ b/app/src/main/res/values/styles_moon.xml @@ -53,6 +53,7 @@ @color/moon_theme_light_inverseOnSurface @color/moon_theme_light_inverseSurface @color/moon_theme_light_inversePrimary + @color/moon_theme_light_surfaceVariant @color/moon_theme_light_textPrimary @color/moon_theme_light_background @@ -92,6 +93,7 @@ @color/moon_theme_night_inverseOnSurface @color/moon_theme_night_inverseSurface @color/moon_theme_night_inversePrimary + @color/moon_theme_night_surfaceVariant @color/moon_theme_night_textPrimary @color/moon_theme_night_background diff --git a/app/src/main/res/values/styles_reply.xml b/app/src/main/res/values/styles_reply.xml index 8efe3c0c8..71ab4a641 100644 --- a/app/src/main/res/values/styles_reply.xml +++ b/app/src/main/res/values/styles_reply.xml @@ -53,6 +53,7 @@ @color/reply_theme_light_inverseOnSurface @color/reply_theme_light_inverseSurface @color/reply_theme_light_inversePrimary + @color/reply_theme_light_surfaceVariant @color/reply_theme_light_textPrimary @color/reply_theme_light_background @@ -93,6 +94,7 @@ @color/reply_theme_night_inverseOnSurface @color/reply_theme_night_inverseSurface @color/reply_theme_night_inversePrimary + @color/reply_theme_night_surfaceVariant @color/reply_theme_night_textPrimary @color/reply_theme_night_background diff --git a/app/src/main/res/values/styles_simple.xml b/app/src/main/res/values/styles_simple.xml index 5c7a1efd6..01bebe411 100644 --- a/app/src/main/res/values/styles_simple.xml +++ b/app/src/main/res/values/styles_simple.xml @@ -53,6 +53,7 @@ @color/simple_theme_light_inverseOnSurface @color/simple_theme_light_inverseSurface @color/simple_theme_light_inversePrimary + @color/simple_theme_light_surfaceVariant @color/simple_theme_light_textPrimary @color/simple_theme_light_background @@ -92,6 +93,7 @@ @color/simple_theme_night_inverseOnSurface @color/simple_theme_night_inverseSurface @color/simple_theme_night_inversePrimary + @color/simple_theme_night_surfaceVariant @color/simple_theme_night_textPrimary @color/simple_theme_night_background diff --git a/app/src/main/res/values/styles_sun.xml b/app/src/main/res/values/styles_sun.xml index 2c3b7c8b2..e7829ebb5 100644 --- a/app/src/main/res/values/styles_sun.xml +++ b/app/src/main/res/values/styles_sun.xml @@ -53,6 +53,7 @@ @color/sun_theme_light_inverseOnSurface @color/sun_theme_light_inverseSurface @color/sun_theme_light_inversePrimary + @color/sun_theme_light_surfaceVariant @color/sun_theme_light_textPrimary @color/sun_theme_light_background @@ -92,6 +93,7 @@ @color/sun_theme_night_inverseOnSurface @color/sun_theme_night_inverseSurface @color/sun_theme_night_inversePrimary + @color/sun_theme_night_surfaceVariant @color/sun_theme_night_textPrimary @color/sun_theme_night_background From f7cccb33de66d8e84120afa98ab33d1d94d7df0a Mon Sep 17 00:00:00 2001 From: Ghost of Sparta Date: Sat, 21 Sep 2024 16:55:33 +0000 Subject: [PATCH 060/119] Translated using Weblate (Hungarian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hu/ --- app/src/main/res/values-hu/strings.xml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 8a235d528..e87516163 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -599,7 +599,7 @@ Az adatbázis újratöltése törli a helyileg módosított adatokat. Sablonok Nem kérhető le a válasz a kihívásból. - Nem lehet egyesíteni az adatbázis V1-es változatából. + Nem lehet egyesíteni az adatbázisfájllal. Entrópia: %1$s bit Keresési képernyő Nem helyezhet át ide csoportot. @@ -670,6 +670,7 @@ A funkció eltárolja a titkosított hitelesítőadatokat az eszköz biztonságos kulcstárában. \n \nAz operációs rendszer natív API megvalósításától függően lehet, hogy nem lesz teljes értékű. +\n \nEllenőrizze a kulcstár kompatibilitását és biztonságát az eszköz gyártójánál és a használt ROM készítőjénél. Megjeleníti egy bejegyzés előtér- és háttérszínét Eszközfeloldási hivatkozás @@ -688,4 +689,16 @@ Keresés, zárolás, előzmények, tulajdonságok Később Válasszon hardverkulcsot. + Válasz + Erdős + Isteni + Klasszikus + Egyszerű + Holdvilág + Napos + Kunzit + Kövesse a rendszert + Világos + Sötét + Adatbázis újratöltése a legújabb módosításokkal. \ No newline at end of file From f7f079e65320c20875c1235ab525c46c389d0b01 Mon Sep 17 00:00:00 2001 From: Francisco Serrador Date: Mon, 23 Sep 2024 22:12:14 +0000 Subject: [PATCH 061/119] Translated using Weblate (Spanish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/ --- app/src/main/res/values-es/strings.xml | 40 +++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index afcba5c08..f287d8311 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -23,7 +23,7 @@ Página de inicio Implementación para Android del gestor de contraseñas KeePass Aceptar - Añadir entrada + Añadir apunte Añadir grupo Algoritmo de cifrado Tiempo de espera superado @@ -50,7 +50,7 @@ Confirmar contraseña Creado Caduca - Archivo clave + Cerrojo Modificada Contraseña Guardar @@ -61,20 +61,20 @@ KeePassDX no puede manejar este URI. No se ha podido crear el archivo No se ha podido leer la base de datos. - Asegúrese de que la ruta es correcta. + Asegúrese que la ruta es correcta. Proporcione un nombre. - Seleccione un archivo clave. + Seleccione un cerrojo. No hay memoria para cargar toda la base de datos. Debe seleccionarse al menos un tipo de generación de contraseñas. Las contraseñas no coinciden. - Rondas de transformación demasiado altas. Establecidas a a 2147483648. - Introduzca un número entero positivo en el campo \"Longitud\". + Rondas de transformación demasiado altas. Establecidas a 2147483648. + Introduzca un número entero positivo en el campo «Longitud». Explorador de archivos Generar contraseña Confirmar contraseña Contraseña generada Nombre del grupo - Archivo clave + Cerrojo Longitud Contraseña Contraseña @@ -119,9 +119,9 @@ No se admite esta versión de la base de datos. Mayúsculas Versión %1$s - Introduzca la contraseña y/o el archivo clave para desbloquear su base de datos. + Introduzca la contraseña y/o el cerrojo para desbloquear su base de datos. \n -\nHaga una copia de seguridad de su archivo de base de datos en un lugar seguro después de cada cambio. +\nRealice un respaldo de su archivo de base de datos en un lugar seguro después de cada modificación. Pequeño Mediano @@ -140,7 +140,7 @@ Valor del campo No se ha podido encontrar el archivo. Intente volver a abrirlo en el explorador de archivos. Algoritmo incorrecto. - El archivo clave está vacío. + El cerrojo está vacío. Copia de %1$s Rellenado de formularios Protección @@ -260,7 +260,7 @@ Tema utilizado en la aplicación Seleccione un paquete de iconos Cambiar el paquete de iconos en la aplicación - Editar entrada + Editar apunte No se pudo cargar la base de datos. No se ha podido cargar la clave. Intente disminuir el uso de memoria de KDF. Mostrar nombres de usuario @@ -316,8 +316,8 @@ Añadir grupo Información del archivo Casilla de contraseña - Casilla del archivo clave - Icono de entrada + Casilla del cerrojo + Icono de apunte Generador de contraseñas Longitud de contraseña Añadir campo @@ -330,7 +330,7 @@ Fondo Actualizar Cerrar campos - No se puede crear la base de datos con esta contraseña y este archivo clave. + No se puede crear la base de datos con esta contraseña y este cerrojo. Desbloqueo de dispositivos Biometría Abrir petición automáticamente @@ -409,7 +409,7 @@ No puede copiar un grupo aquí. La compresión de datos reduce el tamaño de la base de datos Compresión de datos - No se recomienda agregar un archivo de claves vacío. + No se recomienda agregar un cerrojo vacío. ¿Eliminar estos datos de todos modos\? ¿Agregar el archivo de todos modos\? Al cargar este archivo reemplazará el existente. @@ -418,8 +418,8 @@ Ejecutando el comando… Ocultar enlaces rotos en la lista de bases de datos recientes Ocultar enlaces rotos de la base de datos - Lleva un registro de dónde se almacenan los archivos clave - Recordar ubicaciones de archivos clave + Lleva un registro de dónde se almacenan los cerrojos + Recordar ubicaciones de cerrojo Buscar dominios web con restricciones de subdominios Búsqueda de subdominio Solicite una búsqueda al abrir una base de datos @@ -466,7 +466,7 @@ El almacén de claves no está debidamente inicializado. Se requiere una actualización de la seguridad biométrica. No se ha inscrito ninguna credencial biométrica o del dispositivo. - El contenido del archivo clave nunca debe modificarse y, en el mejor de los casos, debe contener datos generados al azar. + El contenido del cerrojo nunca debe modificarse y, en el mejor de los casos, debe contener datos generados al azar. ¿Borrar permanentemente todos los nodos de la papelera de reciclaje\? Modo de registro Modo de guardado @@ -598,8 +598,8 @@ No ha permitido que la app use una alarma exacta. Como resultado, las funciones que requieren un temporizador no se harán con una hora exacta. Permiso Color de la base de datos - Color de primer plano de la entrada - Color de fondo de la entrada + Color de primer plano del apunte + Color de fondo del apunte Etiquetas La recarga de la base de datos borrará los datos modificados localmente. El hash del archivo no está garantizado porque Android puede cambiar sus datos sobre la marcha. Cambia la extensión del archivo a .bin para una correcta integridad. From e7de5ca2632214e7379f8d55dd44e1c7419d84c2 Mon Sep 17 00:00:00 2001 From: Ghost of Sparta Date: Mon, 23 Sep 2024 06:28:14 +0000 Subject: [PATCH 062/119] Translated using Weblate (Hungarian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hu/ --- app/src/main/res/values-hu/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index e87516163..d47d7e4c5 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -694,8 +694,8 @@ Isteni Klasszikus Egyszerű - Holdvilág - Napos + Éjszakai + Nappali Kunzit Kövesse a rendszert Világos From ac2e47776a3ece312eb69531f56d008b8fa9f4b0 Mon Sep 17 00:00:00 2001 From: Francisco Serrador Date: Mon, 23 Sep 2024 22:22:08 +0000 Subject: [PATCH 063/119] Translated using Weblate (Spanish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/ --- app/src/main/res/values-es/strings.xml | 112 ++++++++++++------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f287d8311..df1150c04 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -56,13 +56,13 @@ Guardar Título URL - Nombre de usuario + ID Usuario No se admite el cifrador de flujo Arcfour. - KeePassDX no puede manejar este URI. + KeePassDX no puede gestionar este URI. No se ha podido crear el archivo No se ha podido leer la base de datos. Asegúrese que la ruta es correcta. - Proporcione un nombre. + Introduzca un nombre. Seleccione un cerrojo. No hay memoria para cargar toda la base de datos. Debe seleccionarse al menos un tipo de generación de contraseñas. @@ -86,7 +86,7 @@ Cargando base de datos… Minúsculas Ocultar contraseñas - Ocultar contraseñas (***) por defecto + Oculta contraseñas (***) por defecto Acerca de Cambiar contraseña maestra Configuración @@ -109,14 +109,14 @@ Quitar Raíz Rondas de transformación - Un alto número de pasadas de cifrado proporciona protección adicional contra ataques de fuerza bruta, pero puede ralentizar mucho el cargado y el guardado. + Las rondas de cifrado adicionales proporcionan una mayor protección contra los ataques de fuerza bruta, pero pueden ralentizar mucho la carga y el guardado. Guardando base de datos… Espacio Orden natural Especial Búsqueda Subrayado - No se admite esta versión de la base de datos. + Versión de base de datos incompatible. Mayúsculas Versión %1$s Introduzca la contraseña y/o el cerrojo para desbloquear su base de datos. @@ -145,9 +145,9 @@ Rellenado de formularios Protección Protegida contra escritura - Dependiendo del administrador de archivos, puede que KeePassDX no permita escribir en su almacenamiento. + Dependiendo del administrador de archivos, KeePassDX puede no permitir escribir en tu almacenamiento. Algoritmo de cifrado de la base de datos usado para todos los datos - Para generar la clave del algoritmo de cifrado, la clave maestra se transforma mediante una función de derivación de claves con una sal aleatoria. + Para generar la clave del algoritmo de cifrado, la clave maestra se transforma mediante una función de derivación de claves con sal aleatoria. Uso de memoria Cantidad de memoria que usará la función de derivación de clave. Paralelismo @@ -161,10 +161,10 @@ Creación Modificación Acceso - Atención - No se han podido encontrar los datos de la entrada. - Evite los caracteres de la contraseña fuera del formato de codificación de texto en el archivo de la base de datos (los caracteres no reconocidos se convierten a la misma letra). - ¿Continuar sin la protección de desbloqueo de contraseña\? + Advertencia + No se han podido encontrar los datos del apunte. + Evita caracteres de contraseña fuera del formato de codificación de texto en el archivo de base de datos (los caracteres no reconocidos se convierten a la misma letra). + ¿Continuar sin protección de desbloqueo por contraseña? ¿Continuar sin clave de cifrado\? Contraseña cifrada almacenada Historial @@ -197,7 +197,7 @@ Nombre del archivo Ruta Asignar una clave maestra - Crear una nueva caja fuerte + Crear una nueva bóveda Uso de la papelera de reciclaje Mueve los grupos y las entradas al grupo \"Papelera de reciclaje\" antes de eliminarlos Tipografía del campo @@ -261,7 +261,7 @@ Seleccione un paquete de iconos Cambiar el paquete de iconos en la aplicación Editar apunte - No se pudo cargar la base de datos. + No se ha podido cargar la base de datos. No se ha podido cargar la clave. Intente disminuir el uso de memoria de KDF. Mostrar nombres de usuario Muestra los nombres de usuario en las listas de entrada @@ -323,8 +323,8 @@ Añadir campo Eliminar campo UUID - No puede mover una entrada aquí. - No puede copiar una entrada aquí. + No puede mover un apunte aquí. + No puede copiar un apunte aquí. Mostrar número de entradas Muestra el número de entradas de un grupo Fondo @@ -346,15 +346,15 @@ Clave maestra Seguridad Historial - Establecer contraseña de un solo uso + Fijar contraseña de un solo uso Tipo de contraseña de un solo uso - Secreto + Secreta Período (segundos) Contador Dígitos Algoritmo - Contraseña de un solo uso - Secreto de contraseña de un solo uso inválida. + Contraseña de un solo uso (OTP) + Secreto de un solo uso no válido. Se debe establecer al menos una credencial. La clave secreta debe estar en formato Base32. El contador debe estar entre %1$d y %2$d. @@ -388,10 +388,10 @@ Configuración de autocompletado Configuración de contraseña maestra Configuración de seguridad - Otorga acceso de escritura para guardar cambios en la base de datos - Mostrar ubicaciones de bases de datos recientes + Conceder acceso de escritura al archivo para guardar los cambios en la base de datos + Muestra las ubicaciones de las bases de datos recientes Mostrar archivos recientes - Lleva un registro de dónde se almacenan las bases de datos + Realiza un seguimiento de dónde se almacenan las bases de datos Recordar ubicaciones de bases de datos La base de datos contiene UUIDs duplicados. Restaurar historial @@ -412,20 +412,20 @@ No se recomienda agregar un cerrojo vacío. ¿Eliminar estos datos de todos modos\? ¿Agregar el archivo de todos modos\? - Al cargar este archivo reemplazará el existente. + Al cargar este archivo, se reemplazará el existente. ¿Borrar los nodos seleccionados de forma permanente\? - El acceso al archivo fue revocado por el administrador de archivos + Acceso al archivo revocado por el administrador de archivos Ejecutando el comando… - Ocultar enlaces rotos en la lista de bases de datos recientes + Oculta los enlaces rotos en la lista de bases de datos recientes Ocultar enlaces rotos de la base de datos - Lleva un registro de dónde se almacenan los cerrojos + Controla dónde se almacenan los archivos clave Recordar ubicaciones de cerrojo - Buscar dominios web con restricciones de subdominios + Busca dominios web con restricciones de subdominios Búsqueda de subdominio Solicite una búsqueda al abrir una base de datos Búsqueda rápida Eliminar historial - El token debe contener de %1$d a %2$d dígitos. + El testigo debe contener de %1$d a %2$d dígitos. Adjuntos Añadir adjunto Información de credenciales @@ -433,10 +433,10 @@ Adjuntar Cargue un archivo adjunto a la entrada para guardar datos externos importantes. No se muestran las entradas caducadas - La eliminación de datos no vinculados puede disminuir el tamaño de su base de datos, pero también puede eliminar los datos usados por los complementos de KeePass. - Una base de datos de KeePass está pensada para contener solamente archivos utilitarios pequeños (como las claves de PGP). + La eliminación de datos no vinculados puede reducir el tamaño de tu base de datos, pero también puede eliminar los datos usados por los complementos de KeePass. + Una base de datos de KeePass solo debe contener pequeños archivos de utilidad (como archivos clave PGP). \n -\nSi procede con esta carga, la base de datos podría crecer mucho y afectar el rendimiento. +\nTu base de datos puede llegar a ser muy grande y reducir el rendimiento con esta carga. Grupo de la papelera de reciclaje Filtrar Elimina los archivos adjuntos contenidos en la base de datos pero no vinculados a una entrada @@ -471,7 +471,7 @@ Modo de registro Modo de guardado Modo de búsqueda - ¿Resolver el problema generando nuevos UUID para que los duplicados continúen\? + ¿Solucionar el problema generando nuevos UUID para que los duplicados continúen? Borrar la clave de desbloqueo del dispositivo El nombre del campo ya existe. Guardar un nuevo elemento no está permitido en una base de datos de sólo lectura @@ -485,7 +485,7 @@ Notificación Ocultar las entradas expiradas Cargar %1$s - Configurar la gestión de contraseñas de un solo uso (HOTP / TOTP) para generar un token solicitado para la autenticación de dos factores (2FA). + Configurar la gestión de contraseñas de un solo uso (HOTP / TOTP) para generar un testigo solicitado para la autenticación de dos factores (2FA). Establecer la contraseña de un solo uso Vincule su contraseña con su credencial biométrica o del dispositivo escaneada para desbloquear rápidamente su base de datos. Desbloqueo de la base de datos de los dispositivos @@ -530,7 +530,7 @@ Fusionar los datos, sobrescribir las modificaciones externas guardando la base de datos o recargarla con los últimos cambios. La información contenida en su archivo de base de datos ha sido modificada fuera de la aplicación. Recargar datos - El tipo de OTP existente no es reconocido por este formulario, su validación ya no puede generar correctamente el token. + El tipo de OTP existente no es reconocido por este formulario, su validación ya no puede generar correctamente el testigo. ¡Cancelado! Los datos del archivo ya existen. Se ha producido un error al cargar los datos del archivo. @@ -545,9 +545,9 @@ Error al exportar la configuración de la aplicación Exportada la configuración de la aplicación Importada la configuración de la aplicación - Crear un archivo para exportar la configuración de la aplicación + Crea un archivo para exportar las propiedades de la aplicación Exportar la configuración de la aplicación - Selecciona un archivo para importar la configuración de la aplicación + Selecciona un archivo para importar las propiedades de la aplicación Importar la configuración de la aplicación Se ha producido un error al realizar una acción en la base de datos. Se ha producido un error al eliminar los datos del archivo. @@ -572,24 +572,24 @@ Cartera de criptomonedas Tipo Wi-Fi - Dirección de correo electrónico - Correo electrónico + Dirección de correo-e + Correo-e Fecha de emisión Lugar de emisión Nombre - Documento de identidad + Tarjeta de identidad Número Titular Tarjeta de Crédito / Débito Plantillas IBAN SWIFT / BIC - Token + Testigo SSID PIN CVV - Muestra los tokens OTP en la lista de entradas - Mostrar token OTP + Muestra los testigos OTP en la lista de apuntes + Mostrar testigo OTP Icono externo Mostrar opción para permitir al usuario seleccionar la entrada de la base de datos Selección manual @@ -615,17 +615,17 @@ Expresión regular Cabecera de navegación Cajón de navegación abierto - Sensible a mayúsculas y minúsculas - Secuencia de autocompletado + Sensible a MAYÚS/minús + Secuencia auto-tecleada Datos personalizados Grupo actual Filtros de búsqueda - Fusionar desde … + Fusionar desde… Guardar una copia en… Heredar Caducada - Colorear caracteres de contraseña por tipo - Ya hay abierta una base de datos, ciérrela antes de abrir otra + Colorea los caracteres de contraseña por tipo + Ya hay abierta una base de datos, ciérrala antes de abrir la nueva Excluya caracteres ambiguos Considere caracteres Entropía: calcular… @@ -635,7 +635,7 @@ \nDependiendo de la implementación de la API nativa del sistema operativo, puede que no sea totalmente funcional. \n \nComprueba la compatibilidad y seguridad del KeyStore con el fabricante de tu dispositivo y el creador de la ROM que estés utilizando. - Recuento de palabras de la frase de paso + Recuento de palabras de la frase de acceso Frase de acceso Colorear contraseñas Pantalla de búsqueda @@ -649,19 +649,19 @@ Tipo Titular Conteo de caracteres: %1$d Modo captura de pantalla - La llave física no está soportada. - <strong>No se recuperan datos del usuario</strong>, esta aplicación no se conecta a ningún servidor, funciona solo localmente y respeta completamente la privacidad del usuario. - Imposible fusionar desde una base de datos V1. + La llave física no está admitida. + No se recupera ningún dato del usuario, esta aplicación no se conecta a ningún servidor, funciona solo localmente y respeta completamente la privacidad del usuario. + No se puede fusionar desde una base de datos kdb Cancelado por el usuario. - Imposible obtener la respuesta del desafío. - Autocompletar + No se puede obtener la respuesta del desafío. + Auto-teclear Llave física Seleccione una llave física. - Error en la sintaxis XML. + XML incorrecto. Desafío ya solicitado Respuesta ya recibida. Se necesita un controlador para %1$s. - Se desconoce la ubicación de la base de datos, no se puede realizar la acción de la base de datos. + La ubicación de la base de datos es desconocida, no se puede realizar la acción de la base de datos. La clave no puede estar vacía. Archivo dañado. Recordar llaves físicas From 1f9b2ce7b9fbfe2f7bf3fc17747615c99dc0876d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 3 Oct 2024 20:24:32 +0000 Subject: [PATCH 064/119] Translated using Weblate (Estonian) Currently translated at 25.3% (167 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/et/ --- app/src/main/res/values-et/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 000a4683f..0d9990927 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -164,4 +164,7 @@ Kinnita salasõna Loodud salasõna Võti ei tohi olla tühi. + Vigane OTP salasõna. + Gruppi ei saa siia tõsta. + See sõna on reserveeritud muuks kasutuseks ning sa ei saa teda pruukida. \ No newline at end of file From 7bde363704fb6b8ab24d4a5116f613660b2ecc7d Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Sat, 5 Oct 2024 17:03:03 +0200 Subject: [PATCH 065/119] Added translation using Weblate (Azerbaijani) --- app/src/main/res/values-az/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-az/strings.xml diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-az/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 5de1d6b34314a4f6600b48de66000ac7b27a4a37 Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Sat, 5 Oct 2024 15:03:39 +0000 Subject: [PATCH 066/119] Translated using Weblate (Azerbaijani) Currently translated at 10.7% (71 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 97 +++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index a6b3daec9..7a4b5a0dd 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -1,2 +1,97 @@ - \ No newline at end of file + + Məlumat + Əlaqə + Ana səhifə + Qeyd əlavə et + Qeydə düzəliş et + Qrup əlavə et + Açar yaratma funksiyası + Taymaut + Məlumat bazasını kilidləmədən öncəki boşluq müddəti + Tətbiq + Mötərizə + Artırılmış ASCII + İcazə ver + Mübadilə buferi təmizləndi + Mübadilə buferi xətası + Mübadilə buferinin boşluq müddəti + Mübadilə buferində məlumatların saxlanma müddəti (əgər cihazınız dəstəkləyirsə) + Arxaplan + Faylı aç + Qeyd əlavə et + Qrup əlavə et + Fayl əlavə et + Fayl məlumatları + Şəxsiyyət məlumatları + Birdəfəlik şifrə məlumatları + Açar fayl təsdiqi + Aparat-təchizat açarı təsdiqi + Qeyd simvolu + Məlumat bazasının rəngi + Dəyişiklikləri ləğv et? + Şifrə generatoru + Şifrə uzunluğu + Qoşma əlavə et + %1$sfaylını mübadilə buferinə köçürmək üçün seçin + Məlumat bazası açarı əldə edilir … + Doğrulama istəyi üçün gözlənilir … + Doğrulama cavabı üçün gözlənilir … + Məlumat bazası + Şablonlar + Məlumat bazası məzmunun şifrəsi açılır … + Rəqəmlər + Standart məlumat bazası olaraq istifədə et + Heç bir istifadəçi məlumatı toplanmır, bu tətbiq heç bir serverə bağlanmır, yalnız lokal olaraq işləyir və tamamilə istidəçilərin gizliliyinə hörmət edir. + Giriş edildi + Ləğv et + Qeydlər + Şifrəni təsdiq et + UUID + Tarixçə + Qoşmalar + Açar fayl + Aparat-təchizat açarı + Dəyişdirilmiş + Axtarılabilən + Şifrələr uyğun deyil. + Hər bir sıranın bir adı olmalıdır. + Bu etiket artıq mövcuddur. + \"Uzunluq\" sahəsinə müsbət bir rəqəm yazın. + \"Avtomatik doldurma\" xidmətini aktiv etmək mümkün olmadı. + Qrupu buraya köçürə bilməzsiniz. + Qrupu buraya nüsxələyə bilməzsiniz. + Məlumat bazası yaratmaq mümkün deyil. + Bu şifrə və açar faylı ilə məlumat bazası yaratmaq mümkün deyil. + Sayğac %1$dvə%2$d aralığında olmalıdır. + Dövr %1$dvə%2$d saniyə aralığında olmalıdır. + İanə + Rəy + Keepass şifrə menecerinin android tətbiqi + Qəbul et + Ana şifrə + Təhlükəsizlik + Şifrələmə + Şifrələmə alqortiması + Bəzi cihazlar mübadilə buferindən istifadə etməyə icazə verməyəcək. + Mübadilə buferi təmizlənmədi + Şifrə təsdiqi + Müddəti bitdi + Qeydin ön plan rəngi + Qeydin arxaplan rəngi + Doğrula + Ləğv et + Şifrədəki söz sayısı + Yenilə + Sil + <strong>Müstəqilliyimiz qorumaq</strong>, <strong>xətaları düzəltmək</strong>,<strong>yeni funskiyalar əlavə etmək</strong> və <strong>hər zaman aktiv olmaq</strong>üçün<strong>sizin dəstəyinizə etibar edirik. + Yaradıldı + Müddəti bitir + Etiketlər + Şifrə + Ən azından bir şəxsiyyət məlumatları təyin edilməlidir. + Ən azından bir ədəd şifrə generatoru növü seçilməlidir. + \"Transformasiya mərhələləri\" çox yüksəkdir. 2147483648-ə təyin edin. + Malumat bazasını yadda saxlamaq mümkün olmadı. + Məxfi söz Base32 formatında olmalıdır. + \ No newline at end of file From c7866bfbbf2b262b7f3cfb1aa697881db4bd4b5d Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Sat, 5 Oct 2024 21:04:27 +0000 Subject: [PATCH 067/119] Translated using Weblate (Azerbaijani) Currently translated at 12.8% (85 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 7a4b5a0dd..a327215a6 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -94,4 +94,26 @@ \"Transformasiya mərhələləri\" çox yüksəkdir. 2147483648-ə təyin edin. Malumat bazasını yadda saxlamaq mümkün olmadı. Məxfi söz Base32 formatında olmalıdır. + Doğrulama artıq istənilib + Artıq cavab verilib. + Məlumat bazasının yeri məlum deyil, məlumat bazası funksiyası yerinə yetirilə bilməz. + Açar bölməsi boş saxlanıla bilməz. + Sahə adı + Sahə dəyəri + Fayl tapılmadı. Onu fayl brauzerində yenidən açmağı yoxlayın. + Zədələnmiş fayl. + Şifrəni təsdiq et + Yaradılmış şifrə + Qrup adı + Etiket adı + Açar faylı + Şifrəli cümlə + %1$s üçün drayver lazımdır. + İstifadəçi tərəfindən ləğv edildi. + Uzunluq + Aparat-təchizat açarı dəstəklənmir. + Şifrə yarat + Şifrə + Fayl meneceri + Şifrə \ No newline at end of file From 84cdb2483f565d188eee7c658311806415ca096a Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Sun, 6 Oct 2024 02:44:28 +0000 Subject: [PATCH 068/119] Translated using Weblate (Azerbaijani) Currently translated at 15.9% (105 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index a327215a6..79ead7571 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -116,4 +116,27 @@ Şifrə Fayl meneceri Şifrə + UUID-ni göstər + Şifrə və ya qrupa bağlı UUID-ni göstər + Qrupdaki şifrələrin sayını göstər + Listdəki faylların həcmi + Element listindəki mətnin ölçüsü + Məlumat bazası yaradılır … + Məlumat bazası yüklənir … + Kiçik hərf + Haqqında + Ana açarı dəyişdir + %1$s nüsxələndi + Forum doldurma + Klaviatura, avtomatik douldurma, mübadilə buferi + Cihaz kilidini aç + Biometrik, cihaz şəxsiyyət məlumatları + Şifrələmə, açar hazırlama funskiyası + Ana açar parametrləri + Parametrlər + Tətbiq parametrləri + Axtar, kilidlə, tarixçə, xüsusiyyətlər + Məlumat bazası parametrləri + Meta məlumatlar, zibil qutusu, şablonlar, tarixçə + Təhlükəsizlik parametrləri \ No newline at end of file From 40d2f2de96481f206523ad450d2f76281f8ede5b Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Sun, 6 Oct 2024 03:05:28 +0000 Subject: [PATCH 069/119] Translated using Weblate (Azerbaijani) Currently translated at 18.0% (119 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 79ead7571..384fe3609 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -139,4 +139,22 @@ Məlumat bazası parametrləri Meta məlumatlar, zibil qutusu, şablonlar, tarixçə Təhlükəsizlik parametrləri + Yapışdır + Sil + Ləğv et + Şifrəni gizlət + Məlumat bazasını kilidlə + Məlumatları yadda saxla + Məlumatları birləşdir + Məlumatları yenidən yüklə + ... -dan birləşdir + Bir nüsxəsini burada ... yadda saxla + + Axtar + Şifrəni göstər + İanə et + Dəyişiklik, yenilənmə + Düzəliş et + Nüsxələ + Köçür \ No newline at end of file From 77628e2fb98d312bcf8e66c56dbdd9b7214f26a8 Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Sun, 6 Oct 2024 14:12:55 +0000 Subject: [PATCH 070/119] Translated using Weblate (Azerbaijani) Currently translated at 18.2% (120 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 384fe3609..f03bd7315 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -157,4 +157,7 @@ Düzəliş et Nüsxələ Köçür + Aparat-təchizat açarlarını xatırla + Açar faylın yerini xatırla + Açar faylların saxlanıldığı yeri unutma \ No newline at end of file From 53beaca5637d50ed69ffa8605463bb343b7d4061 Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Sun, 6 Oct 2024 18:16:49 +0000 Subject: [PATCH 071/119] Translated using Weblate (Azerbaijani) Currently translated at 18.6% (123 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index f03bd7315..3776abe17 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -160,4 +160,7 @@ Aparat-təchizat açarlarını xatırla Açar faylın yerini xatırla Açar faylların saxlanıldığı yeri unutma + Ən son faylları göstər + Zədələnmiş məlumat bazası linklərini gizlət + Ən son məlumat bazalarının yerini göstər \ No newline at end of file From 26976ae6cf57a25797d605d643a95ce01362122e Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Wed, 9 Oct 2024 08:11:30 +0000 Subject: [PATCH 072/119] Translated using Weblate (Azerbaijani) Currently translated at 22.7% (150 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 28 ++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 3776abe17..4214d0a72 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -163,4 +163,32 @@ Ən son faylları göstər Zədələnmiş məlumat bazası linklərini gizlət Ən son məlumat bazalarının yerini göstər + Tətbiqin parametrlərini ixrac et + Tətbiqin parametrlərini ixrac etmək üçün bir fayl yaradın + Tətbiq parametrlərini idarə etmək üçün KeePassDX xüsusiyyətləri + Tətbiqin parametrləri idxal edildi + Tətbiqin parametrləri ixrac edildi + Bütün malumatlar üçün istifadə olunan məlumat bazası şifrələmə alqoritması + Tətbiqi bağlamayın … + Boşluq + Filter + Öncə ən aşağı + Öncə qruplar + Aşağıdakı zibil qutusu + Təbii sıralama + Başlıq + Yaradılma + Dəyişiklik + Axtar + Altdan xətt + Böyük hərf + Xəbərdarlıq + Tətbiqin parametrlərinin idxalı zamanı xəta baş verdi + Tətbiqin parametrləri idxal edilən zaman xəta baş verdi + Kök + Çeşidlə + İstifadəçi adı + Giriş + Özəl + Dəstəklənməyən məlumat bazas versiyası. \ No newline at end of file From d8429bdd99f63f0bceb19a700a209dc27ec5e9e2 Mon Sep 17 00:00:00 2001 From: Francisco Serrador Date: Sat, 12 Oct 2024 22:47:58 +0000 Subject: [PATCH 073/119] Translated using Weblate (Spanish) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/ --- app/src/main/res/values-es/strings.xml | 166 ++++++++++++------------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index df1150c04..ac564c7d8 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -58,7 +58,7 @@ URL ID Usuario No se admite el cifrador de flujo Arcfour. - KeePassDX no puede gestionar este URI. + KeePassDX no ha podido gestionar este URI. No se ha podido crear el archivo No se ha podido leer la base de datos. Asegúrese que la ruta es correcta. @@ -109,7 +109,7 @@ Quitar Raíz Rondas de transformación - Las rondas de cifrado adicionales proporcionan una mayor protección contra los ataques de fuerza bruta, pero pueden ralentizar mucho la carga y el guardado. + Las rondas de cifrado adicionales proporcionan una mayor protección contra los ataques de fuerza bruta, pero pueden ralentizar mucho el cargado y el guardado. Guardando base de datos… Espacio Orden natural @@ -174,23 +174,23 @@ General Autocompletado Autocompletado de formularios de KeePassDX - Acceder con KeePassDX + Iniciar sesión con KeePassDX Establecer servicio de autocompletado por defecto Tamaño de la contraseña generada Establece el tamaño predeterminado de las contraseñas generadas Caracteres de contraseña - Establecer los caracteres permitidos del generador de contraseñas + Establece los caracteres permitidos del generador de contraseñas Portapapeles Notificaciones del portapapeles - Mostrar las notificaciones del portapapeles para copiar campos al examinar una entrada + Muestra notificaciones del portapapeles para copiar campos al examinar un apunte Bloquear Bloqueo de pantalla Bloquear la base de datos después de unos segundos cuando la pantalla esté apagada Desbloqueo del dispositivo Desbloqueo biométrico - Le permite escanear sus datos biométricos para abrir la base de datos + Le permite analizar sus datos biométricos para abrir la base de datos Eliminar claves de cifrado - Borrar todas las claves de cifrado relacionadas con el reconocimiento de desbloqueo del dispositivo + Borra todas las claves de cifrado relacionadas con el reconocimiento de desbloqueo del dispositivo No se pudo iniciar esta funcionalidad. El dispositivo funciona con Android %1$s, pero necesita %2$s o posterior. No se pudo encontrar el hardware correspondiente. @@ -201,9 +201,9 @@ Uso de la papelera de reciclaje Mueve los grupos y las entradas al grupo \"Papelera de reciclaje\" antes de eliminarlos Tipografía del campo - Cambiar la fuente de los campos para una mejor visibilidad del carácter + Cambia la tipografía usada en los campos para una mejor visibilidad del carácter Portapapeles de confianza - Permitir copiar la contraseña de entrada y los campos protegidos al portapapeles + Permitir copiar la contraseña de apunte y los campos protegidos al portapapeles Nombre de la base de datos Descripción de la base de datos Versión de la base de datos @@ -211,9 +211,9 @@ Interfaz Otro Teclado - Teclado mágico - Active un teclado personalizado que llene sus contraseñas y todos los campos de identidad fácilmente - Restablecer sugerencias didácticas + Magikeyboard + Activar un teclado personalizado que rellene sus contraseñas y todos los campos de identidad fácilmente + Restablecer consejos educativos Mostrar de nuevo toda la información didáctica Se restablecieron las sugerencias didácticas Cree su archivo de base de datos @@ -272,41 +272,41 @@ Protegido contra escritura Modificable Compilación %1$s - Si la eliminación del cortapapeles falla, elimine su historial manualmente. - Advertencia: El portapapeles es compartido por todas las aplicaciones. Si se copian datos sensibles, otros programas pueden recuperarlos. - No permitir claves maestras - Permite pulsar el botón \"Abrir\" si no se seleccionan credenciales - Sugerencias educativas - Destacar elementos para aprender cómo funciona la aplicación + Si la eliminación del cortapapeles falla, borre su historial manualmente. + Aviso: el portapapeles está compartido por todas las aplicaciones. Si se copian datos sensibles, otros programas pueden recuperarlos. + Permitir sin clave maestra + Permite pulsar el botón «Abrir» si no se seleccionan credenciales + Consejos educativos + Destaca los elementos para aprender cómo funciona la aplicación Protegida contra escritura - Abrir la base de datos de solo lectura por defecto + Abre la base de datos como solo lectura por defecto Proteja la base de datos contra escritura - Teclado mágico - Teclado mágico (KeePassDX) - Configuración del Teclado mágico + Magikeyboard + Magikeyboard (KeePassDX) + Configuración de Magikeyboard Entrada Tiempo límite Tiempo límite para vaciar la entrada del teclado Información sobre notificación - Mostrar una notificación cuando esté disponible una entrada + Muestra una notificación cuando esté disponible un apunte Entrada - %1$s disponible en Teclado mágico + %1$s disponible en Magikeyboard %1$s Vaciar al cerrar - Cerrar la base de datos al cerrar la notificación + Cierra la base de datos al cerrar la notificación Apariencia Tema del teclado Teclas - Vibrar al pulsar tecla - Sonar al pulsar tecla + Vibrar al pulsar las teclas + Sonar al pulsar las teclas Modo de selección No cierre la aplicación… - Bloquear la base de datos cuando el usuario pulse el botón atrás en la pantalla inicial + Bloquear la base de datos cuando el usuario pulse el botón trasero en la pantalla inicial Vaciar al cerrar - Bloquear la base de datos cuando expire la duración del portapapeles o cuando se cierre la notificación después de empezar a utilizarla + Bloquea la base de datos cuando expire la duración del portapapeles o se cierre la notificación después de empezar a utilizarla Papelera de reciclaje Selección de entrada - Al ver una entrada en KeePassDX, rellenar con esta el teclado mágico + Al visualizar una entrada en KeePassDX, rellena Magikeyboard con esa entrada Eliminar contraseña Elimina la contraseña introducida tras un intento de conexión a una base de datos Abrir archivo @@ -333,15 +333,15 @@ No se puede crear la base de datos con esta contraseña y este cerrojo. Desbloqueo de dispositivos Biometría - Abrir petición automáticamente - Solicitar automáticamente el desbloqueo del dispositivo si la base de datos está configurada para utilizarlo + Abrir solicitud automáticamente + Solicita automáticamente el desbloqueo del dispositivo si la base de datos está configurada para utilizarlo Activar Desactivar Cambiar el modo de apertura de la sesión. \n \n\"Protegido contra escritura\" evita cambios no deseados en la base de datos. \n\"Modificable\" le permite agregar, eliminar o modificar todos los elementos como desee. - Presione \'Atrás\' para bloquear + Presione ‘Atrás’ para bloquear Repetir conmutación de visibilidad de contraseña Clave maestra Seguridad @@ -368,22 +368,22 @@ En curso: %1$d %% Inicializando… Descargar %1$s - Guardar la base de datos después de cada acción importante (en modo \"Modificable\") + Guarda la base de datos después de cada acción importante (en modo \"Modificable\") Guardar base de datos automáticamente Bloquear autocompletado Cambiar teclado - Acción de la tecla \"Ir\" al presionar una tecla \"Campo\" + Acción de la tecla «Ir» al presionar una tecla «Campo» Gzip Ninguna Compresión Nombre de usuario predeterminado - Requerir cambiar la contraseña maestra la próxima vez (una vez) + Requiere cambiar la clave maestra la próxima vez (una vez) Forzar renovación la próxima vez - Requerir un cambio de la contraseña maestra (días) + Requiere cambiar la clave maestra (días) Forzar renovación Tamaño máximo - Utiliza el desbloqueo de dispositivos para abrir una base de datos más fácilmente - Muestra el botón de bloqueo en la interfaz + Usa el desbloqueo avanzado para abrir una base de datos más fácilmente + Muestra el botón de bloqueo en la interfaz de usuario Mostrar botón de bloqueo Configuración de autocompletado Configuración de contraseña maestra @@ -418,7 +418,7 @@ Ejecutando el comando… Oculta los enlaces rotos en la lista de bases de datos recientes Ocultar enlaces rotos de la base de datos - Controla dónde se almacenan los archivos clave + Mantiene seguimiento de dónde los cerrojos son almacenados Recordar ubicaciones de cerrojo Busca dominios web con restricciones de subdominios Búsqueda de subdominio @@ -439,32 +439,32 @@ \nTu base de datos puede llegar a ser muy grande y reducir el rendimiento con esta carga.
Grupo de la papelera de reciclaje Filtrar - Elimina los archivos adjuntos contenidos en la base de datos pero no vinculados a una entrada - Eliminar los datos no vinculados + Elimina los archivos adjuntos contenidos en la base de datos pero no vinculados a un apunte + Eliminar datos no vinculados Datos - ¿Borrar todas las claves de cifrado relacionadas con el reconocimiento del desbloqueo del dispositivo\? + ¿Borrar todas las claves de cifrado relacionadas con el reconocimiento de desbloqueo avanzado? Tiempo de espera de desbloqueo del dispositivo Duración del uso del desbloqueo del dispositivo antes de borrar su contenido Caducidad del desbloqueo del dispositivo - No almacenes ningún contenido cifrado para utilizar el desbloqueo del dispositivo + No almacenar ningún contenido cifrado para usar el desbloqueo avanzado Desbloqueo temporal de los dispositivos Le permite usar la credenciales de su dispositivo para abrir la base de datos - Desbloqueo de las credenciales del dispositivo - Pulsa para eliminar las claves de desbloqueo del dispositivo + Desbloqueo de credenciales del dispositivo + Pulsa para eliminar las teclas de desbloqueo avanzado Contenido - Copiar los campos de entrada usando el portapapeles de su dispositivo + Copia los campos de apunte usando el portapapeles de su dispositivo Credenciales del dispositivo - Introduzca la contraseña y luego haga clic en este botón. - No se ha podido inicializar el aviso de desbloqueo del dispositivo. + Teclee la contraseña y luego pulse sobre este botón. + No se puede inicializar el aviso de desbloqueo avanzado. Error de desbloqueo del dispositivo: %1$s - No se reconoció la huella digital para desbloquear el dispositivo + No se ha podido reconocer la impresión de desbloqueo avanzado No se puede leer la clave de desbloqueo del dispositivo. Por favor, bórrala y repite el procedimiento de reconocimiento del desbloqueo. Extraer la credencial de la base de datos con los datos de desbloqueo del dispositivo - Reconocimiento de desbloqueo de los dispositivos + Reconocimiento de desbloqueo del dispositivo Aún debes recordar la credencial principal de tu caja fuerte si usas el reconocimiento para el desbloqueo del dispositivo. Enlace para el desbloqueo del dispositivo El almacén de claves no está debidamente inicializado. - Se requiere una actualización de la seguridad biométrica. + Se requiere actualización de seguridad biométrica. No se ha inscrito ninguna credencial biométrica o del dispositivo. El contenido del cerrojo nunca debe modificarse y, en el mejor de los casos, debe contener datos generados al azar. ¿Borrar permanentemente todos los nodos de la papelera de reciclaje\? @@ -475,13 +475,13 @@ Borrar la clave de desbloqueo del dispositivo El nombre del campo ya existe. Guardar un nuevo elemento no está permitido en una base de datos de sólo lectura - Recomendar la renovación - Limitar el tamaño del historial por entrada - Limitar el número de elementos del historial por entrada + Recomendar renovar + Limitar el tamaño del historial por apunte + Limitar el número de elementos del historial por apunte Número máximo Configuración del teclado del dispositivo Color personalizado de la base de datos - Recomendar cambiar la contraseña maestra (días) + Recomienda cambiar la clave maestra (días) Notificación Ocultar las entradas expiradas Cargar %1$s @@ -489,38 +489,38 @@ Establecer la contraseña de un solo uso Vincule su contraseña con su credencial biométrica o del dispositivo escaneada para desbloquear rápidamente su base de datos. Desbloqueo de la base de datos de los dispositivos - No se permite guardar datos en una base de datos abierta como de sólo lectura. - Reiniciar la aplicación que contiene el formulario para activar el bloqueo. - Lista de bloqueo que impide el llenado automático de los dominios web - Lista de bloqueo de los dominios web - Lista de bloqueo que impide el llenado automático de las aplicaciones - Lista de bloqueo de las aplicaciones - Solicitar datos de guardado al completar el llenado de un formulario - Pedir que se guarden los datos - Trate de guardar la información de búsqueda al hacer una selección de entrada manual para facilitar los usos futuros - Guardar la información de la búsqueda - Cerrar la base de datos después de una selección de autocompletado - Cerrar la base de datos + No se permite guardar datos en una base de datos abierta como de solo lectura. + Reinicia la aplicación que contiene el formulario para activar el bloqueo. + Lista de dominios web en los que se impide el autocompletado + Lista de bloqueo de dominios web + Lista de aplicaciones en las que se impide el autocompletado + Lista de bloqueo de aplicaciones + Pregunta para guardar los datos al rellenar un formulario + Preguntar para guardar los datos + Intenta guardar la información de búsqueda al seleccionar manualmente una entrada para facilitar su uso en el futuro + Guardar información de la búsqueda + Cierra la base de datos tras una selección de autocompletado + Cerrar base de datos Entrar Retroceder - Seleccionar la entrada + Seleccionar apunte Volver al teclado anterior Campos personalizados - Cambiar automáticamente al teclado anterior después de bloquear la base de datos - Bloquear la base de datos - Cambiar automáticamente al teclado anterior después de ejecutar \"Acción de la tecla automática\" + Vuelve automáticamente al teclado anterior después de bloquear la base de datos + Bloquear base de datos + Cambiar automáticamente al teclado anterior tras ejecutar «Acción de la tecla automática» Volver atrás - Cambiar automáticamente al teclado anterior en la pantalla de credenciales de la base de datos + Intercambiar automáticamente al teclado anterior en la pantalla de credenciales de la base de datos Pantalla de credenciales de la base de datos - Acción de la tecla automática - Intente guardar la información compartida para su uso en el futuro cuando seleccione entradas manualmente + Acción automática de tecla + Intente guardar la información compartida para su uso en el futuro cuando seleccione apunte manualmente Guardar información compartida Muestra el UUID vinculado a una entrada o a un grupo Mostrar UUID No se puede reconstruir correctamente la lista. No se puede recuperar la URI de la base de datos. Intenta mostrar sugerencias de autocompletado directamente desde un teclado compatible - Añadidas sugerencias de autocompletado. + Sugerencias de autocompletado añadidas. Acceso al archivo revocado por el administrador de archivos, cierra la base de datos y vuelva a abrirla desde su ubicación. GiB MiB @@ -591,7 +591,7 @@ Muestra los testigos OTP en la lista de apuntes Mostrar testigo OTP Icono externo - Mostrar opción para permitir al usuario seleccionar la entrada de la base de datos + Muestra la opción para permitir al usuario seleccionar la entrada de la base de datos Selección manual Seleccionar entrada… Nombre del icono @@ -602,11 +602,11 @@ Color de fondo del apunte Etiquetas La recarga de la base de datos borrará los datos modificados localmente. - El hash del archivo no está garantizado porque Android puede cambiar sus datos sobre la marcha. Cambia la extensión del archivo a .bin para una correcta integridad. - Mantener la pantalla encendida - Mantén la pantalla encendida cuando veas o edites una entrada + El hash del archivo no está garantizado porque Android puede cambiar sus datos sobre la marcha. Cambia la extensión del archivo a .bin para una integridad correcta. + Mantener pantalla encendida + Mantiene la pantalla encendida cuando se visualiza la entrada Modo captura de pantalla - Permitir que otras aplicaciones graben o tomen capturas de pantalla de la aplicación + Permite que aplicaciones de terceros graben o tomen capturas de pantalla de la aplicación Muestra los colores de primer y segundo plano de una entrada Colores de entrada Fusionar datos @@ -639,7 +639,7 @@ Frase de acceso Colorear contraseñas Pantalla de búsqueda - Volver automáticamente al teclado anterior en la pantalla de búsqueda + Vuelve automáticamente al teclado anterior en la pantalla de búsqueda Entropía: %1$s bit Entropía: Alta Al menos un carácter desde cada @@ -669,7 +669,7 @@ Casilla de llave física Esperando solicitud de desafío… Esperando respuesta al desafío… - Fusión finalizada con éxito + Fusión correctamente realizada Información Buscar, bloquear, historial, propiedades Teclado, autocompletar, portapapeles From 6de25ffa657b8ad1a2dd605da135b0a8d8e60e17 Mon Sep 17 00:00:00 2001 From: Linerly Date: Mon, 14 Oct 2024 01:18:39 +0000 Subject: [PATCH 074/119] Translated using Weblate (Indonesian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/id/ --- app/src/main/res/values-in/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 945462445..43869703b 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -632,7 +632,7 @@ Tidak bisa mendapatkan tanggapan dari tantangan. Dibatalkan oleh pengguna. Driver untuk %1$s dibutuhkan. - Tidak dapat menggabungkan dari sebuah basis data V1. + Tidak dapat menggabungkan dengan berkas basis data kdb Lokasi basis data tidak diketahui, tindakan basis data tidak dapat dilakukan. Kunci perangkat keras tidak didukung. Kunci tidak bisa kosong. @@ -678,4 +678,5 @@ Ikuti sistem Terang Gelap + Muat ulang basis data dengan perubahan terkini. \ No newline at end of file From a65f52ffba3332f60667ccf8a97b7ad62a37828a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roko=20Magdaleni=C4=87?= Date: Tue, 15 Oct 2024 21:29:10 +0000 Subject: [PATCH 075/119] Translated using Weblate (Serbian (Latin script)) Currently translated at 59.7% (394 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sr_Latn/ --- app/src/main/res/values-b+sr+Latn/strings.xml | 157 +++++++++++++++++- 1 file changed, 153 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 9cb26626e..eff1ccf52 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -27,7 +27,7 @@ Prikaži lozinku Traži Otvori - Sačuvaj bazu podataka + Sačuvaj podatake Zaključaj bazu podataka Sakrij lozinku Otkaži @@ -224,12 +224,12 @@ Kako bismo <strong>zadržali našu slobodu</strong>, <strong>ispravljali greške</strong>, <strong>dodavali nove opcije</strong> i <strong>uvek bili aktivni</strong>, računamo na Vaš <strong>doprinos</strong>. KeePassDX © %1$d Kunzisoft je <strong>otvorenog koda</strong> i <strong>ne sadrži reklame</strong>. \nPonuđen je onakav kakav jeste, pod <strong>GPLv3</strong> licencom, bez ikakvih garancija. - Cifre + Znamenke Koristi kao podrazumevanu bazu podataka Dešifrovanje sadržaja baze podataka… Baza podataka Dohvatanje ključa baze podataka… - Izabarite kako bi ste kopirali %1$s u međuspremnik + Izaberite kako bi ste kopirali %1$s u međuspremnik Zatvori polja Obriši Ažuriraj @@ -256,7 +256,7 @@ Vreme isteka međuspremnika Nije moguće očistiti međuspremnik Neki uređaji neće dozvoliti aplikacijama da koriste međuspremnik. - Međuspremnik je očišćena + Međuspremnik je očišćen Greška međuspremnika Dozvoli Izmeni stavku @@ -264,4 +264,153 @@ Kontakt Neophodno je ažurirati biometriju. Podesi + Broj reči pristupne fraze + Dugačka lozinka + Filtar + Polje za potvrdu hardverskog ključa + Boja pozadine unosa + Ime + Nije moguće pravilno obnoviti listu. + Brza pretraga + Zaštita + Izaberite datoteku za uvoz podešavanja aplikacije + Transformacioni krugovi + Boja baze podataka + Ulazna boja prednjeg plana + Debitna/kreditna kartica + Mjesto izdavanja + Datum izdavanja + Email + Adresa e-pošte + Vrsta + Novčanik za kriptovalute + Token + Javni ključ + Privatni ključ + Tajna fraza + Račun + SVIFT / BIC + Članstvo + Ovaj obrazac ne prepoznaje postojeći tip OTP-a, njegova validacija možda više neće ispravno generisati token. + Došlo je do greške pri izvođenju radnje u bazi podataka. + Поново учитај податке + Instalirajte veb pregledač da biste otvorili ovu URL adresu. + Otvorite postojeći trezor + Prati gde se čuvaju baze podataka + Sakrijte pokvarene veze na listi nedavnih baza podataka + Informacije o jednokratnoj lozinci + Došlo je do greške pri otpremanju podataka datoteke. + Ime ikone + Nema rezultata pretrage + Korišćenje memorije + Prikaži nedavne datoteke + Prikaži UUID + Ne preuzimaju se nikakvi korisnički podaci, ova aplikacija se ne povezuje ni na jedan server, radi samo lokalno i u potpunosti poštuje privatnost korisnika. + Isteklo + Hardverski ključ + Banka + Ime banke + Verzija + Došlo je do greške pri uklanjanju podataka iz datoteke. + Izazov je već zahtevan + Hardverski ključ nije podržan. + Ključ ne može biti prazan. + Obojite znakove lozinke po tipu + Prikaži OTP token + Prikazuje UUID povezan sa unosom ili grupom + Sjedini iz … + Rad u toku … + Napravite datoteku za izvoz podešavanja aplikacije + Podešavanja aplikacije su izvezena + Koren + Dodatne runde šifrovanja pružaju veću zaštitu od napada grube sile, ali zaista mogu usporiti učitavanje i čuvanje. + Količina memorije koju će koristiti funkcija izvođenja ključa. + Razmak + Nije moguće spojiti sa kdb datotekom baze podataka + Lokacija baze podataka je nepoznata, radnja baze podataka se ne može izvršiti. + Oštećena datoteka. + Obojite lozinke + Prikazuje OTP tokene na listi unosa + Ime polja već postoji. + Objedini podatke + Izbrišite ključ za otključavanje uređaja + Pretražujte veb domene sa ograničenjima poddomena + Izvezite podešavanja aplikacije + Režim registracije + Zapamtite lokacije baza podataka + Zapamtite hardverske ključeve + Vodi evidenciju o korišćenim hardverskim ključevima + Greška tokom uvoza podešavanja aplikacije + Sakrij neispravne veze baze podataka + Uvezite podešavanja aplikacije + KeePassDX svojstva za upravljanje podešavanjima aplikacije + Prikaži lokacije nedavnih baza podataka + Podešavanja aplikacije su uvezena + Da bi se generisao ključ za algoritam šifrovanja, glavni ključ se transformiše korišćenjem nasumično slane funkcije izvođenja ključa. + Ne ubijajte aplikaciju… + Algoritam šifrovanja baze podataka koji se koristi za sve podatke + Izvršavanje komande… + Zaglavlje za navigaciju + Ploča navigacije otvorena + Ploča navigacije zatvorena + Pretraživo + Nasledi + Automatska sekvenca unosa + Oznake + Prilagođeni podaci + Filteri za pretragu + Trenutna grupa + Osetljivo na velika i mala slova + PIN + IBAN + Sigurna beleška + URI baze podataka se ne može preuzeti. + U zavisnosti od vašeg menadžera datoteka, KeePassDX možda neće dozvoliti da upisuje u vašu memoriju. + Sortiraj + Automatski unos + Režim čuvanja + Informacije + Čeka se zahtev za izazov… + Čeka se odgovor na izazov… + Predlošci + Regularni izraz + Vlasnik + Broj + Ova reč je rezervisana i ne može se koristiti. + CVV + Lična karta + Vi-Fi + SSID + Standardno + Šablon + Izaberite hardverski ključ. + XML je pogrešno oblikovan. + Ovde ne možete premestiti grupu. + Datoteka koju pokušavate da otpremite je prevelika. + Podaci o fajlu već postoje. + Odgovor je već dat. + Nije moguće dobiti odgovor na izazov. + Korisnik je otkazao. + Potreban je drajver za %1$s. + Pretraga, zaključavanje, istorija, svojstva + Tastatura, automatsko popunjavanje, klipbord + Biometrija, akreditiv uređaja + Metapodaci, korpa za otpatke, šabloni, istorija + Šifrovanje, funkcija izvođenja ključa + Promena, obnova + Sačuvajte kopiju u… + Vanjska ikona + Napravite novi trezor + Zatražite pretragu prilikom otvaranja baze podataka + Pretraga poddomena + Pravljenje nove baze podataka… + Zaštićeno od pisanja + Greška tokom izvoza podešavanja aplikacije + Baza podataka sadrži duplirane UUID-ove. + Rešiti problem generisanjem novih UUID-ova za nastavak duplikata? + Režim pretrage + Režim izbora + Paralelizam + Stepen paralelizma (tj. broj niti) koji koristi funkcija izvođenja ključa. + Čuvanje baze podataka… \ No newline at end of file From 4ae4951e0d2eaec71bf8ae60cf7d1e54f22f2bb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roko=20Magdaleni=C4=87?= Date: Tue, 15 Oct 2024 21:14:39 +0000 Subject: [PATCH 076/119] Translated using Weblate (Serbian) Currently translated at 51.1% (337 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sr/ --- app/src/main/res/values-sr/strings.xml | 278 ++++++++++++++++++++++++- 1 file changed, 277 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 1ca737bdf..4b0f948eb 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -2,7 +2,7 @@ Контакт Повратне информације - Управљач лозинки KeePass за Андроид + Андроид имплементација КееПасс менаджера лозинки Нов унос Уређивање уноса Нова скупина @@ -67,4 +67,280 @@ Истиче Јавни кључ Чланство + Додај ставку + Информације о подацима пријаве + Поље за потврду датотеке кључа + База података + Креирано + Користи као подразумевану базу података + Не преузимају се никакви кориснички подаци, ова апликација се не повезује ни на један сервер, ради само локално и у потпуности поштује приватност корисника. + Откажи + Датотека кључа + Прилози + Подеси једнократну лозинку + Сачувај + Тајна + Период (у секундама) + OTP тип + Ова ознака већ постоји. + Није могуће омогућити услугу аутоматског попуњавања. + Није могуће прочитати базу података. + Неважећа ОТП тајна. + Изаберите датотеку кључа. + Нема довољно меморије за учитавање целе базе података. + Није могуће учитати кључ. Покушајте да смањите коришћење КДФ меморије. + Бројач мора бити између %1$d и %2$d. + Број секунди периода мора бити у опсегу од %1$d до %2$d. + Датотека коју покушавате да отпремите је превелика. + Корисник је отказао. + Локација базе података је непозната, радња базе података се не може извршити. + Дошло је до грешке при извођењу радње у бази података. + Генерисана лозинка + Потврди лозинку + Није могуће препознати формат базе података. + Датотека кључа је празна. + Шифровање, функција извођења кључа + Копирај + Налепи + Избриши + Донирај + Измени + Безбедносне поставке + Запамтите хардверске кључеве + Води евиденцију о коришћеним хардверским кључевима + Прикажи недавне датотеке + Запамтите локације база података + Запамти локације датотека кључева + Прати где су датотеке кључева ускладиштене + Прати где се чувају базе података + Прикажи локације недавних база података + Коришћење меморије + Количина меморије коју ће користити функција извођења кључа. + Не убијајте апликацију… + Да би се генерисао кључ за алгоритам шифровања, главни кључ се трансформише коришћењем насумично слане функције извођења кључа. + Допринос + Прихвати + Шифрованје + Алгоритам шифрованја + Неактивно време пре заклјучаванја базе података + Функција за генерисанје клјуча + Време истека апликације + Заграде + Проширени АСЦИИ + За креиранје, отваранје и чуванје датотека базе података потребан је менаджер датотека који прихвата Интент акције ACTION_CREATE_DOCUMENT и ACTION_OPEN_DOCUMENT. + Дозволи + Грешка међуспремника + Време истека међуспремника + Трајанје похране у међуспремнику (ако је подржано од стране уређаја) + Отвори датотеку + Под-чвор + Додај чвор + Додај унос + Додај групу + Поље за потврду лозинке + Поље за потврду хардверског кључа + Понови промену видљивости лозинке + Улазна боја предњег плана + Заглавље за навигацију + Плоча навигације отворена + Боја позадине уноса + Плоча навигације затворена + Провера ваљаности + Одбаци измене? + Одбаци + Генератор лозинки + Број речи приступне фразе + Додај поље + Додај прилог + Обриши поље + Ажурирај + Обриши + Затвори поља + Изаберите како би сте копирали %1$s у међуспремник + Дохватање кључа базе података… + Чека се захтев за изазов… + Чека се одговор на изазов… + Предлошци + Дешифровање садржаја базе података… + KeePassDX © %1$d Kunzisoft је отвореног кода ине даржи рекламе.\nПонуђен је онакав какав јесте, под GPLv3 лиценцом, без икаквих гаранција. + Како бисмозадржали нашу слободу, исправљали грешке, додавали нове опције и увек били активни, рачунамо на Вашдопринос. + Напомене + Потврди лозинку + Истекло + Јединствени идентификатор корисника (UUID) + Историја + Хардверски кључ + Измењено + Осетљиво на велика и мала слова + Претраживо + Наследи + Аутоматски унос + Аутоматска секвенца уноса + Није могуће пронаћи податке о уносу. + Ознаке + Прилагођени подаци + Филтери за претрагу + Тренутна група + Регуларни израз + ЦВВ + ПИН + Лична карта + Датум издавања + Емаил + Адреса е-поште + Ви-Фи + ССИД + Новчаник за криптовалуте + Токен + Приватни кључ + Тајна фраза + Рачун + СВИФТ / БИЦ + ИБАН + Сигурна белешка + Стандардно + Шаблон + Верзија + ОТП + УРЛ + Арцхфоур шифровање није подржано. + Није могуће обрадити овај УРИ у кееПассДКС. + Није могуће креирати датотеку + Проверите да ли је путања исправна. + Унесите име. + Ова реч је резервисана и не може се користити. + Изаберите хардверски кључ. + ЏМЛ је погрешно обликован. + Није могуће учитати базу података. + Мора бити изабран најмање један тип генерисања лозинке. + Најмање један податак за пријаву мора бити унет. + Лозинке се не подударају. + Вредност трансформационих пролаза је превисока. Поставља се на 2147483648. + Свака ниска мора имати име поља. + Унесите позитиван цео број у поље \"Дужина\". + Овде не можете преместити групу. + Овде не можете преместити унос. + Овде не можете копирати унос. + Овде не можете копирати групу. + Није могуће креирати датотеку базе података. + Није могуће креирати базу података са датом лозинком и датотеком кључа. + Није могуће сачувати базу података. + Тајни кључ мора бити у Басе32 формату. + Број цифара токена мора бити у опсегу од %1$d до %2$d. + Овај текст се не подудара са траженим ставком. + Овај образац не препознаје постојећи тип ОТП-а, његова валидација можда више неће исправно генерисати токен. + Чување нових ставки није дозвољено у бази података која је само за читање + Име поља већ постоји. + УРИ базе података се не може преузети. + Није могуће правилно обновити листу. + Дошло је до грешке при отпремању података датотеке. + Подаци о фајлу већ постоје. + Дошло је до грешке при уклањању података из датотеке. + Изазов је већ захтеван + Одговор је већ дат. + Није могуће добити одговор на изазов. + Потребан је драјвер за %1$s. + Није могуће спојити са кдб датотеком базе података + Хардверски кључ није подржан. + Кључ не може бити празан. + Назив поља + Вредност поља + Није могуће пронаћи датотеку. Покушајте поново да је отворите из свог прегледача датотека. + Оштећена датотека. + Управљач датотекама + Генериши лозинку + Назив групе + Име иконе + Датотека кључа + Дугачка лозинка + Није могуће прочитати податке за пријављивање. + %1$s са истим УУИД %2$s већ постоји. + Сакриј лозинке + Подразумевај маскирање лозинки са (***) + Обојите лозинке + Обојите знакове лозинке по типу + Прикажи корисничка имена + Прикажи број уноса + Прикажи корисничка имена у листама уноса + Прикажи ОТП токен + Приказује ОТП токене на листи уноса + Прикажи УУИД + Приказује УУИД повезан са уносом или групом + Прикажи број уноса у групи + Величина ставки листе + Величина текста у листи елемената + Креирање базе података… + Учитавање базе података… + Мала слова + Промени главни кључ + Копија од %1$s + Поставке + Поставке апликације + Претрага, закључавање, историја, својства + Попуњавање обрасца + Тастатура, аутоматско попуњавање, клипборд + Напредно откључавање + Биометрија, акредитив уређаја + Поставке базе података + Метаподаци, корпа за отпатке, шаблони, историја + Поставке главног кључа + Промена, обнова + Премести + Откажи + Сакриј лозинку + Закључај базу података + Сачувај податке + Обједини податке + Поново учитај податке + Сједини из… + Сачувајте копију у… + Прикажи лозинку + Отвори + Тражи + Избришите кључ за откључавање уређаја + Иди на УРЛ адресу + Заштићено од уписивања + Измењиво + Испразни корпу за отпатке + Врати историју у претходно стање + Избриши историју + Вањска икона + Затражите претрагу приликом отварања базе података + Минус + Нема резултата претраге + Претрага поддомена + Претражујте веб домене са ограничењима поддомена + Инсталирајте веб прегледач да бисте отворили ову УРЛ адресу. + Отворите постојећи трезор + Направите нови трезор + Прављење нове базе података… + Рад у току … + Заштићено од писања + У зависности од вашег менаџера датотека, КееПассДЏ можда неће дозволити да уписује у вашу меморију. + База података садржи дуплиране УУИД-ове. + Решити проблем генерисањем нових УУИД-ова за наставак дупликата? + Режим претраге + Режим чувања + Режим избора + Режим регистрације + Сакриј неисправне везе базе података + Сакријте покварене везе на листи недавних база података + Увезите подешавања апликације + Изаберите датотеку за увоз подешавања апликације + Извезите подешавања апликације + Направите датотеку за извоз подешавања апликације + КееПассДЏ својства за управљање подешавањима апликације + Подешавања апликације су увезена + Грешка током увоза подешавања апликације + Подешавања апликације су извезена + Грешка током извоза подешавања апликације + Корен + Алгоритам шифровања базе података који се користи за све податке + Трансформациони кругови + Додатне рунде шифровања пружају већу заштиту од напада грубе силе, али заиста могу успорити учитавање и чување. + Паралелизам + Степен паралелизма (тј. број нити) који користи функција извођења кључа. + Чување базе података… + Извршавање команде… + Сортирај \ No newline at end of file From e36b18e85e28e5937dd50f2d80b5f30becf3f151 Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Thu, 17 Oct 2024 11:21:40 +0000 Subject: [PATCH 077/119] Translated using Weblate (Azerbaijani) Currently translated at 26.5% (175 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 4214d0a72..2e5352c50 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -191,4 +191,37 @@ Giriş Özəl Dəstəklənməyən məlumat bazas versiyası. + Birləşdirmə uğurla tamamlandı + Mübadilə buferi bildiriş funksiyası üçün bildiriş icazəsinə ehtiyyac var. + Sonra + Soruş + Kofiqurasiya et + Açar ehtiyyatı düzgün formada başladılmadı. + Cihaz kilidini açma linki + Tarixçə + Cihaz kilidini açma xətası: %1$s + Məlumat bazasını yenidən yükləmək lokal olaraq modifikasiya olunmuş faylları siləcəkdir. + Fayla giriş fayl meneceri tərəfindən ləğv edildi, məlumat bazasını bağlayın və onu olduğu yerdən yenidən açın. + Siz tətəbiqin zəngli saatdan istifadə etməsinə icazə verməmisiniz. Nəticədə, taymer tələb edən funksiyalar dəqiq bir zamanda işləməyəckdir. + Android, məlumatlarını anında dəyişdirə biləcəyindən heş faylı qaranti edilməyib. Doğru bütünlüyk üçün fayl əlavəsini .bin olaraq dəyişin. + İcazə + Versiya %1$s + Nüvə%1$s + Biometrik və ya cihaz şəxsiyyəti ilə doğrulama məlumatları tapılmadı. + Biometrik təhlükəsizlik yenilənməsi lazımdır. + Cihaz kilid açma linki + Cihaz kilidini tanıma + Şifrələnmiş şifrə ehtiyyata alındı + Cihaz kilidini açmaq üçün barmaq izi tanınmadı + Mövcud deyil + Şifrəni yazın və sonra bu düyməyə basın. + Xüsusiyyətlər + Görünüş + Tema, rəng və atributlar + Biometriya + Cihazın şəxsiyyət məlumatları + Ümumi + Avtomatik doldurma + KeePassDX avtomatik doldurma formu + KeePassDX ile giriş edin \ No newline at end of file From 1d6a9651bfce397c1052a760e9f58501f123d563 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sun, 20 Oct 2024 18:44:06 +0200 Subject: [PATCH 078/119] fix: upgrade to API34 #1894 --- CHANGELOG | 1 + .../keepass/activities/GroupActivity.kt | 74 +++++++-------- .../keepass/adapters/BreadcrumbAdapter.kt | 14 +-- .../kunzisoft/keepass/adapters/NodeFilter.kt | 31 +++++++ .../keepass/adapters/NodesAdapter.kt | 13 +-- .../keepass/settings/PreferencesUtil.kt | 6 ++ app/src/main/res/values/donottranslate.xml | 2 + app/src/main/res/values/strings.xml | 2 + .../main/res/xml/preferences_appearance.xml | 5 ++ .../keepass/database/element/Group.kt | 89 +++++-------------- .../keepass/database/search/SearchHelper.kt | 2 +- .../metadata/android/en-US/changelogs/132.txt | 3 +- 12 files changed, 124 insertions(+), 118 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt diff --git a/CHANGELOG b/CHANGELOG index 1b3445661..0c0687bfb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ KeePassDX(4.1.0) * Upgrade to API 34 (Android 14) + * Hide template group #1894 KeePassDX(4.0.8) * Fix graphical bug that prevented databases from being opened on some versions of Android #1848 #1850 diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index c0f65fb4d..3b2b3a9bf 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -358,43 +358,6 @@ class GroupActivity : DatabaseLockActivity(), searchFiltersView?.closeAdvancedFilters() - mBreadcrumbAdapter = BreadcrumbAdapter(this).apply { - // Open group on breadcrumb click - onItemClickListener = { node, _ -> - // If last item & not a virtual root group - val currentGroup = mMainGroup - if (currentGroup != null && node == currentGroup - && (currentGroup != mDatabase?.rootGroup - || mDatabase?.rootGroupIsVirtual == false) - ) { - finishNodeAction() - launchDialogToShowGroupInfo(currentGroup) - } else { - if (mGroupFragment?.nodeActionSelectionMode == true) { - finishNodeAction() - } - mDatabase?.let { database -> - onNodeClick(database, node) - } - } - } - onLongItemClickListener = { node, position -> - val currentGroup = mMainGroup - if (currentGroup != null && node == currentGroup - && (currentGroup != mDatabase?.rootGroup - || mDatabase?.rootGroupIsVirtual == false) - ) { - finishNodeAction() - launchDialogForGroupUpdate(currentGroup) - } else { - onItemClickListener?.invoke(node, position) - } - } - } - breadcrumbListView?.apply { - adapter = mBreadcrumbAdapter - } - // Retrieve group if defined at launch manageIntent(intent) @@ -616,6 +579,43 @@ class GroupActivity : DatabaseLockActivity(), override fun onDatabaseRetrieved(database: ContextualDatabase?) { super.onDatabaseRetrieved(database) + mBreadcrumbAdapter = BreadcrumbAdapter(this, database).apply { + // Open group on breadcrumb click + onItemClickListener = { node, _ -> + // If last item & not a virtual root group + val currentGroup = mMainGroup + if (currentGroup != null && node == currentGroup + && (currentGroup != mDatabase?.rootGroup + || mDatabase?.rootGroupIsVirtual == false) + ) { + finishNodeAction() + launchDialogToShowGroupInfo(currentGroup) + } else { + if (mGroupFragment?.nodeActionSelectionMode == true) { + finishNodeAction() + } + mDatabase?.let { database -> + onNodeClick(database, node) + } + } + } + onLongItemClickListener = { node, position -> + val currentGroup = mMainGroup + if (currentGroup != null && node == currentGroup + && (currentGroup != mDatabase?.rootGroup + || mDatabase?.rootGroupIsVirtual == false) + ) { + finishNodeAction() + launchDialogForGroupUpdate(currentGroup) + } else { + onItemClickListener?.invoke(node, position) + } + } + } + breadcrumbListView?.apply { + adapter = mBreadcrumbAdapter + } + mGroupEditViewModel.setGroupNamesNotAllowed(database?.groupNamesNotAllowed) mRecyclingBinEnabled = !mDatabaseReadOnly diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt index 6b0dafb2b..5a4fcfab5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt @@ -10,6 +10,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.Type @@ -17,7 +18,7 @@ import com.kunzisoft.keepass.icons.IconDrawableFactory import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.view.strikeOut -class BreadcrumbAdapter(val context: Context) +class BreadcrumbAdapter(val context: Context, val database: Database?) : RecyclerView.Adapter() { private val inflater: LayoutInflater = LayoutInflater.from(context) @@ -31,6 +32,8 @@ class BreadcrumbAdapter(val context: Context) var onItemClickListener: ((item: Node, position: Int)->Unit)? = null var onLongItemClickListener: ((item: Node, position: Int)->Unit)? = null + private var mNodeFilter: NodeFilter = NodeFilter(context, database) + private var mShowNumberEntries = false private var mShowUUID = false private var mIconColor: Int = 0 @@ -112,12 +115,9 @@ class BreadcrumbAdapter(val context: Context) holder.groupNumbersView?.apply { if (mShowNumberEntries) { - group.refreshNumberOfChildEntries( - Group.ChildFilter.getDefaults( - PreferencesUtil.showExpiredEntries(context) - ) - ) - text = group.recursiveNumberOfChildEntries.toString() + text = group.getNumberOfChildEntries { + mNodeFilter.getFilter(node) + }.toString() visibility = View.VISIBLE } else { visibility = View.GONE diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt new file mode 100644 index 000000000..d23255ea7 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt @@ -0,0 +1,31 @@ +package com.kunzisoft.keepass.adapters + +import android.content.Context +import com.kunzisoft.keepass.database.element.Database +import com.kunzisoft.keepass.database.element.Entry +import com.kunzisoft.keepass.database.element.Group +import com.kunzisoft.keepass.database.element.node.Node +import com.kunzisoft.keepass.settings.PreferencesUtil + +class NodeFilter( + context: Context, + var database: Database? = null +) { + private var showExpired = PreferencesUtil.showExpiredEntries(context) + private var showTemplate = PreferencesUtil.showTemplates(context) + + fun getFilter(node: Node): Boolean { + return (when (node) { + is Entry -> { + node.entryKDB?.isMetaStream() != true + && (showTemplate || database?.templatesGroup?.let { + template -> node.isContainedIn(template) + } != true) + } + is Group -> { + showTemplate || database?.templatesGroup != node + } + else -> true + }) && (showExpired || !node.isCurrentlyExpires) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt index fc47ca14f..9dae37cb9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt @@ -66,6 +66,7 @@ class NodesAdapter ( private val mNodeSortedListCallback: NodeSortedListCallback private val mNodeSortedList: SortedList private val mInflater: LayoutInflater = LayoutInflater.from(context) + private val mNodeFilter: NodeFilter = NodeFilter(context, database) private var mCalculateViewTypeTextSize = Array(2) { true } // number of view type private var mTextSizeUnit: Int = TypedValue.COMPLEX_UNIT_PX @@ -82,7 +83,7 @@ class NodesAdapter ( private var mShowNumberEntries: Boolean = true private var mShowOTP: Boolean = false private var mShowUUID: Boolean = false - private var mEntryFilters = arrayOf() + private var mNodeFilters: NodeFilter? = null private var mOldVirtualGroup = false private var mVirtualGroup = false @@ -161,9 +162,7 @@ class NodesAdapter ( this.mShowOTP = PreferencesUtil.showOTPToken(context) this.mShowUUID = PreferencesUtil.showUUID(context) - this.mEntryFilters = Group.ChildFilter.getDefaults( - PreferencesUtil.showExpiredEntries(context) - ) + this.mNodeFilters = NodeFilter(context, database) // Reinit textSize for all view type mCalculateViewTypeTextSize.forEachIndexed { index, _ -> mCalculateViewTypeTextSize[index] = true } @@ -176,7 +175,9 @@ class NodesAdapter ( mOldVirtualGroup = mVirtualGroup mVirtualGroup = group.isVirtual assignPreferences() - mNodeSortedList.replaceAll(group.getFilteredChildren(mEntryFilters)) + mNodeSortedList.replaceAll(group.getChildren { node -> + mNodeFilters?.getFilter(node) ?: true + }) } private inner class NodeSortedListCallback: SortedListAdapterCallback(this) { @@ -473,7 +474,7 @@ class NodesAdapter ( if (mShowNumberEntries) { holder.numberChildren?.apply { text = (subNode as Group) - .recursiveNumberOfChildEntries + .getNumberOfChildEntries { mNodeFilter.getFilter(subNode) } .toString() setTextSize(mTextSizeUnit, mNumberChildrenTextDefaultDimension, mPrefSizeMultiplier) visibility = View.VISIBLE diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt index 7d3367341..33203dfa2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt @@ -162,6 +162,12 @@ object PreferencesUtil { context.resources.getBoolean(R.bool.hide_expired_entries_default)) } + fun showTemplates(context: Context): Boolean { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + return ! prefs.getBoolean(context.getString(R.string.hide_templates_key), + context.resources.getBoolean(R.bool.hide_templates_default)) + } + fun getStyle(context: Context): String { val defaultStyleString = Stylish.defaultStyle(context) val styleString = PreferenceManager.getDefaultSharedPreferences(context) diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index c04db498b..a16437539 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -203,6 +203,8 @@ true hide_expired_entries_key false + hide_templates_key + true enable_education_screens_key true relaunch_education_screens_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f4befb9e5..f9575b3b6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -733,4 +733,6 @@ Displays foreground and background colors for an entry Hide expired entries Expired entries are not shown + Hide templates + Templates are not shown \ No newline at end of file diff --git a/app/src/main/res/xml/preferences_appearance.xml b/app/src/main/res/xml/preferences_appearance.xml index d7610d6c2..d56f42318 100644 --- a/app/src/main/res/xml/preferences_appearance.xml +++ b/app/src/main/res/xml/preferences_appearance.xml @@ -111,6 +111,11 @@ android:title="@string/hide_expired_entries_title" android:summary="@string/hide_expired_entries_summary" android:defaultValue="@bool/hide_expired_entries_default"/> + { @@ -45,8 +48,11 @@ class Group : Node, GroupVersionedInterface { // Virtual group is used to defined a detached database group var isVirtual = false + // To optimize number of children call var numberOfChildEntries: Int = 0 + private set var recursiveNumberOfChildEntries: Int = 0 + private set /** * Use this constructor to copy a Group @@ -84,20 +90,6 @@ class Group : Node, GroupVersionedInterface { isVirtual = parcel.readBooleanCompat() } - enum class ChildFilter { - META_STREAM, EXPIRED; - - companion object { - fun getDefaults(showExpiredEntries: Boolean): Array { - return if (showExpiredEntries) { - arrayOf(META_STREAM) - } else { - arrayOf(META_STREAM, EXPIRED) - } - } - } - } - companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): Group { return Group(parcel) @@ -280,20 +272,6 @@ class Group : Node, GroupVersionedInterface { ArrayList() } - fun getFilteredChildGroups(filters: Array): List { - return groupKDB?.getChildGroups()?.map { - Group(it).apply { - this.refreshNumberOfChildEntries(filters) - } - } ?: - groupKDBX?.getChildGroups()?.map { - Group(it).apply { - this.refreshNumberOfChildEntries(filters) - } - } ?: - ArrayList() - } - override fun getChildEntries(): List { return groupKDB?.getChildEntries()?.map { Entry(it) @@ -312,53 +290,32 @@ class Group : Node, GroupVersionedInterface { return entriesInfo } - fun getFilteredChildEntries(filters: Array): List { - val withoutMetaStream = filters.contains(ChildFilter.META_STREAM) - val showExpiredEntries = !filters.contains(ChildFilter.EXPIRED) - - // TODO Change KDB parser to remove meta entries - return groupKDB?.getChildEntries()?.filter { - (!withoutMetaStream || (withoutMetaStream && !it.isMetaStream())) - && (!it.isCurrentlyExpires or showExpiredEntries) - }?.map { - Entry(it) - } ?: - groupKDBX?.getChildEntries()?.filter { - !it.isCurrentlyExpires or showExpiredEntries - }?.map { - Entry(it) - } ?: - ArrayList() - } - - fun refreshNumberOfChildEntries(filters: Array = emptyArray()) { - this.numberOfChildEntries = getFilteredChildEntries(filters).size - this.recursiveNumberOfChildEntries = getFilteredChildEntriesInGroups(filters) - } - /** * @return the cumulative number of entries in the current group and its children */ - private fun getFilteredChildEntriesInGroups(filters: Array): Int { + private fun getNumberOfChildEntriesInGroups(filter: (Node) -> Boolean): Int { var counter = 0 getChildGroups().forEach { childGroup -> - counter += childGroup.getFilteredChildEntriesInGroups(filters) + counter += childGroup.getNumberOfChildEntriesInGroups(filter) } - return getFilteredChildEntries(filters).size + counter + return getChildEntries().filter(filter).size + counter + } + + fun getNumberOfChildEntries( + directChildren: Boolean = true, + filter: (Node) -> Boolean = { true } + ): Int { + numberOfChildEntries = getChildEntries().filter(filter).size + recursiveNumberOfChildEntries = getNumberOfChildEntriesInGroups(filter) + return if (directChildren) numberOfChildEntries else recursiveNumberOfChildEntries } /** * Filter entries and return children * @return List of direct children (one level below) as NodeVersioned */ - fun getChildren(): List { - return getChildGroups() + getChildEntries() - } - - fun getFilteredChildren(filters: Array): List { - val nodes = getFilteredChildGroups(filters) + getFilteredChildEntries(filters) - refreshNumberOfChildEntries(filters) - return nodes + fun getChildren(filter: ((Node) -> Boolean) = { true }): List { + return getChildGroups().filter(filter) + getChildEntries().filter(filter) } override fun addChildGroup(group: Group) { diff --git a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt index 01d8b8e52..7bb10be08 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt @@ -78,7 +78,7 @@ class SearchHelper { ) } - searchGroup?.refreshNumberOfChildEntries() + searchGroup?.getNumberOfChildEntries() return searchGroup } diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index dad2ff6c8..e7b913ee3 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -1 +1,2 @@ - * Upgrade to API 34 (Android 14) \ No newline at end of file + * Upgrade to API 34 (Android 14) + * Hide template group #1894 \ No newline at end of file From 0312b504a988292e3a5b559cbad54352fe0860c5 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sun, 20 Oct 2024 18:51:28 +0200 Subject: [PATCH 079/119] fix: upgrade CHANGELOG --- CHANGELOG | 4 +++- fastlane/metadata/android/en-US/changelogs/132.txt | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0c0687bfb..3584c33f8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ KeePassDX(4.1.0) - * Upgrade to API 34 (Android 14) + * Upgrade to API 34 (Android 14) #1730 + * Generate keyfile #1290 * Hide template group #1894 + * Small fixes #1711 #1831 #1780 #1821 #1863 KeePassDX(4.0.8) * Fix graphical bug that prevented databases from being opened on some versions of Android #1848 #1850 diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index e7b913ee3..71a56cd3c 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -1,2 +1,4 @@ - * Upgrade to API 34 (Android 14) - * Hide template group #1894 \ No newline at end of file + * Upgrade to API 34 (Android 14) #1730 + * Generate keyfile #1290 + * Hide template group #1894 + * Small fixes #1711 #1831 #1780 #1821 #1863 \ No newline at end of file From 9fb47544304fb1feaa99eea57d32c6c892998106 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sun, 20 Oct 2024 21:15:21 +0200 Subject: [PATCH 080/119] feat: Number of children #421 --- CHANGELOG | 1 + .../keepass/adapters/BreadcrumbAdapter.kt | 2 +- .../kunzisoft/keepass/adapters/NodeFilter.kt | 5 ++- .../keepass/adapters/NodesAdapter.kt | 4 ++- .../settings/NestedAppSettingsFragment.kt | 4 ++- .../keepass/settings/PreferencesUtil.kt | 34 ++++++++++++------- app/src/main/res/values/donottranslate.xml | 10 +++--- app/src/main/res/values/strings.xml | 5 ++- .../main/res/xml/preferences_appearance.xml | 32 +++++++++++------ .../keepass/database/element/Group.kt | 6 ++-- .../metadata/android/en-US/changelogs/132.txt | 1 + .../metadata/android/fr-FR/changelogs/132.txt | 6 +++- 12 files changed, 72 insertions(+), 38 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 3584c33f8..f31235e67 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ KeePassDX(4.1.0) * Upgrade to API 34 (Android 14) #1730 * Generate keyfile #1290 * Hide template group #1894 + * Group count sum recursively #421 * Small fixes #1711 #1831 #1780 #1821 #1863 KeePassDX(4.0.8) diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt index 5a4fcfab5..ad07047b5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt @@ -115,7 +115,7 @@ class BreadcrumbAdapter(val context: Context, val database: Database?) holder.groupNumbersView?.apply { if (mShowNumberEntries) { - text = group.getNumberOfChildEntries { + text = group.getNumberOfChildEntries(mNodeFilter.recursiveNumberOfEntries) { mNodeFilter.getFilter(node) }.toString() visibility = View.VISIBLE diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt index d23255ea7..b98f44a80 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt @@ -11,6 +11,8 @@ class NodeFilter( context: Context, var database: Database? = null ) { + var recursiveNumberOfEntries = PreferencesUtil.recursiveNumberEntries(context) + private set private var showExpired = PreferencesUtil.showExpiredEntries(context) private var showTemplate = PreferencesUtil.showTemplates(context) @@ -18,9 +20,6 @@ class NodeFilter( return (when (node) { is Entry -> { node.entryKDB?.isMetaStream() != true - && (showTemplate || database?.templatesGroup?.let { - template -> node.isContainedIn(template) - } != true) } is Group -> { showTemplate || database?.templatesGroup != node diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt index 9dae37cb9..de097797d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt @@ -474,7 +474,9 @@ class NodesAdapter ( if (mShowNumberEntries) { holder.numberChildren?.apply { text = (subNode as Group) - .getNumberOfChildEntries { mNodeFilter.getFilter(subNode) } + .getNumberOfChildEntries(mNodeFilter.recursiveNumberOfEntries) { + mNodeFilter.getFilter(subNode) + } .toString() setTextSize(mTextSizeUnit, mNumberChildrenTextDefaultDimension, mPrefSizeMultiplier) visibility = View.VISIBLE diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt index de10ccbdb..88f24cffd 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt @@ -483,13 +483,15 @@ class NestedAppSettingsFragment : NestedSettingsFragment() { getString(R.string.setting_style_brightness_key), getString(R.string.setting_icon_pack_choose_key), getString(R.string.show_entry_colors_key), + getString(R.string.hide_expired_entries_key), + getString(R.string.hide_templates_key), getString(R.string.list_entries_show_username_key), getString(R.string.list_groups_show_number_entries_key), + getString(R.string.recursive_number_entries_key), getString(R.string.show_otp_token_key), getString(R.string.show_uuid_key), getString(R.string.list_size_key), getString(R.string.monospace_font_fields_enable_key), - getString(R.string.hide_expired_entries_key), getString(R.string.enable_education_screens_key), getString(R.string.reset_education_screens_key) -> { DATABASE_PREFERENCE_CHANGED = true diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt index 33203dfa2..765278227 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt @@ -120,6 +120,18 @@ object PreferencesUtil { context.resources.getBoolean(R.bool.show_entry_colors_default)) } + fun showExpiredEntries(context: Context): Boolean { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + return ! prefs.getBoolean(context.getString(R.string.hide_expired_entries_key), + context.resources.getBoolean(R.bool.hide_expired_entries_default)) + } + + fun showTemplates(context: Context): Boolean { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + return ! prefs.getBoolean(context.getString(R.string.hide_templates_key), + context.resources.getBoolean(R.bool.hide_templates_default)) + } + fun hideProtectedValue(context: Context): Boolean { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getBoolean(context.getString(R.string.hide_password_key), @@ -144,6 +156,12 @@ object PreferencesUtil { context.resources.getBoolean(R.bool.list_groups_show_number_entries_default)) } + fun recursiveNumberEntries(context: Context): Boolean { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + return prefs.getBoolean(context.getString(R.string.recursive_number_entries_key), + context.resources.getBoolean(R.bool.recursive_number_entries_default)) + } + fun showOTPToken(context: Context): Boolean { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getBoolean(context.getString(R.string.show_otp_token_key), @@ -156,18 +174,6 @@ object PreferencesUtil { context.resources.getBoolean(R.bool.show_uuid_default)) } - fun showExpiredEntries(context: Context): Boolean { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return ! prefs.getBoolean(context.getString(R.string.hide_expired_entries_key), - context.resources.getBoolean(R.bool.hide_expired_entries_default)) - } - - fun showTemplates(context: Context): Boolean { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return ! prefs.getBoolean(context.getString(R.string.hide_templates_key), - context.resources.getBoolean(R.bool.hide_templates_default)) - } - fun getStyle(context: Context): String { val defaultStyleString = Stylish.defaultStyle(context) val styleString = PreferenceManager.getDefaultSharedPreferences(context) @@ -847,15 +853,17 @@ object PreferencesUtil { context.getString(R.string.setting_style_brightness_key) -> editor.putString(name, value) context.getString(R.string.setting_icon_pack_choose_key) -> editor.putString(name, value) context.getString(R.string.show_entry_colors_key) -> editor.putBoolean(name, value.toBoolean()) + context.getString(R.string.hide_expired_entries_key) -> editor.putBoolean(name, value.toBoolean()) + context.getString(R.string.hide_templates_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.hide_password_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.colorize_password_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.list_entries_show_username_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.list_groups_show_number_entries_key) -> editor.putBoolean(name, value.toBoolean()) + context.getString(R.string.recursive_number_entries_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.show_otp_token_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.show_uuid_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.list_size_key) -> editor.putString(name, value) context.getString(R.string.monospace_font_fields_enable_key) -> editor.putBoolean(name, value.toBoolean()) - context.getString(R.string.hide_expired_entries_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.enable_education_screens_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.password_generator_length_key) -> editor.putInt(name, value.toInt()) diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index a16437539..3b25d74b1 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -186,6 +186,10 @@ setting_icon_pack_choose_key show_entry_colors_key true + hide_expired_entries_key + false + hide_templates_key + true hide_password_key true colorize_password_key @@ -194,6 +198,8 @@ true list_groups_show_number_entries_key true + recursive_number_entries_key + true show_otp_token_key true show_uuid_key @@ -201,10 +207,6 @@ list_size_key monospace_font_extra_fields_enable_key true - hide_expired_entries_key - false - hide_templates_key - true enable_education_screens_key true relaunch_education_screens_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9575b3b6..f0510f5a6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -232,6 +232,7 @@ Could not recognize the database format. The keyfile is empty. Length + Nodes Hide passwords Mask passwords (***) by default Colorize passwords @@ -239,11 +240,13 @@ Show usernames Displays usernames in entry lists Show number of entries + Displays the number of entries in a group + Recursive number of entries + Recursively calculates the number of entries in a group Show OTP Token Displays OTP tokens in the list of entries Show UUID Displays the UUID linked to an entry or a group - Displays the number of entries in a group Size of list items Text size in the element list Creating database… diff --git a/app/src/main/res/xml/preferences_appearance.xml b/app/src/main/res/xml/preferences_appearance.xml index d56f42318..732308118 100644 --- a/app/src/main/res/xml/preferences_appearance.xml +++ b/app/src/main/res/xml/preferences_appearance.xml @@ -48,6 +48,22 @@ + + + + + + + @@ -77,6 +93,12 @@ android:title="@string/list_groups_show_number_entries_title" android:summary="@string/list_groups_show_number_entries_summary" android:defaultValue="@bool/list_groups_show_number_entries_default"/> + - - { */ private fun getNumberOfChildEntriesInGroups(filter: (Node) -> Boolean): Int { var counter = 0 - getChildGroups().forEach { childGroup -> + getChildGroups().filter(filter).forEach { childGroup -> counter += childGroup.getNumberOfChildEntriesInGroups(filter) } return getChildEntries().filter(filter).size + counter } fun getNumberOfChildEntries( - directChildren: Boolean = true, + recursive: Boolean = false, filter: (Node) -> Boolean = { true } ): Int { numberOfChildEntries = getChildEntries().filter(filter).size recursiveNumberOfChildEntries = getNumberOfChildEntriesInGroups(filter) - return if (directChildren) numberOfChildEntries else recursiveNumberOfChildEntries + return if (recursive) recursiveNumberOfChildEntries else numberOfChildEntries } /** diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index 71a56cd3c..612bdb6f8 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -1,4 +1,5 @@ * Upgrade to API 34 (Android 14) #1730 * Generate keyfile #1290 * Hide template group #1894 + * Group count sum recursively #421 * Small fixes #1711 #1831 #1780 #1821 #1863 \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/132.txt b/fastlane/metadata/android/fr-FR/changelogs/132.txt index 55a28801c..c06e4f937 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/132.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/132.txt @@ -1 +1,5 @@ - * Mise à jour vers API 34 (Android 14) \ No newline at end of file + * Mise à jour vers API 34 (Android 14) + * Génération de fichier de clé #1290 + * Cacher les groupes de modèles #1894 + * Somme de comptage de groupes de manière récursive #421 + * Petites corrections #1711 #1831 #1780 #1821 #1863 \ No newline at end of file From 75cf6e2a56498cef8c90e43c384c20ae16c3e745 Mon Sep 17 00:00:00 2001 From: Celeste Liu Date: Sun, 20 Oct 2024 19:24:51 +0000 Subject: [PATCH 081/119] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hant/ --- app/src/main/res/values-zh-rTW/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 83d5a9872..23ffef972 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -655,7 +655,7 @@ 已請求Challenge 無法從Challenge得到回應。 需要 %1$s 驅動程式。 - 無法從資料庫V1合井。 + 無法與資料庫檔案合井 按類型為密碼字元上色 搜尋、鎖定、紀錄、屬性 鍵盤、自動填入、剪貼簿 @@ -695,4 +695,5 @@ \n如果不啟用此權限,當其他應用程式在前台運作時,您将无法在通知欄中查看背景運行的資料庫。
裝置解鎖連線 驗證條目 + 以最新的變動重新載入資料庫。 \ No newline at end of file From 0382c05152ee033e4605f62385e0006f0c29cf22 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 21 Oct 2024 19:54:47 +0200 Subject: [PATCH 082/119] fix: Filters --- .../kunzisoft/keepass/adapters/BreadcrumbAdapter.kt | 7 ++++--- .../java/com/kunzisoft/keepass/adapters/NodeFilter.kt | 6 +++--- .../com/kunzisoft/keepass/adapters/NodesAdapter.kt | 11 +++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt index ad07047b5..e42542e17 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt @@ -115,9 +115,10 @@ class BreadcrumbAdapter(val context: Context, val database: Database?) holder.groupNumbersView?.apply { if (mShowNumberEntries) { - text = group.getNumberOfChildEntries(mNodeFilter.recursiveNumberOfEntries) { - mNodeFilter.getFilter(node) - }.toString() + text = group.getNumberOfChildEntries( + mNodeFilter.recursiveNumberOfEntries, + mNodeFilter.filter + ).toString() visibility = View.VISIBLE } else { visibility = View.GONE diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt index b98f44a80..7b840f760 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeFilter.kt @@ -16,8 +16,8 @@ class NodeFilter( private var showExpired = PreferencesUtil.showExpiredEntries(context) private var showTemplate = PreferencesUtil.showTemplates(context) - fun getFilter(node: Node): Boolean { - return (when (node) { + val filter: (Node) -> Boolean = { node -> + when (node) { is Entry -> { node.entryKDB?.isMetaStream() != true } @@ -25,6 +25,6 @@ class NodeFilter( showTemplate || database?.templatesGroup != node } else -> true - }) && (showExpired || !node.isCurrentlyExpires) + } && (showExpired || !node.isCurrentlyExpires) } } \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt index de097797d..56d89c90b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt @@ -175,9 +175,7 @@ class NodesAdapter ( mOldVirtualGroup = mVirtualGroup mVirtualGroup = group.isVirtual assignPreferences() - mNodeSortedList.replaceAll(group.getChildren { node -> - mNodeFilters?.getFilter(node) ?: true - }) + mNodeSortedList.replaceAll(group.getChildren(mNodeFilter.filter)) } private inner class NodeSortedListCallback: SortedListAdapterCallback(this) { @@ -474,9 +472,10 @@ class NodesAdapter ( if (mShowNumberEntries) { holder.numberChildren?.apply { text = (subNode as Group) - .getNumberOfChildEntries(mNodeFilter.recursiveNumberOfEntries) { - mNodeFilter.getFilter(subNode) - } + .getNumberOfChildEntries( + mNodeFilter.recursiveNumberOfEntries, + mNodeFilter.filter + ) .toString() setTextSize(mTextSizeUnit, mNumberChildrenTextDefaultDimension, mPrefSizeMultiplier) visibility = View.VISIBLE From c09e8196f3ba475205f4484fdf4d99b2b3fdbb7b Mon Sep 17 00:00:00 2001 From: shinebrillant Date: Mon, 21 Oct 2024 15:14:19 +0000 Subject: [PATCH 083/119] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hant/ --- app/src/main/res/values-zh-rTW/strings.xml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 23ffef972..67425dd1b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -372,7 +372,7 @@ 切換回 鎖定資料庫後自動返回前一個鍵盤 鎖定資料庫 - 將 URL 分享到 KeePassDX 後,當選好條目時,將嘗試記住該條目以備日後使用 + 於 KeePassDX 手動選擇條目後,嘗試記住分享標的以供日後使用 保存分享的訊息 在 KeePass DX 中查看條目時,同時把該條目填充到 Magikeyboard 條目選擇 @@ -448,7 +448,7 @@ 欄位字型 姓名 從不 - 當前資料庫無密碼。 + 當前資料庫無密碼 沒有搜尋結果 沒有這個連結的處理程式。 通知 @@ -616,10 +616,7 @@ 可搜索 繼承 已經有一個資料庫打開了,先關閉它,才可以打開新的資料庫 - 此功能會將加密的身份驗證數據儲存在設備裏安全存儲 KeyStore 中。 -\n -\n基於操作系統的原始 API 實現,Keystore 有可能無法發揮其應有的作用。 -\n請向設備的製造商和 ROM 的創建者咨詢 KeyStore 的兼容性和安全性。 + 此功能會將加密的身份驗證數據儲存在設備裏安全存儲 KeyStore 中。\n\n基於操作系統的原始 API 實現,Keystore 有可能無法發揮其應有的作用。\n\n請向設備的製造商和 ROM 的創建者咨詢 KeyStore 的兼容性和安全性。 密碼短句字數 密碼短句 以顏色標示密碼 @@ -649,14 +646,14 @@ 自動填入 資訊 不收集用戶資料。,此應用程式不連接任何伺服器,僅在裝置上運作,而且完全尊重用戶私穩。 - 正等待Challenge請求…… + 正等待開發請求…… 正等待Challenge回應…… XML格式錯誤。 已請求Challenge 無法從Challenge得到回應。 需要 %1$s 驅動程式。 無法與資料庫檔案合井 - 按類型為密碼字元上色 + 以色彩分類各密碼字元 搜尋、鎖定、紀錄、屬性 鍵盤、自動填入、剪貼簿 生物特徵、裝置憑證 @@ -680,7 +677,7 @@ \n如果自動鎖定已啓用,而你又忘記你在更改資料,你可能會失去你的資料。 Forest Divine - Simple + 簡單 Moon Sun Kunzite @@ -688,7 +685,7 @@ 淺色 黑暗 Classic - Reply + 回覆 追蹤使用的硬體密鑰 通知權限讓您在資料庫運作於背景時,透過通知欄查看其狀態並使用方便的按鈕將其鎖住。 \n From 70a01e559d476e51f0be429436032b591e1c3f35 Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Mon, 21 Oct 2024 19:06:14 +0000 Subject: [PATCH 084/119] Translated using Weblate (Azerbaijani) Currently translated at 36.8% (243 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 88 ++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 2e5352c50..96c509dea 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -224,4 +224,92 @@ Avtomatik doldurma KeePassDX avtomatik doldurma formu KeePassDX ile giriş edin + Xüsusi bölmələr əlavə edin + Qoşma əlavə edin + Məlumat bazasını daha asan açmaq üçün cihazın kilid açma funksiyasından istifadə edin + Məlumat bazasını açmaq üçün cihaz şəxsiyyət məlumatlarından istifadə etməyə imkan verir + Önəmli xarici məlumatları yadda saxlamaq üçün şifrənizə (qeyd) qoşma əlavə edin. + Müvəqqəti kilid açma + Cihaz kilid açma müddəti bitdi + Bu cihazda Andoird %1$s versiyası var, lakin %2$svə ya daha sonrakı versiya lazımdır. + Yol + Lazımi qurğu-təchizat tapılmadı. + Maksimum həcm + Şablonlar qrupu + Maskimum sayı + Hər şifrəyə görə tarixçə həcmini limitlə + Ana açarın dəyişdirilməsini tövsiyə et (gün) + Yeniləməyə məcbur et + Bir sonrakı səfərə yeniləməyə məcbur et + Ana açarın dəyişdirilməsini tələb et (gün) + Bir sonrakı səfərə ana açarın dəyişdirilməsini tələb et (tək səfərlik) + Qeyd mövcud olanda bildirişi göstər + %1$s + Görünüş + Klaviatura teması + Klaviaturanı dəyişdir + Açarlar + Düyməyə toxunduqda səs çıxar + Məlumat bazasının şifrəsini açmaq üçün şifrə və\\və ya açar faylı daxil edin.\n\nMəlumat bazası faylını hər dəfə dəyişəndən sonra etibarlı bir yerdə ehtiyatda nüsxələyin. + Biometrik kilid açma + Məlumat bazasını açmaq üçün biometrikləri skan etməyə imkan verir + Cihaz şəxsiyyət məlumatları ilə kilid açma + Avtomatik açma istəyi + Məlumat bazası ondan istifadə ediləcək şəkildə quraşdırılıbsa, cihaz kilidini avtomatik olaraq tələb et + Cihaz kilidini açmaq üçün hər hansısa şifrələnmiş məzmunu saxlamayın + Şifrələnmiş açarları silin + Bu funksiya işləmədi + Fayl adı + Ana açar təyin edin + Məlumat + Məlumat sıxışdırma + Məlumat sıxışdırma məlumat bazasının həcmini azaldır + Əlaqəsiz məlumatları sil + Zibil qutusu istifadəsi + Qrup və qeydləri (şifrə) silməzdən öncə \"Zibil qutusuna\" köçür + Zibil qutusu qrupu + Şablonlardan istifadə + Şifrə məlumatlarındakı xanaları doldurmaq üçün dinamik şablonlardan istifadə edin + Yeniləməyi tövsiyə et + Şifrələrin və qorunan məlumatların mübadilə buferinə nüsxələnməsinə icazə ver + Xəbərdarlıq: Mübadilə buferi bütün tətbiqlər tərəfindən istifadə olunur. Əgər həssas məlumatlar nüsxələnibsə, digər tətbiqlər onu bərpa edə bilər. + Aktiv et + Deaktiv et + Bildiriş + Tətbiqi bağlayarkən sil + Məlumat bazasının adı + Məlumat bazasının açıqlaması + Standart (susmaya görə) istifadəçi adı + Xüsusi məlumat bazası rəngi + Məlumat bazası versiyası + Mətn + İnterfeys + Digər + Sıxışdırma + Heç biri + Gzip + Zibil qutusu + Şablonlar + Klaviatura + Magikeyboard + Cihaz klaviatura parametrləri + Magikeyboard + Magikeyboard (KeePassDX) + Magikeyboard parametrləri + Qeyd + Qeyd seçimi + Bildiriş məlumatı + Paylaşılan məlumatları yadda saxla + Tətbiqi bağlayarkən sil + Bildirişi bağlayarkən məlumat bazasını bağla + taymaut + Qeyd (şifrə) + %1$sMagikeyboard-da istifadə edilə bilər + Düyməyə toxunduqda titrət + Birdəfəlik şifrə (OTP) təyin edin + Məlaumat bazasının şifrəsini açın + Məlumat bazasını dəyişiklik edilməsinə qarşı qoruyun + Bölməni nüsxələyin + Nüsxələnmiş bölmələr istənilən yerə köçürülə bilər.\n\nÜntünlük verdiyiniz form doldurma metodunu seçin. + Məlumat bazasını kilidləyin \ No newline at end of file From 36b9fa23870a50586c9d05a5b6af3b8ac5529694 Mon Sep 17 00:00:00 2001 From: ginger-co Date: Sat, 26 Oct 2024 09:25:38 +0000 Subject: [PATCH 085/119] Translated using Weblate (Hebrew) Currently translated at 70.4% (464 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/ --- app/src/main/res/values-iw/strings.xml | 179 ++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 291a6ef23..5680c274b 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -43,7 +43,7 @@ מפענח תוכן מסד נתונים… השתמש כמסד נתונים ברירת מחדל ספרות - פתח מסד נתונים קיים + פתח כספת קיימת ניגש לאחרונה בטל הערות @@ -112,10 +112,10 @@ צור מסד נתונים חדש… עובד… הגנה - ל-KeePassDX אין הרשאות כתיבה למסד הנתונים הזה, ולכן הוא יפתח לקריאה בלבד. + תלוי במנהל הקבצים שלך, KeePassDx עלול לא להיות מורשה לכתוב לאחסון שלך. הסר - סיבובי הצפנה - מספר סיבובי הצפנה גבוה יותר מספר הגה טובה יותר נגד התקפות, אבל יכול להעלות בהרבה את זמן הטעינה והשמירה. + סבבי טרנספורמציה + מספר סיבובי הצפנה גבוה יותר מספק הגנה טובה יותר נגד התקפות אלימות, אבל יכול להאט את זמן הטעינה והשמירה. שומר מסד נתונים… גודל סדר מיון מסד נתונים @@ -204,7 +204,7 @@ בוטל על ידי המשתמש. נדרש מנהל התקן עבור %1$s. מיקום מסד הנתונים אינו ידוע, לא ניתן לבצע פעולת מסד נתונים. - לא ניתן למזג ממסד נתונים V1. + לא ניתן למזג עם קובץ מסד נתונים kdb מפתח פיזי אינו נתמך. המפתח לא יכול להיות ריק. לא ניתן למצוא את הקובץ. נסה לפתוח אותו מחדש מסייר הקבצים שלך. @@ -311,9 +311,9 @@ הדבק בטל העתק - צור מסד נתונים חדש + צור כספת חדשה חיפוש תת-דומיין - מחק מפתח ביטול נעילה מתקדם + מחק מפתח ביטול נעילה %1$s עם אותו UUID %2$s כבר קיים. שינוי, חידוש מידע @@ -324,4 +324,169 @@ מצב שמירה מצב בחירה חיפוש, לנעול, היסטוריה, מאפיינים + שימוש בזיכרון + מיון + יצירה + נעל את מסד הנתונים + חיפוש + גודל מירבי + המלץ על חידוש + דרוש שינוי מפתח ראשי בפעם הבאה (פעם אחת) + אזהרה: לוח ההעתקה משותף לכל היישומים. אם מידע רגיש יועתק, תוכנות אחרות יוכלו לקרוא אותו. + הפסק + Magikeyboard (KeePassDX) + מוגן מכתיבה + נקה בסגירה + רשומה + %1$s זמין ב־Magikeyboard + %1$s + סגור את מסד הנתונים כאשר נסגרת ההתראה + לחיצות מקשים נשמעות + איפוס רמזי לימוד + לערוך את הרשומה + ייצר סיסמה חזקה + תודה רבה על תרומתך. + זכור לשמור על היישום מעודכן ע\"י התקנת גירסאות חדשות. + אנו עובדים קשה כדי לשחרר את התכונה הזאת במהירות. + מאתחל… + זכור היכן ממוקמים מסדי הנתונים + זכור מיקומי ה־keyfile + מריץ את הפקודה… + התראות לוח העתקה + העתק שדות רשומה בעזרת לוח ההעתקה של המכשיר שלך + הגבל את גודל ההיסטוריה לכל רשומה + פתיחת נעילת מכשיר + גירסת מסד הנתונים + פתח את קובץ מסד הנתונים הקודם ממנהל הקבצים שלך כדי להמשיך להשתמש בו. + הוסף פריטים למסד הנתונים שלך + רשומות עוזרות לנהל את היישויות הדיגיטליות שלך.\n\nקבוצות (~תיקיות) מארגנות את הרשומות במסד הנתונים שלך. + הכנס כותרת, שם משתמש או תוכן של שדות אחרים כדי לאחזר את הסיסמאות שלך. + הורדה + הורד %1$s + חבילת אייקונים בשימוש ביישום זה + ערכת נושא של המקלדת + אזהרה + מסד הנתונים מכיל UUIDs כפולים. + נעילה + שם מסד הנתונים + תרומה + כמות הזיכרון לשימוש ע\"י key derivation function. + ייצור קובץ מסד הנתונים שלך + ביומטרי, נתוני אימות מכשיר + מטאדאטה, סל מיחזור, תבניות, היסטוריה + גישה + מילוי אוטומטי של טפסי KeePassDX + בצפייה בערך רשום, הצג התראות לוח העתקה על מנת להעתיק שדות + הקצה סיסמת על + על מנת להמשיך, האם לפתור את הבעיה על ידי יצירת UUID חדש עבור הכפילויות? + עקוב אחר מקומות האחסון של keyfiles + הראה קבצים אחרונים + מקור + התאמה (Parallelism) + רמת ההתאמה (Parallelism) בשימוש ע\"י key derivation function (כמות שרשורים). + מראה + נקה בסגירה + על מנת לייצר את הפמפתח לאלגוריתם ההצפנה, המפתח הראשי מוחלף בעזרת salted key derivation function. + אחר + מיון פריטים + בחר כיצד רשומות וקבוצות ממויינות. + לעומת יישומי ניהול סיסמאות אחרים, היישום הזה <strong>נטול פרסומות,</strong>copylefted libre software</strong> ולא אוסף מידע פרטי בשרתים שלו, לא משנה באיזו גירסה. + הפעל + Gzip + שמירה אוטומטית של מסד הנתונים + שמור את מסד הנתונים אחרי כל פעולה חשובה (במצב \"ניתן לשינוי\") + לחץ \'אחורה\' כדי לנעול + דחיסת נתונים + נתיב + דחיסת נתונים מקטינה את גודל מסד הנתונים + ביומטרי + הצפנה, מפתח פונקציית גזרה + זכור מפתחות חומרה + עקוב אחר השימוש במפתחות החומרה + שינוי + אלגוריתם הצפנת מסד הנתונים המשמש לכל הנתונים + אל תהרוג את היישום… + למחוק לצמיתות את הצמתים (nodes) הנבחרים? + לוח העתקה + מסד הנתונים נפתח + הוסף שדות מותאמים אישית + לא רשומים נתונים ביומטריים או הרשאות מכשיר. + היסטוריה + מילוי אוטומטי + התחבר עם KeePassDX + כללי + הפעל מילוי אוטומטי כדי למלא במהירות טפסים ביישומים אחרים + להפעיל שירות מילוי אוטומטי כברירת מחדל + גודל סיסמה מיוצרת + מפעיל גודל ברירת מחדל של סיסמאות מיוצרות + תווי סיסמה + הפעלת תווים מורשים למחולל הסיסמאות + אם מחיקה אוטומטית של לוח ההעתקה נכשלת, מחק את ההיסטוריה ידנית. + נעל את מסד הנתונים לאחר כמה שניות של מסך כבוי + נעילת מסך + נעל את מסד הנתונים כאשר המשתמש לוחץ על כפתור אחורה במסך המקור + פתיחת נעילה ביומטרית + מאשפר לך לסרוק את הביומטריה שלך כדי לפתוח את מסד הנתונים + השתמש בפתיחת נעילת המכשיר כדי לפתוח את מסד הנתונים בקלות + מחק מפתחות הצפנה + מחק את כל מפתחות ההצפנה הקשורים לזיהוי פתיחת נעילת המכשיר + אין אפשרות להפעיל את התכונה הזאת. + המכשיר מריץ מערכת אנדרואיד %1$s, אך נדרשת מערכת %2$s או חדשה יותר. + אין אפשרות למצוא את החומרה המתאימה. + שם הקובץ + שימוש בסל מחזור + מעביר קבוצות ורשומות לקבוצת \"סל מיחזור\" לפני מחיקה + קבוצת סל מיחזור + גופן שדה typeface + מספר מירבי + הגבל את מספר פריטי ההיסטוריה לכל רשומה + המלץ על שינוי מפתח ראשי (ימים) + הכרח חידוש + הכרח שינוי מפתח ראשי (ימים) + הכרח חידוש בפעם הבאה + שנה את הגופן שבשימוש בשדות המילוי כדי שייראה ברור יותר + אמון בלוח העתקה + אפשר העתקת סיסמת הרשומה ושדות מוגנים ללוח העתקה + תיאור מסד הנתונים + טקסט + ממשק + סל מיחזור + שם משתמש ברירת מחדל + צבע מסד נתונים מותאם אישית + דחיסה + ללא + מקלדת + Magikeyboard + Magikeyboard + הגדרות Magikeyboard + רשומה + הגדרות מקלדת מכשיר + מידע ההתראה + מראה + מפתחות + לחיצות מקשים מרעידות + בחירת רשומה + כאשר מוצגת רשומה ב־KeePassDX, אכלס את Magikeyboard עם רשומה זו + פעולת מקש אוטומטי + אפשר עבודה ללא מפתח ראשי + אפשר לחיצה על הכפתור \"פתיחה\" אם לא נבחרו הרשאות + פתח את מסד הנתונים לקריאה בלבד כברירת מחדל + מחק סיסמה + מחק את הסיסמה שמוכנסת אחרי נסיון חיבור למסד נתונים + הראה שוב את כל מידע הלימודי + רמזי לימוד + הדגש אלמנטים כדי ללמוד איך היישום עובד + איפוס רמזי הלימוד + ייצור קובץ ניהול הסיסמה הראשון שלך. + פתח מסד נתונים קיים + חיפוש בתוך הרשומות + פתח את נעילת מסד הנתונים שלך + העתק שדה + שדות מועתקים יכולים להיות מודבקים בכל מקום.\n\nהשתמש בשיטת מילוי הטפסים המועדפת עליך. + נעל את מסד הנתונים שלך במהירות, ניתן להגדיר את היישום כך שינעל אותו אחרי כמה זמן, וכאשר המסך מתכבה. + השתתף + עזור להגביר את היציבות, הבטיחות והוספת תכונות חדשות. + בתהליך: %1$d%% + משלים… + חבילת אייקונים \ No newline at end of file From ee1b67b36e5fdec43ffc030c4e40f479773ed525 Mon Sep 17 00:00:00 2001 From: Avi Parshan Date: Sat, 26 Oct 2024 13:04:40 +0000 Subject: [PATCH 086/119] Translated using Weblate (Hebrew) Currently translated at 70.4% (464 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/ --- app/src/main/res/values-iw/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 5680c274b..ec502373b 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -489,4 +489,5 @@ בתהליך: %1$d%% משלים… חבילת אייקונים + סיים! \ No newline at end of file From 16e394087d5692dabdb6218bb890b6d6fa75cd91 Mon Sep 17 00:00:00 2001 From: ginger-co Date: Sat, 26 Oct 2024 13:13:31 +0000 Subject: [PATCH 087/119] Translated using Weblate (Hebrew) Currently translated at 81.0% (534 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/ --- app/src/main/res/values-iw/strings.xml | 74 +++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index ec502373b..37e393b13 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -489,5 +489,77 @@ בתהליך: %1$d%% משלים… חבילת אייקונים - סיים! + הסתיים! + החלף בחזרה + התראה + הצעות בתוך השורה + שמור מידע חיפוש + החלף אוטומטית למקלדת הקודמת במסך הרשאות מסד הנתונים + בחזרה למקלדת הקודמת + בחר רשומה + רשימת חסימת אפליקציות + סגור את מסד הנתונים לאחר בחירת מילוי אוטומטי + GiB + הענק גישת כתיבה לקובץ כדי לשמור שינויי מסד נתונים + נשללה הגישה לקובץ ע\"י סייר הקבצים + המידע שבתוך קובץ מסד הנתונים שלך השתנה מחוץ ליישום זה. + עדיין תצטרך לזכור את הרשאות הכספת הראשית אם תשתמש בזיהוי פתיחת נעילת המכשיר. + נעל מסד נתונים + שמור מידע משותף + העלה %1$s + בוטל! + B + לא ניתן לשמור נתונים במסד נתונים במצב \"קריאה בלבד\". + מקש אנטר + חסום מילוי אוטומטי + העלאה של הקובץ הזה תחליף את הקובץ הקיים. + הוסף את הקובץ בכל מקרה? + תוכן + הגדר OTP + הצג מקומות אחרונים של מסדי נתונים + הסתר קישורים שבורים של מסד הנתונים + דרוש עדכון אבטחה ביומטרי. + נתונים + העלה צרופה לרשומה שלך כדי לשמור מידע חיצוני חשוב. + רשומות פגות תוקף לא מוצגות + הסתר קישורים שבורים ברשימת מסדי הנתונים האחרונים + הגדרות מילוי אוטומטי + רשימת אפליקציות חסומות למילוי אוטומטי + קישור לנעילת מכשיר + שאל האם לשמור נתונים כאשר הסתיים מילוי טופס + לא ניתן לאתחל את חלון פתיחת הנעילה המתקדמת. + הזמן הקצוב עבור פתיחת הנעילה עבר + KiB + MiB + סינון + להסיר את המידע הזה בכל מקרה? + לא מומלץ להוסיף קובץ מפתח ריק. + תוכן קובץ המפתח לעולם לא אמור להשתנות, ועדיף שיכיל נתונים שיוצרו רנדומלית. + למחוק לצמיתות את כל הצמתים (nodes) מסל המיחזור? + זיהוי פתיחת נעילת מכשיר + שליפת הרשאות מסד הנתונים באמצעות נתוני פתיחת נעילת מכשיר + לא ניתן לקרוא את מפתח פתיחת נעילת המכשיר. נא מחק אותו וחזור על תהליך זיהוי פתיחת הנעילה. + לא זוהתה טביעת האצבע לפתיחת נעילת המכשיר + שגיאה בפתיחת נעילת המכשיר: %1$s + הקלד את הסיסמה, ואז לחץ על הכפתור הזה. + הצג כפתור נעילה + הצג את כפתור הנעילה בממשק המשתמש + לחצו כדי למחוק את מפתחות פתיחת הנעילה המתקדמת. + האם למחוק את כל מפתחות ההצפנה הקשורים לזיהוי פתיחת נעילה מתקדמת? + הסר נתונים לא מקושרים + מסיר צרופות הכלולות במסד הנתונים אך לא מקושרות לאף רשומה + החלף מקלדת + מסך הרשאות מסד הנתונים + סגור מסד נתונים + שדות מותאמים אישית + בקספייס (מקש אחורה) + רשימת חסימה של דומיינים ברשת + שאל האם לשמור נתונים + רשימת חסימה למניעת מילוי אוטומטי בדומיינים + אתחל מחדש את היישום המכיל את הטופס על מנת להפעיל את החסימה. + הצעות מילוי אוטומטי נוספו. + הוסף צרופה + בהירות ערכת נושא + בחר ערכות נושא כהות או בהירות + הסתר רשומות פגות תוקף \ No newline at end of file From 8a557ff2fbb73521bf2327526a5e33ddcb6352de Mon Sep 17 00:00:00 2001 From: Avi Parshan Date: Sat, 26 Oct 2024 13:45:38 +0000 Subject: [PATCH 088/119] Translated using Weblate (Hebrew) Currently translated at 81.0% (534 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/ --- app/src/main/res/values-iw/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 37e393b13..23384592f 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -562,4 +562,5 @@ בהירות ערכת נושא בחר ערכות נושא כהות או בהירות הסתר רשומות פגות תוקף + רגיל \ No newline at end of file From 80838bbef0ee59bbbcef3ba652e09755d0ec3e25 Mon Sep 17 00:00:00 2001 From: ginger-co Date: Sat, 26 Oct 2024 14:07:23 +0000 Subject: [PATCH 089/119] Translated using Weblate (Hebrew) Currently translated at 92.5% (610 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/ --- app/src/main/res/values-iw/strings.xml | 80 +++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 23384592f..f4f24b03a 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -118,7 +118,7 @@ מספר סיבובי הצפנה גבוה יותר מספק הגנה טובה יותר נגד התקפות אלימות, אבל יכול להאט את זמן הטעינה והשמירה. שומר מסד נתונים… גודל - סדר מיון מסד נתונים + סדר טבעי מיוחד קו תחתון גרסת מסד נתונים לא נתמכת. @@ -563,4 +563,82 @@ בחר ערכות נושא כהות או בהירות הסתר רשומות פגות תוקף רגיל + שם משתמש + מסך חיפוש + הקצבת זמן לפעולה (Timeout) + בקש פתיחת נעילת מכשיר אוטומטית אם מסד הנתונים מוגדר להשתמש בה + בחירה ידנית + הקצבת זמן לניקוי רשומת המקלדת + החלף אוטומטית למקלדת הקודמת לאחר ביצוע \"Auto key action\" + החלף אוטומטית למקלדת הקודמת במסך החיפוש + צבעי רשומה + אנטרופיה: %1$s bit + מותאם אישית + המשך ללא מפתח הצפנה? + הרשאות + מאפיינים + הגדרות יישום יובאו + כותרת + מאפייני KeePassDX לניהול הגדרות יישום + שגיאה במהלך יבוא הגדרות יישום + שמיימי + קלאסי + Kunzite + עקוב אחרי המערכת + סייר קבצים שלל את הגישה לקובץ, סגור את מסד הנתונים ופתח מחדש מהמיקום שלו. + Build %1$s + הגדרות יישום יוצאו + לפחות תו אחד מכל סוג + מסד נתונים כבר פתוח, סגור אותו על מנת לפתוח את החדש + אנטרופיה: גבוהה + אנטרופיה: חישוב… + פשוט + הנמוך ביותר ראשון ↓ + קבוצות לפני + סל מיחזור בתחתית + בחר קובץ כדי לייבא הגדרות יישום + הסרת נתונים לא מקושרים יכול להקטין את גודל מסד הנתונים שלך אבל עלול גם למחוק נתונים הנמצאים בשימוש ע\"י תוספי KeePass. + פתח נעילה + טען את מסד הנתונים עם השינויים האחרונים. + טעינה מחדש של מסד הנתונים ימחוק את הנתונים ששונו מקומית. + אח\"כ + שאל + הרשאת ההתראה מאפשרת לך להציג את מצב מסד הנתונים ולנעול אותו עם כפתור נגיש.\n\nאם לא תפעיל את ההרשאה הזו, מסד הנתונים הנפתח ברקע לא יהיה גלוי אם יישום אחר נמצא בקדמה. + על מנת להשתמש בתכונת התראת לוח העתקה דרושה הרשאת התראה. + הגדר + מיזוג הושלם בהצלחה + קישור פתיחת נעילת מכשיר + סיסמה מוצפנת אוחסנה + לא זמין + ערכות נושא, צבעים, מאפיינים + בחר רשומה… + שימוש בתבניות + השתמש בתבניות דינמיות כדי למלא את שדות הרשומה + קבוצת תבניות + תבניות + הצג התראה כאשר רשומה זמינה + השאר את המסך דולק + השאר את המסך דולק כאשר צופים או עורכים רשומה + מצב צילום מסך + אפשר ליישומים מצד שלישי להקליט או לצלם מסך של היישום + שלול תווים מעורפלים + לקחת בחשבון תווים + מפריד + התעלם מתווים + אותיות קטנות + אותיות גדולות + Title Case + ספירת תווים: %1$d + מצב צילום מסך + הצגת צבעי רקע אחורי וקדמי לרשומה + יער + ירח + שמש + תשובה + אור + חושך + יבא הגדרות יישום + יצא הגדרות יישום + צור קובץ לייצוא הגדרות יישום + שגיאה במהלך ייצוא הגדרות יישום \ No newline at end of file From 13b6d6384cbccc425ab6cea33a924305d339c991 Mon Sep 17 00:00:00 2001 From: solokot Date: Mon, 28 Oct 2024 14:57:12 +0000 Subject: [PATCH 090/119] Translated using Weblate (Russian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 940067962..1bc44ba36 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -146,7 +146,7 @@ Функция формирования ключа Расширенный набор ASCII Служба автозаполнения не может быть включена. - %1$s скопировано + Скопировано: %1$s Заполнение форм Алгоритм шифрования всех данных базы При создании ключа для алгоритма шифрования, главный пароль преобразуется при помощи функции формирования ключа со случайной солью. @@ -580,7 +580,7 @@ Wi–Fi Адрес эл. почты Имя - PIN–код + PIN CVV Номер Владелец From 0bfce4431703435caf506ee5547367bc7b02d885 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 2 Nov 2024 11:04:15 +0100 Subject: [PATCH 091/119] fix: unlocking procedure #1760 --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f0510f5a6..d91711145 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -628,7 +628,7 @@ Unlike many password management apps, this one is <strong>ad-free</strong>, <strong>copylefted libre software</strong> and does not collect personal data on its servers, no matter what version you use. By buying the pro version, you will have access to this <strong>visual style</strong> and you will especially help <strong>the realization of community projects.</strong> This <strong>visual style</strong> is available thanks to your generosity. - In order to keep our freedom and to always be active, we count on your <strong>contribution.</strong> + By <strong>contributing</strong> to the project <i>(monetarily, code, translation),</i>, you will help it to continue to live and thrive, and you will also be eligible for the <strong>theme</strong> unlocking procedure. This feature is <strong>under development</strong> and requires your <strong>contribution</strong> to be available soon. By buying the <strong>pro</strong> version, By <strong>contributing</strong>, From 4ba77b76ec2af9d14be11860b40881cd5b41bcd9 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 2 Nov 2024 13:37:33 +0100 Subject: [PATCH 092/119] feat: Instant in copy #1889 --- CHANGELOG | 2 +- .../java/com/kunzisoft/keepass/activities/GroupActivity.kt | 6 ++++-- app/src/main/res/values/donottranslate.xml | 1 - fastlane/metadata/android/en-US/changelogs/132.txt | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f31235e67..0b1ce3f68 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,7 +3,7 @@ KeePassDX(4.1.0) * Generate keyfile #1290 * Hide template group #1894 * Group count sum recursively #421 - * Small fixes #1711 #1831 #1780 #1821 #1863 + * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 KeePassDX(4.0.8) * Fix graphical bug that prevented databases from being opened on some versions of Android #1848 #1850 diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index 3b2b3a9bf..f2717a04a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -114,6 +114,7 @@ import com.kunzisoft.keepass.view.showActionErrorIfNeeded import com.kunzisoft.keepass.view.updateLockPaddingLeft import com.kunzisoft.keepass.viewmodels.GroupEditViewModel import com.kunzisoft.keepass.viewmodels.GroupViewModel +import org.joda.time.Instant class GroupActivity : DatabaseLockActivity(), @@ -339,8 +340,9 @@ class GroupActivity : DatabaseLockActivity(), R.id.menu_save_copy_to -> { mExternalFileHelper?.createDocument( getString(R.string.database_file_name_default) + - getString(R.string.database_file_name_copy) + - mDatabase?.defaultFileExtension) + "_" + + Instant.now().toString() + + mDatabase?.defaultFileExtension) } R.id.menu_lock_all -> { lockAndExit() diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 3b25d74b1..c67bc06da 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -50,7 +50,6 @@ keepass - _copy .kdbx KeePassDX Database keepassdx_%1$s.properties diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index 612bdb6f8..a22243662 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -2,4 +2,4 @@ * Generate keyfile #1290 * Hide template group #1894 * Group count sum recursively #421 - * Small fixes #1711 #1831 #1780 #1821 #1863 \ No newline at end of file + * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 \ No newline at end of file From f2a5c0b04b663b4203ef9390e5f7264519a2fec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sun, 3 Nov 2024 13:04:35 +0000 Subject: [PATCH 093/119] Translated using Weblate (Estonian) Currently translated at 32.6% (215 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/et/ --- app/src/main/res/values-et/strings.xml | 50 +++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 0d9990927..110f5a6a8 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -40,7 +40,7 @@ Eemalda väli Uuenda Kustuta - Kopeeri %1$s lõikepuhverisse + Vali %1$s kopeerimaks ta lõikelauale Andmebaas Mallid Dekrüpteerime andmebaasi sisu… @@ -167,4 +167,52 @@ Vigane OTP salasõna. Gruppi ei saa siia tõsta. See sõna on reserveeritud muuks kasutuseks ning sa ei saa teda pruukida. + Iteratsioonide kordi + Ajavahemik peab jääma %1$d ja %2$d vahele. + Pikkus + Tunnusluba + Vigane või katkine fail. + Salasõna + Loo tugev salasõna + Lülita salasõna nähtavus korduvalt sisse/välja + Versiooni liik: %1$s + Võtit ei leidunud. Proovi vähendada seadistust KDFi „Mälukasutus“. + Andmebaasifailide loomiseks, avamiseks ja salvestamiseks on vajalik failihalduri olemasolu, mis oskaks kasutada ACTION_CREATE_DOCUMENT ja ACTION_OPEN_DOCUMENT päringuid. + Menüü on avatud + Menüü on suletud + KeePassDX © %1$d Kunzisoft on avatud lähtekoodiga ja reklaamivaba.\nSeda programmi levitatakse ilma igasuguse garantiita ning ta on litsentseeritud GPLv3 alusel. + See rakendus ei laadi kasutajate andmeid, ei loo ühendust ühegi serveriga, töötab nutiseadmes ainult kohalikus režiimis ja täies mahus austab kasutajate privaatsust. + Meie vabaduse säilitamiseks, vigade parandamiseks, uue funktsionaalsuse lisamiseks ning et olla alati tänapäevane, me tõsiselt arvestame sinu kaastöö ja osalemisega. + Päri + Arcfouri jadašiffer pole toetatud. + Väljale „Pikkus“ sisesta positiivne täisarv. + Vähemalt üks salasõna loomise tüüp peab olema valitud. + Iteratsioonide kordade arv on liiga suur. Muudame väärtuseks 2147483648. + Igal tekstil peab olema väljanimi. + Salavõti peab olema base32 vormingus. + Loendur peab olema vahemikus %1$d kuni %2$d. + Tunnusloas peab olema %1$d kuni %2$d numbrit. + Grupi nimi + Ikooni nimi + Võtmefail + Pikkus + Salasõna + Peida salasõnad + Vakimisi peida salasõnad (***) taha + Värvi salasõnad + Uue kirje salvestamine pole võimalik andmebaasis, milles on vaid lugemisõigus + Andmebaasi ühtset ressursiidentifikaatorit ei õnnestu laadida. + Loendi korrektne uuesti loomine ei õnnestu. + Vale algoritm. + %1$s sama UUIDga %2$s on juba olemas. + Andmebaasi vormingut ei õnnestu tuvastada. + Võtmefail on tühi. + Värvi salasõnas leiduvad tähed ja märgid tüübi alusel + Näita kasutajanimesid + Kasutajanimede kuvamine sisendiloendites + Näita kirjete arvu + Näita UUID\'d + Näitab kirje või grupiga seotud UUID\'d + Peida salasõna + Näita salasõna \ No newline at end of file From 7c1c2992822f1fabdcbec16913e8ee987ab1d8c0 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 4 Nov 2024 19:43:30 +0100 Subject: [PATCH 094/119] fix: Off-by-one when selecting date fields #1695 --- CHANGELOG | 1 + app/build.gradle | 2 +- .../keepass/activities/EntryEditActivity.kt | 7 +- .../keepass/activities/GroupActivity.kt | 6 +- .../dialogs/GroupEditDialogFragment.kt | 19 +- .../keepass/autofill/AutofillHelper.kt | 6 +- .../com/kunzisoft/keepass/model/DataDate.kt | 3 + .../com/kunzisoft/keepass/model/DataTime.kt | 3 + .../com/kunzisoft/keepass/utils/TimeUtil.kt | 22 ++ .../com/kunzisoft/keepass/view/DataTime.kt | 3 - .../keepass/view/DateTimeEditFieldView.kt | 2 +- .../keepass/view/DateTimeFieldView.kt | 2 +- .../keepass/view/TemplateEditView.kt | 35 ++- .../keepass/viewmodels/NodeEditViewModel.kt | 15 +- database/build.gradle | 2 +- .../keepass/database/element/DateInstant.kt | 203 ++++++++++++------ .../keepass/database/element/SortNodeEnum.kt | 13 +- .../database/element/entry/EntryKDBX.kt | 13 +- .../keepass/database/file/DatabaseKDBXXML.kt | 7 - .../keepass/database/file/DateKDBXUtil.kt | 46 ---- .../database/file/input/DatabaseInputKDB.kt | 16 +- .../database/file/input/DatabaseInputKDBX.kt | 12 +- .../file/output/DatabaseOutputKDBX.kt | 14 +- .../database/file/output/EntryOutputKDB.kt | 8 +- .../database/file/output/GroupOutputKDB.kt | 8 +- .../database/merge/DatabaseKDBXMerger.kt | 45 ++-- .../com/kunzisoft/keepass/model/EntryInfo.kt | 2 +- .../keepass/utils/StreamBytesUtils.kt | 36 ++-- .../keepass/tests/utils/ValuesTest.kt | 35 +-- .../metadata/android/en-US/changelogs/132.txt | 1 + 30 files changed, 306 insertions(+), 281 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/model/DataDate.kt create mode 100644 app/src/main/java/com/kunzisoft/keepass/model/DataTime.kt delete mode 100644 app/src/main/java/com/kunzisoft/keepass/view/DataTime.kt delete mode 100644 database/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt diff --git a/CHANGELOG b/CHANGELOG index 0b1ce3f68..8c51a5fed 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ KeePassDX(4.1.0) * Generate keyfile #1290 * Hide template group #1894 * Group count sum recursively #421 + * Fix when selecting date fields #1695 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 KeePassDX(4.0.8) diff --git a/app/build.gradle b/app/build.gradle index 561308a84..c70ab51f2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,7 @@ dependencies { // Autofill implementation "androidx.autofill:autofill:1.1.0" // Time - implementation 'joda-time:joda-time:2.10.13' + implementation 'joda-time:joda-time:2.13.0' // Color implementation 'com.github.Kunzisoft:AndroidClearChroma:2.6' // Education diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt index a1da94f6b..17b426cc4 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -30,7 +30,6 @@ import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.View -import android.view.ViewGroup import android.widget.AdapterView import android.widget.ProgressBar import android.widget.Spinner @@ -73,6 +72,7 @@ import com.kunzisoft.keepass.database.element.template.Template import com.kunzisoft.keepass.education.EntryEditActivityEducation import com.kunzisoft.keepass.magikeyboard.MagikeyboardService import com.kunzisoft.keepass.model.AttachmentState +import com.kunzisoft.keepass.model.DataTime import com.kunzisoft.keepass.model.EntryAttachmentState import com.kunzisoft.keepass.model.RegisterInfo import com.kunzisoft.keepass.model.SearchInfo @@ -87,6 +87,7 @@ import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.AttachmentFileBinderManager import com.kunzisoft.keepass.timeout.TimeoutHelper +import com.kunzisoft.keepass.utils.TimeUtil.datePickerToDataDate import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile import com.kunzisoft.keepass.utils.getParcelableExtraCompat import com.kunzisoft.keepass.view.ToolbarAction @@ -301,7 +302,7 @@ class EntryEditActivity : DatabaseLockActivity(), // Launch the time picker MaterialTimePicker.Builder().build().apply { addOnPositiveButtonClickListener { - mEntryEditViewModel.selectTime(this.hour, this.minute) + mEntryEditViewModel.selectTime(DataTime(this.hour, this.minute)) } show(supportFragmentManager, "TimePickerFragment") } @@ -309,7 +310,7 @@ class EntryEditActivity : DatabaseLockActivity(), // Launch the date picker MaterialDatePicker.Builder.datePicker().build().apply { addOnPositiveButtonClickListener { - mEntryEditViewModel.selectDate(it) + mEntryEditViewModel.selectDate(datePickerToDataDate(it)) } show(supportFragmentManager, "DatePickerFragment") } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index f2717a04a..19d963469 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -84,6 +84,7 @@ import com.kunzisoft.keepass.database.helper.SearchHelper import com.kunzisoft.keepass.database.search.SearchParameters import com.kunzisoft.keepass.education.GroupActivityEducation import com.kunzisoft.keepass.magikeyboard.MagikeyboardService +import com.kunzisoft.keepass.model.DataTime import com.kunzisoft.keepass.model.GroupInfo import com.kunzisoft.keepass.model.RegisterInfo import com.kunzisoft.keepass.model.SearchInfo @@ -96,6 +97,7 @@ import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.utils.BACK_PREVIOUS_KEYBOARD_ACTION import com.kunzisoft.keepass.utils.KeyboardUtil.showKeyboard +import com.kunzisoft.keepass.utils.TimeUtil.datePickerToDataDate import com.kunzisoft.keepass.utils.UriUtil.openUrl import com.kunzisoft.keepass.utils.getParcelableCompat import com.kunzisoft.keepass.utils.getParcelableExtraCompat @@ -440,7 +442,7 @@ class GroupActivity : DatabaseLockActivity(), // Launch the time picker MaterialTimePicker.Builder().build().apply { addOnPositiveButtonClickListener { - mGroupEditViewModel.selectTime(this.hour, this.minute) + mGroupEditViewModel.selectTime(DataTime(this.hour, this.minute)) } show(supportFragmentManager, "TimePickerFragment") } @@ -448,7 +450,7 @@ class GroupActivity : DatabaseLockActivity(), // Launch the date picker MaterialDatePicker.Builder.datePicker().build().apply { addOnPositiveButtonClickListener { - mGroupEditViewModel.selectDate(it) + mGroupEditViewModel.selectDate(datePickerToDataDate(it)) } show(supportFragmentManager, "DatePickerFragment") } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt index 46894e1d5..58414ee3b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt @@ -45,7 +45,6 @@ import com.kunzisoft.keepass.view.InheritedCompletionView import com.kunzisoft.keepass.view.TagsCompletionView import com.kunzisoft.keepass.viewmodels.GroupEditViewModel import com.tokenautocomplete.FilteredArrayAdapter -import org.joda.time.DateTime class GroupEditDialogFragment : DatabaseDialogFragment() { @@ -90,27 +89,21 @@ class GroupEditDialogFragment : DatabaseDialogFragment() { mPopulateIconMethod?.invoke(iconButtonView, mGroupInfo.icon) } - mGroupEditViewModel.onDateSelected.observe(this) { dateMilliseconds -> + mGroupEditViewModel.onDateSelected.observe(this) { date -> // Save the date - mGroupInfo.expiryTime = DateInstant( - DateTime(mGroupInfo.expiryTime.date) - .withMillis(dateMilliseconds) - .toDate()) + mGroupInfo.expiryTime.setDate(date.year, date.month, date.day) expirationView.dateTime = mGroupInfo.expiryTime if (expirationView.dateTime.type == DateInstant.Type.DATE_TIME) { - val instantTime = DateInstant(mGroupInfo.expiryTime.date, DateInstant.Type.TIME) // Trick to recall selection with time - mGroupEditViewModel.requestDateTimeSelection(instantTime) + mGroupEditViewModel.requestDateTimeSelection( + DateInstant(mGroupInfo.expiryTime.instant, DateInstant.Type.TIME) + ) } } mGroupEditViewModel.onTimeSelected.observe(this) { viewModelTime -> // Save the time - mGroupInfo.expiryTime = DateInstant( - DateTime(mGroupInfo.expiryTime.date) - .withHourOfDay(viewModelTime.hours) - .withMinuteOfHour(viewModelTime.minutes) - .toDate(), mGroupInfo.expiryTime.type) + mGroupInfo.expiryTime.setTime(viewModelTime.hour, viewModelTime.minute) expirationView.dateTime = mGroupInfo.expiryTime } diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillHelper.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillHelper.kt index 4fc0c399e..7af54b23f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillHelper.kt @@ -176,8 +176,8 @@ object AutofillHelper { } if (entryInfo.expires) { - val year = entryInfo.expiryTime.getYearInt() - val month = entryInfo.expiryTime.getMonthInt() + val year = entryInfo.expiryTime.getYear() + val month = entryInfo.expiryTime.getMonth() val monthString = month.toString().padStart(2, '0') val day = entryInfo.expiryTime.getDay() val dayString = day.toString().padStart(2, '0') @@ -192,7 +192,7 @@ object AutofillHelper { } else { datasetBuilder.addValueToDatasetBuilder( it, - AutofillValue.forDate(entryInfo.expiryTime.date.time) + AutofillValue.forDate(entryInfo.expiryTime.toJavaMilliseconds()) ) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/model/DataDate.kt b/app/src/main/java/com/kunzisoft/keepass/model/DataDate.kt new file mode 100644 index 000000000..efa877dd6 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/model/DataDate.kt @@ -0,0 +1,3 @@ +package com.kunzisoft.keepass.model + +data class DataDate(val year: Int, val month: Int, val day: Int) \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/model/DataTime.kt b/app/src/main/java/com/kunzisoft/keepass/model/DataTime.kt new file mode 100644 index 000000000..c0a8a30a5 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/model/DataTime.kt @@ -0,0 +1,3 @@ +package com.kunzisoft.keepass.model + +data class DataTime(val hour: Int, val minute: Int) \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/TimeUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/TimeUtil.kt index 29f2cc237..e86162b22 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/TimeUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/TimeUtil.kt @@ -3,13 +3,17 @@ package com.kunzisoft.keepass.utils import android.content.res.Resources import androidx.core.os.ConfigurationCompat import com.kunzisoft.keepass.database.element.DateInstant +import com.kunzisoft.keepass.model.DataDate import java.text.DateFormat +import java.util.Calendar import java.util.Locale +import java.util.TimeZone object TimeUtil { fun DateInstant.getDateTimeString(resources: Resources): String { val locale = ConfigurationCompat.getLocales(resources.configuration)[0] ?: Locale.ROOT + val date = instant.toDate() return when (type) { DateInstant.Type.DATE -> DateFormat.getDateInstance( DateFormat.MEDIUM, @@ -26,4 +30,22 @@ object TimeUtil { .format(date) } } + + // https://github.com/material-components/material-components-android/issues/882#issuecomment-1111374962 + // To fix UTC time in date picker + fun datePickerToDataDate(millis: Long): DataDate { + val selectedUtc = Calendar.getInstance(TimeZone.getTimeZone("UTC")) + selectedUtc.timeInMillis = millis + val selectedLocal = Calendar.getInstance() + selectedLocal.clear() + selectedLocal.set( + selectedUtc.get(Calendar.YEAR), + selectedUtc.get(Calendar.MONTH), + selectedUtc.get(Calendar.DAY_OF_MONTH)) + return DataDate( + selectedLocal.get(Calendar.YEAR), + selectedLocal.get(Calendar.MONTH) + 1, + selectedLocal.get(Calendar.DAY_OF_MONTH), + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/view/DataTime.kt b/app/src/main/java/com/kunzisoft/keepass/view/DataTime.kt deleted file mode 100644 index cc88ff2bc..000000000 --- a/app/src/main/java/com/kunzisoft/keepass/view/DataTime.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.kunzisoft.keepass.view - -data class DataTime(val hours: Int, val minutes: Int) \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/view/DateTimeEditFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/DateTimeEditFieldView.kt index 43b6d9bb4..9346f9807 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/DateTimeEditFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/DateTimeEditFieldView.kt @@ -111,7 +111,7 @@ class DateTimeEditFieldView @JvmOverloads constructor(context: Context, mDefault } set(value) { - mDateTime = DateInstant(value.date, mDateTime.type) + mDateTime = DateInstant(value.instant, mDateTime.type) entryExpiresTextView.text = if (entryExpiresCheckBox.isChecked) { mDateTime.getDateTimeString(resources) } else { diff --git a/app/src/main/java/com/kunzisoft/keepass/view/DateTimeFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/DateTimeFieldView.kt index 4eb0565c4..7b33e7079 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/DateTimeFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/DateTimeFieldView.kt @@ -128,7 +128,7 @@ class DateTimeFieldView @JvmOverloads constructor(context: Context, mDefault } set(value) { - mDateTime = DateInstant(value.date, mDateTime.type) + mDateTime = DateInstant(value.instant, mDateTime.type) assignExpiresDateText() } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt index 151a9a422..470e19a69 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt @@ -17,8 +17,9 @@ import com.kunzisoft.keepass.database.element.template.TemplateAttribute import com.kunzisoft.keepass.database.element.template.TemplateAttributeAction import com.kunzisoft.keepass.database.element.template.TemplateField import com.kunzisoft.keepass.database.helper.getLocalizedName +import com.kunzisoft.keepass.model.DataDate +import com.kunzisoft.keepass.model.DataTime import com.kunzisoft.keepass.otp.OtpEntryFields -import org.joda.time.DateTime class TemplateEditView @JvmOverloads constructor(context: Context, @@ -211,35 +212,31 @@ class TemplateEditView @JvmOverloads constructor(context: Context, val dateTimeView = getFieldViewById(viewId) if (dateTimeView is DateTimeEditFieldView) { dateTimeView.dateTime = DateInstant( - action.invoke(dateTimeView.dateTime).date, - dateTimeView.dateTime.type) + action.invoke(dateTimeView.dateTime).instant, + dateTimeView.dateTime.type + ) } } } - fun setCurrentDateTimeValue(dateMilliseconds: Long) { + fun setCurrentDateTimeValue(date: DataDate) { // Save the date - setCurrentDateTimeSelection { instant -> - val newDateInstant = DateInstant( - DateTime(instant.date) - .withMillis(dateMilliseconds) - .toDate(), instant.type) - if (instant.type == DateInstant.Type.DATE_TIME) { - val instantTime = DateInstant(instant.date, DateInstant.Type.TIME) + setCurrentDateTimeSelection { dateInstant -> + dateInstant.setDate(date.year, date.month, date.day) + if (dateInstant.type == DateInstant.Type.DATE_TIME) { // Trick to recall selection with time - mOnDateInstantClickListener?.invoke(instantTime) + mOnDateInstantClickListener?.invoke( + DateInstant(dateInstant.instant, DateInstant.Type.TIME) + ) } - newDateInstant + dateInstant } } fun setCurrentTimeValue(time: DataTime) { - setCurrentDateTimeSelection { instant -> - DateInstant( - DateTime(instant.date) - .withHourOfDay(time.hours) - .withMinuteOfHour(time.minutes) - .toDate(), instant.type) + setCurrentDateTimeSelection { dateInstant -> + dateInstant.setTime(time.hour, time.minute) + dateInstant } } diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodeEditViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodeEditViewModel.kt index e649063c0..0ed8d504e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodeEditViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodeEditViewModel.kt @@ -4,7 +4,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import com.kunzisoft.keepass.database.element.DateInstant import com.kunzisoft.keepass.database.element.icon.IconImage -import com.kunzisoft.keepass.view.DataTime +import com.kunzisoft.keepass.model.DataDate +import com.kunzisoft.keepass.model.DataTime abstract class NodeEditViewModel : ViewModel() { @@ -23,8 +24,8 @@ abstract class NodeEditViewModel : ViewModel() { val requestDateTimeSelection : LiveData get() = _requestDateTimeSelection private val _requestDateTimeSelection = SingleLiveEvent() - val onDateSelected : LiveData get() = _onDateSelected - private val _onDateSelected = SingleLiveEvent() + val onDateSelected : LiveData get() = _onDateSelected + private val _onDateSelected = SingleLiveEvent() val onTimeSelected : LiveData get() = _onTimeSelected private val _onTimeSelected = SingleLiveEvent() @@ -57,12 +58,12 @@ abstract class NodeEditViewModel : ViewModel() { _requestDateTimeSelection.value = dateInstant } - fun selectDate(dateMilliseconds: Long) { - _onDateSelected.value = dateMilliseconds + fun selectDate(date: DataDate) { + _onDateSelected.value = date } - fun selectTime(hours: Int, minutes: Int) { - _onTimeSelected.value = DataTime(hours, minutes) + fun selectTime(dataTime: DataTime) { + _onTimeSelected.value = dataTime } private enum class ColorRequest { diff --git a/database/build.gradle b/database/build.gradle index b11df6359..f55d878b9 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -36,7 +36,7 @@ android { dependencies { // Time - implementation 'joda-time:joda-time:2.10.13' + implementation 'joda-time:joda-time:2.13.0' // Apache Commons implementation 'commons-io:commons-io:2.8.0' implementation 'commons-codec:commons-codec:1.15' diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt index ad4c627ed..1b7e8d20b 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt @@ -21,27 +21,27 @@ package com.kunzisoft.keepass.database.element import android.os.Parcel import android.os.Parcelable -import com.kunzisoft.keepass.utils.readSerializableCompat import com.kunzisoft.keepass.utils.readEnum +import com.kunzisoft.keepass.utils.readSerializableCompat import com.kunzisoft.keepass.utils.writeEnum +import org.joda.time.DateTime +import org.joda.time.DateTimeZone import org.joda.time.Duration import org.joda.time.Instant import org.joda.time.LocalDate import org.joda.time.LocalDateTime import org.joda.time.LocalTime -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Date -import java.util.Locale -import java.util.TimeZone +import org.joda.time.format.DateTimeFormat +import org.joda.time.format.DateTimeFormatter + class DateInstant : Parcelable { - private var jDate: Date = Date() + private var mInstant: Instant = Instant.now() private var mType: Type = Type.DATE_TIME - val date: Date - get() = jDate + val instant: Instant + get() = mInstant var type: Type get() = mType @@ -50,42 +50,37 @@ class DateInstant : Parcelable { } constructor(source: DateInstant) { - this.jDate = Date(source.jDate.time) + this.mInstant = Instant(source.mInstant) this.mType = source.mType } - constructor(date: Date, type: Type = Type.DATE_TIME) { - jDate = Date(date.time) + constructor(instant: Instant, type: Type = Type.DATE_TIME) { + mInstant = Instant(instant) mType = type } - constructor(millis: Long, type: Type = Type.DATE_TIME) { - jDate = Date(millis) - mType = type - } - - private fun parse(value: String, type: Type): Date { + private fun parse(value: String, type: Type): Instant { return when (type) { - Type.DATE -> dateFormat.parse(value) ?: jDate - Type.TIME -> timeFormat.parse(value) ?: jDate - else -> dateTimeFormat.parse(value) ?: jDate + Type.DATE -> Instant(dateFormat.parseDateTime(value) ?: DateTime()) + Type.TIME -> Instant(timeFormat.parseDateTime(value) ?: DateTime()) + else -> Instant(dateTimeFormat.parseDateTime(value) ?: DateTime()) } } constructor(string: String, type: Type = Type.DATE_TIME) { try { - jDate = parse(string, type) + mInstant = parse(string, type) mType = type } catch (e: Exception) { // Retry with second format try { when (type) { Type.TIME -> { - jDate = parse(string, Type.DATE) + mInstant = parse(string, Type.DATE) mType = Type.DATE } else -> { - jDate = parse(string, Type.TIME) + mInstant = parse(string, Type.TIME) mType = Type.TIME } } @@ -93,11 +88,11 @@ class DateInstant : Parcelable { // Retry with third format when (type) { Type.DATE, Type.TIME -> { - jDate = parse(string, Type.DATE_TIME) + mInstant = parse(string, Type.DATE_TIME) mType = Type.DATE_TIME } else -> { - jDate = parse(string, Type.DATE) + mInstant = parse(string, Type.DATE) mType = Type.DATE } } @@ -110,11 +105,11 @@ class DateInstant : Parcelable { } constructor() { - jDate = Date() + mInstant = Instant.now() } constructor(parcel: Parcel) { - jDate = parcel.readSerializableCompat() ?: jDate + mInstant = parcel.readSerializableCompat() ?: mInstant mType = parcel.readEnum() ?: mType } @@ -123,47 +118,82 @@ class DateInstant : Parcelable { } override fun writeToParcel(dest: Parcel, flags: Int) { - dest.writeSerializable(jDate) + dest.writeSerializable(mInstant) dest.writeEnum(mType) } - fun getYearInt(): Int { - val dateFormat = SimpleDateFormat("yyyy", Locale.ENGLISH) - return dateFormat.format(date).toInt() + fun setDate(year: Int, month: Int, day: Int) { + mInstant = DateTime(mInstant) + .withYear(year) + .withMonthOfYear(month) + .withDayOfMonth(day) + .toInstant() } - fun getMonthInt(): Int { - val dateFormat = SimpleDateFormat("MM", Locale.ENGLISH) - return dateFormat.format(date).toInt() + fun setTime(hour: Int, minute: Int) { + mInstant = DateTime(mInstant) + .withHourOfDay(hour) + .withMinuteOfHour(minute) + .toInstant() + } + + fun getYear(): Int { + return mInstant.toDateTime().year + } + + fun getMonth(): Int { + return mInstant.toDateTime().monthOfYear } fun getDay(): Int { - val dateFormat = SimpleDateFormat("dd", Locale.ENGLISH) - return dateFormat.format(date).toInt() + return mInstant.toDateTime().dayOfMonth + } + + fun getHour(): Int { + return mInstant.toDateTime().hourOfDay + } + + fun getMinute(): Int { + return mInstant.toDateTime().minuteOfHour + } + + fun getSecond(): Int { + return mInstant.toDateTime().secondOfMinute } // If expireDate is before NEVER_EXPIRE date less 1 month (to be sure) // it is not expires fun isNeverExpires(): Boolean { - return LocalDateTime(jDate) - .isBefore( - LocalDateTime.fromDateFields(NEVER_EXPIRES.date) - .minusMonths(1)) + return mInstant.isBefore(NEVER_EXPIRES.instant.minus(Duration.standardDays(30))) } fun isCurrentlyExpire(): Boolean { return when (type) { - Type.DATE -> LocalDate.fromDateFields(jDate).isBefore(LocalDate.now()) - Type.TIME -> LocalTime.fromDateFields(jDate).isBefore(LocalTime.now()) - else -> LocalDateTime.fromDateFields(jDate).isBefore(LocalDateTime.now()) + Type.DATE -> LocalDate.fromDateFields(mInstant.toDate()).isBefore(LocalDate.now()) + Type.TIME -> LocalTime.fromDateFields(mInstant.toDate()).isBefore(LocalTime.now()) + else -> LocalDateTime.fromDateFields(mInstant.toDate()).isBefore(LocalDateTime.now()) } } + fun toDotNetSeconds(): Long { + val duration = Duration(JAVA_EPOCH_DATE_TIME, mInstant) + val seconds = duration.millis / 1000L + return seconds + EPOCH_OFFSET + } + + fun toJavaMilliseconds(): Long { + return mInstant.millis + } + + fun toDateTimeSecondsFormat(): String { + return dateTimeSecondsFormat.print(mInstant) + } + override fun toString(): String { return when (type) { - Type.DATE -> dateFormat.format(jDate) - Type.TIME -> timeFormat.format(jDate) - else -> dateTimeFormat.format(jDate) + Type.DATE -> dateFormat.print(mInstant) + Type.TIME -> timeFormat.print(mInstant) + else -> dateTimeFormat.print(mInstant) } } @@ -171,47 +201,78 @@ class DateInstant : Parcelable { if (this === other) return true if (other !is DateInstant) return false - if (jDate != other.jDate) return false if (mType != other.mType) return false - + if (mType == Type.DATE || mType == Type.DATE_TIME) { + if (getYear() != other.getYear()) return false + if (getMonth() != other.getMonth()) return false + if (getDay() != other.getDay()) return false + if (getHour() != other.getHour()) return false + } + if (mType == Type.TIME || mType == Type.DATE_TIME) { + if (getMinute() != other.getMinute()) return false + if (getSecond() != other.getSecond()) return false + } return true } override fun hashCode(): Int { - var result = jDate.hashCode() + var result = mInstant.hashCode() result = 31 * result + mType.hashCode() return result } + fun isBefore(dateInstant: DateInstant): Boolean { + return this.mInstant.isBefore(dateInstant.mInstant) + } + + fun isAfter(dateInstant: DateInstant): Boolean { + return this.mInstant.isAfter(dateInstant.mInstant) + } + + fun compareTo(other: DateInstant?): Int { + return mInstant.compareTo(other?.mInstant) + } + enum class Type { DATE_TIME, DATE, TIME } companion object { - val NEVER_EXPIRES = DateInstant(Calendar.getInstance().apply { - set(Calendar.YEAR, 2999) - set(Calendar.MONTH, 11) - set(Calendar.DAY_OF_MONTH, 28) - set(Calendar.HOUR, 23) - set(Calendar.MINUTE, 59) - set(Calendar.SECOND, 59) - }.time) - val IN_ONE_MONTH_DATE_TIME = DateInstant( - Instant.now().plus(Duration.standardDays(30)).toDate(), Type.DATE_TIME) - val IN_ONE_MONTH_DATE = DateInstant( - Instant.now().plus(Duration.standardDays(30)).toDate(), Type.DATE) - val IN_ONE_HOUR_TIME = DateInstant( - Instant.now().plus(Duration.standardHours(1)).toDate(), Type.TIME) + private val DOT_NET_EPOCH_DATE_TIME = DateTime(1, 1, 1, 0, 0, 0, DateTimeZone.UTC) + private val JAVA_EPOCH_DATE_TIME = DateTime(1970, 1, 1, 0, 0, 0, DateTimeZone.UTC) + private val EPOCH_OFFSET = (JAVA_EPOCH_DATE_TIME.millis - DOT_NET_EPOCH_DATE_TIME.millis) / 1000L + private val NEVER_EXPIRES_DATE_TIME = DateTime(2999, 11, 28, 23, 59, 59, DateTimeZone.UTC) - private val dateTimeFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'", Locale.ROOT).apply { - timeZone = TimeZone.getTimeZone("UTC") + val NEVER_EXPIRES = DateInstant(NEVER_EXPIRES_DATE_TIME.toInstant()) + val IN_ONE_MONTH_DATE_TIME = DateInstant( + Instant.now().plus(Duration.standardDays(30)), Type.DATE_TIME) + val IN_ONE_MONTH_DATE = DateInstant( + Instant.now().plus(Duration.standardDays(30)), Type.DATE) + val IN_ONE_HOUR_TIME = DateInstant( + Instant.now().plus(Duration.standardHours(1)), Type.TIME) + + val dateTimeSecondsFormat: DateTimeFormatter = + DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'") + .withZoneUTC() + var dateTimeFormat: DateTimeFormatter = + DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm'Z'") + .withZoneUTC() + var dateFormat: DateTimeFormatter = + DateTimeFormat.forPattern("yyyy-MM-dd'Z'") + .withZoneUTC() + var timeFormat: DateTimeFormatter = + DateTimeFormat.forPattern("HH:mm'Z'") + .withZoneUTC() + + fun fromDotNetSeconds(seconds: Long): DateInstant { + val dt = DOT_NET_EPOCH_DATE_TIME.plus(seconds * 1000L) + // Switch corrupted dates to a more recent date that won't cause issues on the client + return DateInstant((if (dt.isBefore(JAVA_EPOCH_DATE_TIME)) { JAVA_EPOCH_DATE_TIME } else dt).toInstant()) } - private val dateFormat = SimpleDateFormat("yyyy-MM-dd'Z'", Locale.ROOT).apply { - timeZone = TimeZone.getTimeZone("UTC") - } - private val timeFormat = SimpleDateFormat("HH:mm'Z'", Locale.ROOT).apply { - timeZone = TimeZone.getTimeZone("UTC") + + fun fromDateTimeSecondsFormat(value: String): DateInstant { + return DateInstant(dateTimeSecondsFormat.parseDateTime(value).toInstant()) } @JvmField diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt index 97535141a..4358cf9b1 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt @@ -23,7 +23,6 @@ package com.kunzisoft.keepass.database.element import com.kunzisoft.keepass.database.element.group.GroupVersionedInterface import com.kunzisoft.keepass.database.element.node.NodeVersionedInterface import com.kunzisoft.keepass.database.element.node.Type -import java.util.* enum class SortNodeEnum { DB, TITLE, USERNAME, CREATION_TIME, LAST_MODIFY_TIME, LAST_ACCESS_TIME; @@ -173,8 +172,8 @@ enum class SortNodeEnum { ) : NodeComparator(database, sortNodeParameters) { override fun compareBySpecificOrder(object1: T, object2: T): Int { - val creationCompare = object1.creationTime.date - .compareTo(object2.creationTime.date) + val creationCompare = object1.creationTime + .compareTo(object2.creationTime) return if (creationCompare == 0) NodeNaturalComparator(database, sortNodeParameters) .compare(object1, object2) @@ -192,8 +191,8 @@ enum class SortNodeEnum { ) : NodeComparator(database, sortNodeParameters) { override fun compareBySpecificOrder(object1: T, object2: T): Int { - val lastModificationCompare = object1.lastModificationTime.date - .compareTo(object2.lastModificationTime.date) + val lastModificationCompare = object1.lastModificationTime + .compareTo(object2.lastModificationTime) return if (lastModificationCompare == 0) NodeNaturalComparator(database, sortNodeParameters) .compare(object1, object2) @@ -211,8 +210,8 @@ enum class SortNodeEnum { ) : NodeComparator(database, sortNodeParameters) { override fun compareBySpecificOrder(object1: T, object2: T): Int { - val lastAccessCompare = object1.lastAccessTime.date - .compareTo(object2.lastAccessTime.date) + val lastAccessCompare = object1.lastAccessTime + .compareTo(object2.lastAccessTime) return if (lastAccessCompare == 0) NodeNaturalComparator(database, sortNodeParameters) .compare(object1, object2) diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt index 8045a7ef8..69e3b8a6e 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt @@ -36,13 +36,12 @@ import com.kunzisoft.keepass.database.element.node.NodeIdUUID import com.kunzisoft.keepass.database.element.node.NodeKDBXInterface import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.database.element.security.ProtectedString +import com.kunzisoft.keepass.utils.UnsignedLong import com.kunzisoft.keepass.utils.readParcelableCompat import com.kunzisoft.keepass.utils.readStringIntMap import com.kunzisoft.keepass.utils.readStringParcelableMap import com.kunzisoft.keepass.utils.writeStringIntMap import com.kunzisoft.keepass.utils.writeStringParcelableMap -import com.kunzisoft.keepass.utils.UnsignedLong -import java.util.Date import java.util.UUID class EntryKDBX : EntryVersioned, NodeKDBXInterface { @@ -363,18 +362,16 @@ class EntryKDBX : EntryVersioned, NodeKDBXInte } fun removeOldestEntryFromHistory(): EntryKDBX? { - var min: Date? = null + var min: DateInstant? = null var index = -1 - for (i in history.indices) { val entry = history[i] - val lastMod = entry.lastModificationTime.date - if (min == null || lastMod.before(min)) { + val lastModification = entry.lastModificationTime + if (min == null || lastModification.isBefore(min)) { index = i - min = lastMod + min = lastModification } } - return if (index != -1) { history.removeAt(index) } else null diff --git a/database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt index a9548a1e2..8cfdcbd39 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt @@ -19,9 +19,6 @@ */ package com.kunzisoft.keepass.database.file -import java.text.SimpleDateFormat -import java.util.* - object DatabaseKDBXXML { const val ElemDocNode = "KeePassFile" @@ -128,8 +125,4 @@ object DatabaseKDBXXML { const val ElemCustomData = "CustomData" const val ElemStringDictExItem = "Item" - - val DateFormatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT).apply { - timeZone = TimeZone.getTimeZone("UTC") - } } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt deleted file mode 100644 index cec17db10..000000000 --- a/database/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ -package com.kunzisoft.keepass.database.file - -import org.joda.time.DateTime -import org.joda.time.DateTimeZone -import org.joda.time.Duration -import java.util.* - -object DateKDBXUtil { - - private val dotNetEpoch = DateTime(1, 1, 1, 0, 0, 0, DateTimeZone.UTC) - private val javaEpoch = DateTime(1970, 1, 1, 0, 0, 0, DateTimeZone.UTC) - private val epochOffset = (javaEpoch.millis - dotNetEpoch.millis) / 1000L - - fun convertKDBX4Time(seconds: Long): Date { - val dt = dotNetEpoch.plus(seconds * 1000L) - // Switch corrupted dates to a more recent date that won't cause issues on the client - return if (dt.isBefore(javaEpoch)) { - javaEpoch.toDate() - } else dt.toDate() - } - - fun convertDateToKDBX4Time(date: Date): Long { - val duration = Duration(javaEpoch, DateTime(date)) - val seconds = duration.millis / 1000L - return seconds + epochOffset - } -} \ No newline at end of file diff --git a/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt index c4ff17da9..a310d1507 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt @@ -165,7 +165,7 @@ class DatabaseInputKDB(database: DatabaseKDB) } 0x0003 -> { newGroup?.let { group -> - group.creationTime = DateInstant(cipherInputStream.readBytes5ToDate()) + group.creationTime = cipherInputStream.readBytes5ToDate() } ?: newEntry?.let { entry -> var iconId = cipherInputStream.readBytes4ToUInt().toKotlinInt() @@ -178,7 +178,7 @@ class DatabaseInputKDB(database: DatabaseKDB) } 0x0004 -> { newGroup?.let { group -> - group.lastModificationTime = DateInstant(cipherInputStream.readBytes5ToDate()) + group.lastModificationTime = cipherInputStream.readBytes5ToDate() } ?: newEntry?.let { entry -> entry.title = cipherInputStream.readBytesToString(fieldSize) @@ -186,7 +186,7 @@ class DatabaseInputKDB(database: DatabaseKDB) } 0x0005 -> { newGroup?.let { group -> - group.lastAccessTime = DateInstant(cipherInputStream.readBytes5ToDate()) + group.lastAccessTime = cipherInputStream.readBytes5ToDate() } ?: newEntry?.let { entry -> entry.url = cipherInputStream.readBytesToString(fieldSize) @@ -194,7 +194,7 @@ class DatabaseInputKDB(database: DatabaseKDB) } 0x0006 -> { newGroup?.let { group -> - group.expiryTime = DateInstant(cipherInputStream.readBytes5ToDate()) + group.expiryTime = cipherInputStream.readBytes5ToDate() } ?: newEntry?.let { entry -> entry.username = cipherInputStream.readBytesToString(fieldSize) @@ -221,22 +221,22 @@ class DatabaseInputKDB(database: DatabaseKDB) group.groupFlags = cipherInputStream.readBytes4ToUInt().toKotlinInt() } ?: newEntry?.let { entry -> - entry.creationTime = DateInstant(cipherInputStream.readBytes5ToDate()) + entry.creationTime = cipherInputStream.readBytes5ToDate() } } 0x000A -> { newEntry?.let { entry -> - entry.lastModificationTime = DateInstant(cipherInputStream.readBytes5ToDate()) + entry.lastModificationTime = cipherInputStream.readBytes5ToDate() } } 0x000B -> { newEntry?.let { entry -> - entry.lastAccessTime = DateInstant(cipherInputStream.readBytes5ToDate()) + entry.lastAccessTime = cipherInputStream.readBytes5ToDate() } } 0x000C -> { newEntry?.let { entry -> - entry.expiryTime = DateInstant(cipherInputStream.readBytes5ToDate()) + entry.expiryTime = cipherInputStream.readBytes5ToDate() } } 0x000D -> { diff --git a/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt index ba96188ef..09d2be6d8 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt @@ -42,7 +42,6 @@ import com.kunzisoft.keepass.database.exception.* import com.kunzisoft.keepass.database.file.DatabaseHeaderKDBX import com.kunzisoft.keepass.database.file.DatabaseHeaderKDBX.Companion.FILE_VERSION_40 import com.kunzisoft.keepass.database.file.DatabaseKDBXXML -import com.kunzisoft.keepass.database.file.DateKDBXUtil import com.kunzisoft.keepass.stream.HashedBlockInputStream import com.kunzisoft.keepass.stream.HmacBlockInputStream import com.kunzisoft.keepass.tasks.ProgressTaskUpdater @@ -827,11 +826,10 @@ class DatabaseInputKDBX(database: DatabaseKDBX) @Throws(IOException::class, XmlPullParserException::class) private fun readDateInstant(xpp: XmlPullParser): DateInstant { val sDate = readString(xpp) - var utcDate: Date? = null - + var utcDate = DateInstant() if (mDatabase.kdbxVersion.isBefore(FILE_VERSION_40)) { try { - utcDate = DatabaseKDBXXML.DateFormatter.parse(sDate) + utcDate = DateInstant.fromDateTimeSecondsFormat(sDate) } catch (e: ParseException) { // Catch with null test below } @@ -842,12 +840,10 @@ class DatabaseInputKDBX(database: DatabaseKDBX) System.arraycopy(buf, 0, buf8, 0, min(buf.size, 8)) buf = buf8 } - val seconds = bytes64ToLong(buf) - utcDate = DateKDBXUtil.convertKDBX4Time(seconds) + utcDate = DateInstant.fromDotNetSeconds(seconds) } - - return DateInstant(utcDate ?: Date(0L)) + return utcDate } @Throws(IOException::class, XmlPullParserException::class) diff --git a/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt index 423024e34..f6eb8a403 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt @@ -41,7 +41,6 @@ import com.kunzisoft.keepass.database.file.DatabaseHeaderKDBX import com.kunzisoft.keepass.database.file.DatabaseHeaderKDBX.Companion.FILE_VERSION_40 import com.kunzisoft.keepass.database.file.DatabaseHeaderKDBX.Companion.FILE_VERSION_41 import com.kunzisoft.keepass.database.file.DatabaseKDBXXML -import com.kunzisoft.keepass.database.file.DateKDBXUtil import com.kunzisoft.keepass.stream.HashedBlockOutputStream import com.kunzisoft.keepass.stream.HmacBlockOutputStream import com.kunzisoft.keepass.utils.* @@ -411,14 +410,15 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX) } @Throws(IllegalArgumentException::class, IllegalStateException::class, IOException::class) - private fun writeDateInstant(name: String, value: DateInstant) { - val date = value.date + private fun writeDateInstant(name: String, date: DateInstant) { if (header!!.version.isBefore(FILE_VERSION_40)) { - writeString(name, DatabaseKDBXXML.DateFormatter.format(date)) + writeString(name, date.toDateTimeSecondsFormat()) } else { - val buf = longTo8Bytes(DateKDBXUtil.convertDateToKDBX4Time(date)) - val b64 = String(Base64.encode(buf, BASE64_FLAG)) - writeString(name, b64) + writeString(name, String( + Base64.encode( + longTo8Bytes(date.toDotNetSeconds()), BASE64_FLAG) + ) + ) } } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt index 2e4508124..2d20e2a0e 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt @@ -75,16 +75,16 @@ class EntryOutputKDB(private val mDatabase: DatabaseKDB, writeStringToStream(mOutputStream, mEntry.notes) // Create date - writeDate(CREATE_FIELD_TYPE, dateTo5Bytes(mEntry.creationTime.date)) + writeDate(CREATE_FIELD_TYPE, dateTo5Bytes(mEntry.creationTime)) // Modification date - writeDate(MOD_FIELD_TYPE, dateTo5Bytes(mEntry.lastModificationTime.date)) + writeDate(MOD_FIELD_TYPE, dateTo5Bytes(mEntry.lastModificationTime)) // Access date - writeDate(ACCESS_FIELD_TYPE, dateTo5Bytes(mEntry.lastAccessTime.date)) + writeDate(ACCESS_FIELD_TYPE, dateTo5Bytes(mEntry.lastAccessTime)) // Expiration date - writeDate(EXPIRE_FIELD_TYPE, dateTo5Bytes(mEntry.expiryTime.date)) + writeDate(EXPIRE_FIELD_TYPE, dateTo5Bytes(mEntry.expiryTime)) // Binary description mOutputStream.write(BINARY_DESC_FIELD_TYPE) diff --git a/database/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt index 9a2e62c03..481d9f18b 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt @@ -48,22 +48,22 @@ class GroupOutputKDB(private val mGroup: GroupKDB, // Create date mOutputStream.write(CREATE_FIELD_TYPE) mOutputStream.write(DATE_FIELD_SIZE) - mOutputStream.write(dateTo5Bytes(mGroup.creationTime.date)) + mOutputStream.write(dateTo5Bytes(mGroup.creationTime)) // Modification date mOutputStream.write(MOD_FIELD_TYPE) mOutputStream.write(DATE_FIELD_SIZE) - mOutputStream.write(dateTo5Bytes(mGroup.lastModificationTime.date)) + mOutputStream.write(dateTo5Bytes(mGroup.lastModificationTime)) // Access date mOutputStream.write(ACCESS_FIELD_TYPE) mOutputStream.write(DATE_FIELD_SIZE) - mOutputStream.write(dateTo5Bytes(mGroup.lastAccessTime.date)) + mOutputStream.write(dateTo5Bytes(mGroup.lastAccessTime)) // Expiration date mOutputStream.write(EXPIRE_FIELD_TYPE) mOutputStream.write(DATE_FIELD_SIZE) - mOutputStream.write(dateTo5Bytes(mGroup.expiryTime.date)) + mOutputStream.write(dateTo5Bytes(mGroup.expiryTime)) // Image ID mOutputStream.write(IMAGEID_FIELD_TYPE) diff --git a/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt b/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt index 0196f4f0d..1f83169ee 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt @@ -187,34 +187,34 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { fun merge(databaseToMerge: DatabaseKDBX) { // Merge settings - if (database.nameChanged.date.before(databaseToMerge.nameChanged.date)) { + if (database.nameChanged.isBefore(databaseToMerge.nameChanged)) { database.name = databaseToMerge.name database.nameChanged = databaseToMerge.nameChanged } - if (database.descriptionChanged.date.before(databaseToMerge.descriptionChanged.date)) { + if (database.descriptionChanged.isBefore(databaseToMerge.descriptionChanged)) { database.description = databaseToMerge.description database.descriptionChanged = databaseToMerge.descriptionChanged } - if (database.defaultUserNameChanged.date.before(databaseToMerge.defaultUserNameChanged.date)) { + if (database.defaultUserNameChanged.isBefore(databaseToMerge.defaultUserNameChanged)) { database.defaultUserName = databaseToMerge.defaultUserName database.defaultUserNameChanged = databaseToMerge.defaultUserNameChanged } - if (database.keyLastChanged.date.before(databaseToMerge.keyLastChanged.date)) { + if (database.keyLastChanged.isBefore(databaseToMerge.keyLastChanged)) { database.keyChangeRecDays = databaseToMerge.keyChangeRecDays database.keyChangeForceDays = databaseToMerge.keyChangeForceDays database.isKeyChangeForceOnce = databaseToMerge.isKeyChangeForceOnce database.keyLastChanged = databaseToMerge.keyLastChanged } - if (database.recycleBinChanged.date.before(databaseToMerge.recycleBinChanged.date)) { + if (database.recycleBinChanged.isBefore(databaseToMerge.recycleBinChanged)) { database.isRecycleBinEnabled = databaseToMerge.isRecycleBinEnabled database.recycleBinUUID = databaseToMerge.recycleBinUUID database.recycleBinChanged = databaseToMerge.recycleBinChanged } - if (database.entryTemplatesGroupChanged.date.before(databaseToMerge.entryTemplatesGroupChanged.date)) { + if (database.entryTemplatesGroupChanged.isBefore(databaseToMerge.entryTemplatesGroupChanged)) { database.entryTemplatesGroup = databaseToMerge.entryTemplatesGroup database.entryTemplatesGroupChanged = databaseToMerge.entryTemplatesGroupChanged } - if (database.settingsChanged.date.before(databaseToMerge.settingsChanged.date)) { + if (database.settingsChanged.isBefore(databaseToMerge.settingsChanged)) { database.color = databaseToMerge.color database.compressionAlgorithm = databaseToMerge.compressionAlgorithm database.historyMaxItems = databaseToMerge.historyMaxItems @@ -245,8 +245,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { } // Merge root group - if (rootGroup.lastModificationTime.date - .before(rootGroupToMerge.lastModificationTime.date)) { + if (rootGroup.lastModificationTime.isBefore(rootGroupToMerge.lastModificationTime)) { rootGroup.updateWith(rootGroupToMerge, updateParents = false) } // Merge children @@ -293,7 +292,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { val customIconToMerge = databaseToMerge.iconsManager.getIcon(customIconUuid) val customIconModificationToMerge = customIconToMerge?.lastModificationTime if (customIconModification != null && customIconModificationToMerge != null) { - if (customIconModification.date.before(customIconModificationToMerge.date)) { + if (customIconModification.isBefore(customIconModificationToMerge)) { customIcon.updateWith(customIconToMerge) } } else if (customIconModificationToMerge != null) { @@ -310,19 +309,17 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { val databaseIcon = database.iconsManager.getIcon(deletedObjectId) val databaseIconModificationTime = databaseIcon?.lastModificationTime if (databaseEntry != null - && deletedObject.deletionTime.date - .after(databaseEntry.lastModificationTime.date)) { + && deletedObject.deletionTime.isAfter(databaseEntry.lastModificationTime)) { database.removeEntryFrom(databaseEntry, databaseEntry.parent) } if (databaseGroup != null - && deletedObject.deletionTime.date - .after(databaseGroup.lastModificationTime.date)) { + && deletedObject.deletionTime.isAfter(databaseGroup.lastModificationTime)) { database.removeGroupFrom(databaseGroup, databaseGroup.parent) } if (databaseIcon != null && ( databaseIconModificationTime == null - || (deletedObject.deletionTime.date.after(databaseIconModificationTime.date)) + || (deletedObject.deletionTime.isAfter(databaseIconModificationTime)) ) ) { database.removeCustomIcon(deletedObjectId) @@ -343,8 +340,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { val customDataItemModification = customDataItem.lastModificationTime val customDataItemToMergeModification = customDataItemToMerge.lastModificationTime if (customDataItemModification != null && customDataItemToMergeModification != null) { - if (customDataItemModification.date - .before(customDataItemToMergeModification.date)) { + if (customDataItemModification.isBefore(customDataItemToMergeModification)) { customData.put(customDataItemToMerge) } } else { @@ -399,8 +395,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { // If it's a deleted object, but another instance was updated // If entry parent to add exists and in current database if ((deletedObject == null - || deletedObject.deletionTime.date - .before(entryToMerge.lastModificationTime.date)) + || deletedObject.deletionTime.isBefore(entryToMerge.lastModificationTime)) && parentEntryToMerge != null) { database.addEntryTo(entryToMerge, parentEntryToMerge) } @@ -408,8 +403,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { // Merge independently custom data mergeCustomData(entry.customData, entryToMerge.customData) // Merge by modification time - if (entry.lastModificationTime.date - .before(entryToMerge.lastModificationTime.date) + if (entry.lastModificationTime.isBefore(entryToMerge.lastModificationTime) ) { addHistory(entry, entryToMerge) if (parentEntryToMerge == entry.parent) { @@ -421,8 +415,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { database.addEntryTo(entryToMerge, parentEntryToMerge) } } - } else if (entry.lastModificationTime.date - .after(entryToMerge.lastModificationTime.date) + } else if (entry.lastModificationTime.isAfter(entryToMerge.lastModificationTime) ) { addHistory(entryToMerge, entry) } @@ -477,8 +470,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { if (group == null) { // If group parent to add exists and in current database if ((deletedObject == null - || deletedObject.deletionTime.date - .before(groupToMerge.lastModificationTime.date)) + || deletedObject.deletionTime.isBefore(groupToMerge.lastModificationTime)) && parentGroupToMerge != null) { database.addGroupTo(groupToMerge, parentGroupToMerge) } @@ -486,8 +478,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { // Merge independently custom data mergeCustomData(group.customData, groupToMerge.customData) // Merge by modification time - if (group.lastModificationTime.date - .before(groupToMerge.lastModificationTime.date) + if (group.lastModificationTime.isBefore(groupToMerge.lastModificationTime) ) { if (parentGroupToMerge == group.parent) { group.updateWith(groupToMerge, false) diff --git a/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt b/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt index 4dfe323b4..463e24841 100644 --- a/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt +++ b/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt @@ -232,7 +232,7 @@ class EntryInfo : NodeInfo { } creditCard?.expiration?.let { expires = true - expiryTime = DateInstant(creditCard.expiration.millis) + expiryTime = DateInstant(creditCard.expiration.toInstant()) } creditCard?.number?.let { addUniqueField(Field(TemplateField.LABEL_NUMBER, ProtectedString(false, it))) diff --git a/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt b/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt index 223ef9fd6..4cad18242 100644 --- a/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt +++ b/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt @@ -19,6 +19,9 @@ */ package com.kunzisoft.keepass.utils +import com.kunzisoft.keepass.database.element.DateInstant +import org.joda.time.DateTime +import org.joda.time.Instant import java.io.IOException import java.io.InputStream import java.io.OutputStream @@ -93,7 +96,7 @@ fun InputStream.readBytes2ToUShort(): Int { } @Throws(IOException::class) -fun InputStream.readBytes5ToDate(): Date { +fun InputStream.readBytes5ToDate(): DateInstant { return bytes5ToDate(readBytesLength(5)) } @@ -211,7 +214,7 @@ fun bytes16ToUuid(buf: ByteArray): UUID { * Unpack date from 5 byte format. The five bytes at 'offset' are unpacked * to a java.util.Date instance. */ -fun bytes5ToDate(buf: ByteArray, calendar: Calendar = Calendar.getInstance()): Date { +fun bytes5ToDate(buf: ByteArray): DateInstant { val dateSize = 5 val cDate = ByteArray(dateSize) System.arraycopy(buf, 0, cDate, 0, dateSize) @@ -234,9 +237,14 @@ fun bytes5ToDate(buf: ByteArray, calendar: Calendar = Calendar.getInstance()): D // File format is a 1 based month, java Calendar uses a zero based month // File format is a 1 based day, java Calendar uses a 1 based day - calendar.set(year, month - 1, day, hour, minute, second) - - return calendar.time + return DateInstant(Instant.ofEpochMilli(DateTime( + year, + month - 1, + day, + hour, + minute, + second + ).millis)) } @@ -284,19 +292,17 @@ fun uuidTo16Bytes(uuid: UUID): ByteArray { return buf } -fun dateTo5Bytes(date: Date, calendar: Calendar = Calendar.getInstance()): ByteArray { - val buf = ByteArray(5) - calendar.time = date - - val year = calendar.get(Calendar.YEAR) +fun dateTo5Bytes(dateInstant: DateInstant): ByteArray { + val year = dateInstant.getYear() // File format is a 1 based month, java Calendar uses a zero based month - val month = calendar.get(Calendar.MONTH) + 1 + val month = dateInstant.getMonth() + 1 // File format is a 1 based day, java Calendar uses a 1 based day - val day = calendar.get(Calendar.DAY_OF_MONTH) - val hour = calendar.get(Calendar.HOUR_OF_DAY) - val minute = calendar.get(Calendar.MINUTE) - val second = calendar.get(Calendar.SECOND) + val day = dateInstant.getDay() + val hour = dateInstant.getHour() + val minute = dateInstant.getMinute() + val second = dateInstant.getSecond() + val buf = ByteArray(5) buf[0] = UnsignedInt(year shr 6 and 0x0000003F).toKotlinByte() buf[1] = UnsignedInt(year and 0x0000003F shl 2 or (month shr 2 and 0x00000003)).toKotlinByte() buf[2] = (month and 0x00000003 shl 6 diff --git a/database/src/test/java/com/kunzisoft/keepass/tests/utils/ValuesTest.kt b/database/src/test/java/com/kunzisoft/keepass/tests/utils/ValuesTest.kt index 68d91fcac..3471febe4 100644 --- a/database/src/test/java/com/kunzisoft/keepass/tests/utils/ValuesTest.kt +++ b/database/src/test/java/com/kunzisoft/keepass/tests/utils/ValuesTest.kt @@ -22,6 +22,8 @@ package com.kunzisoft.keepass.tests.utils import com.kunzisoft.keepass.database.element.DateInstant import com.kunzisoft.keepass.utils.* import junit.framework.TestCase +import org.joda.time.DateTime +import org.joda.time.Instant import org.junit.Assert.assertArrayEquals import java.io.ByteArrayOutputStream import java.util.* @@ -136,24 +138,29 @@ class ValuesTest : TestCase() { } fun testDate() { - val cal = Calendar.getInstance() + val expected = DateInstant( + Instant.ofEpochMilli( + DateTime( + 2008, + 1, + 2, + 3, + 4, + 5 + ).millis)) - val expected = Calendar.getInstance() - expected.set(2008, 1, 2, 3, 4, 5) + val actual = DateInstant(bytes5ToDate(dateTo5Bytes(expected))) - val actual = Calendar.getInstance() - actual.time = DateInstant(bytes5ToDate(dateTo5Bytes(expected.time, cal), cal)).date - - val jDate = DateInstant(System.currentTimeMillis()) + val jDate = DateInstant() val intermediate = DateInstant(jDate) - val cDate = DateInstant(bytes5ToDate(dateTo5Bytes(intermediate.date))) + val cDate = DateInstant(bytes5ToDate(dateTo5Bytes(intermediate))) - assertEquals("Year mismatch: ", 2008, actual.get(Calendar.YEAR)) - assertEquals("Month mismatch: ", 1, actual.get(Calendar.MONTH)) - assertEquals("Day mismatch: ", 2, actual.get(Calendar.DAY_OF_MONTH)) - assertEquals("Hour mismatch: ", 3, actual.get(Calendar.HOUR_OF_DAY)) - assertEquals("Minute mismatch: ", 4, actual.get(Calendar.MINUTE)) - assertEquals("Second mismatch: ", 5, actual.get(Calendar.SECOND)) + assertEquals("Year mismatch: ", 2008, actual.getYear()) + assertEquals("Month mismatch: ", 1, actual.getMonth()) + assertEquals("Day mismatch: ", 2, actual.getDay()) + assertEquals("Hour mismatch: ", 3, actual.getHour()) + assertEquals("Minute mismatch: ", 4, actual.getMinute()) + assertEquals("Second mismatch: ", 5, actual.getSecond()) assertTrue("jDate and intermediate not equal", jDate == intermediate) assertTrue("jDate $jDate and cDate $cDate not equal", cDate == jDate) } diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index a22243662..0378f07ac 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -2,4 +2,5 @@ * Generate keyfile #1290 * Hide template group #1894 * Group count sum recursively #421 + * Fix when selecting date fields #1695 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 \ No newline at end of file From 587bfdc1627e5f208eca0f042efb84053d12c56e Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 4 Nov 2024 20:02:19 +0100 Subject: [PATCH 095/119] fix: Month save --- .../java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt b/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt index 4cad18242..df1c6ea01 100644 --- a/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt +++ b/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt @@ -235,11 +235,9 @@ fun bytes5ToDate(buf: ByteArray): DateInstant { val minute = dw4 and 0x0000000F shl 2 or (dw5 shr 6) val second = dw5 and 0x0000003F - // File format is a 1 based month, java Calendar uses a zero based month - // File format is a 1 based day, java Calendar uses a 1 based day return DateInstant(Instant.ofEpochMilli(DateTime( year, - month - 1, + month, day, hour, minute, @@ -294,9 +292,7 @@ fun uuidTo16Bytes(uuid: UUID): ByteArray { fun dateTo5Bytes(dateInstant: DateInstant): ByteArray { val year = dateInstant.getYear() - // File format is a 1 based month, java Calendar uses a zero based month - val month = dateInstant.getMonth() + 1 - // File format is a 1 based day, java Calendar uses a 1 based day + val month = dateInstant.getMonth() val day = dateInstant.getDay() val hour = dateInstant.getHour() val minute = dateInstant.getMinute() From e623010e914cf0f1da6835b66dc4dffc99ff86cd Mon Sep 17 00:00:00 2001 From: Sylvain Pichon Date: Mon, 4 Nov 2024 06:41:13 +0000 Subject: [PATCH 096/119] Translated using Weblate (French) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 125da7379..8c76bfd83 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -605,7 +605,7 @@ Nom de l\'icône Couleur de la base de données Couleur de premier plan de l\'entrée - Permission + Autorisation Vous n\'avez pas autorisé l\'application à utiliser une alarme exacte. Par conséquent, les fonctions nécessitant une minuterie ne seront pas effectuées avec une heure exacte. Couleur d\'arrière plan de l\'entrée Étiquettes @@ -681,7 +681,7 @@ Impossible d\'obtenir la réponse du challenge. Annulé par l\'utilisateur. Le pilote pour %1$s est nécessaire. - Impossible de fusionner à partir d\'une base de données V1. + Impossible de fusionner à partir d\'un fichier de base de données kdb Fusion terminée avec succès Info Recherche, verrouillage, historique, propriétés From f72c9704d9cab3718ab3a1a4ab0fe9fa1ac512a6 Mon Sep 17 00:00:00 2001 From: Random Date: Tue, 5 Nov 2024 15:19:32 +0000 Subject: [PATCH 097/119] Translated using Weblate (Italian) Currently translated at 100.0% (659 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/ --- app/src/main/res/values-it/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 58722ba8b..345252d5c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -703,4 +703,5 @@ Sole Segui il sistema Ricarica il database con le ultime modifiche. + Risposta \ No newline at end of file From dce255dc5881271b15ecf5468a3f5107b697222d Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Tue, 5 Nov 2024 12:27:49 +0000 Subject: [PATCH 098/119] Translated using Weblate (Azerbaijani) Currently translated at 91.9% (606 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 392 +++++++++++++++++++++++-- 1 file changed, 368 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 96c509dea..dd42bfddd 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -3,11 +3,11 @@ Məlumat Əlaqə Ana səhifə - Qeyd əlavə et - Qeydə düzəliş et + Şifrə əlavə et + Şifrəyə düzəliş et Qrup əlavə et Açar yaratma funksiyası - Taymaut + Taym-aut Məlumat bazasını kilidləmədən öncəki boşluq müddəti Tətbiq Mötərizə @@ -15,7 +15,7 @@ İcazə ver Mübadilə buferi təmizləndi Mübadilə buferi xətası - Mübadilə buferinin boşluq müddəti + Mübadilə buferinin taym-aut (boşda qalma) müddəti Mübadilə buferində məlumatların saxlanma müddəti (əgər cihazınız dəstəkləyirsə) Arxaplan Faylı aç @@ -23,11 +23,11 @@ Qrup əlavə et Fayl əlavə et Fayl məlumatları - Şəxsiyyət məlumatları + Şəxsiyyəti təsdiq edən məlumatlar Birdəfəlik şifrə məlumatları Açar fayl təsdiqi - Aparat-təchizat açarı təsdiqi - Qeyd simvolu + Aparat-təchizat açarının təsdiqi + Şifrə ikonu Məlumat bazasının rəngi Dəyişiklikləri ləğv et? Şifrə generatoru @@ -35,8 +35,8 @@ Qoşma əlavə et %1$sfaylını mübadilə buferinə köçürmək üçün seçin Məlumat bazası açarı əldə edilir … - Doğrulama istəyi üçün gözlənilir … - Doğrulama cavabı üçün gözlənilir … + Doğrulama istəyi gözlənilir … + Doğrulama cavabı gözlənilir … Məlumat bazası Şablonlar Məlumat bazası məzmunun şifrəsi açılır … @@ -47,13 +47,13 @@ Ləğv et Qeydlər Şifrəni təsdiq et - UUID + UUID (Qlobal Unikal İdentifikator) Tarixçə Qoşmalar Açar fayl Aparat-təchizat açarı - Dəyişdirilmiş - Axtarılabilən + Modifikasiya edilmiş + Axtarıla bilən Şifrələr uyğun deyil. Hər bir sıranın bir adı olmalıdır. Bu etiket artıq mövcuddur. @@ -77,8 +77,8 @@ Mübadilə buferi təmizlənmədi Şifrə təsdiqi Müddəti bitdi - Qeydin ön plan rəngi - Qeydin arxaplan rəngi + Şifrənin ön plan rəngi + Şifrənin arxa plan rəngi Doğrula Ləğv et Şifrədəki söz sayısı @@ -86,10 +86,10 @@ Sil <strong>Müstəqilliyimiz qorumaq</strong>, <strong>xətaları düzəltmək</strong>,<strong>yeni funskiyalar əlavə etmək</strong> və <strong>hər zaman aktiv olmaq</strong>üçün<strong>sizin dəstəyinizə etibar edirik. Yaradıldı - Müddəti bitir + İstifadə müddəti biti Etiketlər Şifrə - Ən azından bir şəxsiyyət məlumatları təyin edilməlidir. + Ən azından bir ədəd şəxsiyyəti təyin edən məlumat təyin edilməlidir. Ən azından bir ədəd şifrə generatoru növü seçilməlidir. \"Transformasiya mərhələləri\" çox yüksəkdir. 2147483648-ə təyin edin. Malumat bazasını yadda saxlamaq mümkün olmadı. @@ -100,12 +100,12 @@ Açar bölməsi boş saxlanıla bilməz. Sahə adı Sahə dəyəri - Fayl tapılmadı. Onu fayl brauzerində yenidən açmağı yoxlayın. + Fayl tapılmadı. Onu fayl menecerində yenidən açmağı yoxlayın. Zədələnmiş fayl. Şifrəni təsdiq et Yaradılmış şifrə Qrup adı - Etiket adı + İkona adı Açar faylı Şifrəli cümlə %1$s üçün drayver lazımdır. @@ -117,7 +117,7 @@ Fayl meneceri Şifrə UUID-ni göstər - Şifrə və ya qrupa bağlı UUID-ni göstər + Şifrə və ya şifrə qrupuna bağlı UUID-ni göstər Qrupdaki şifrələrin sayını göstər Listdəki faylların həcmi Element listindəki mətnin ölçüsü @@ -130,8 +130,8 @@ Forum doldurma Klaviatura, avtomatik douldurma, mübadilə buferi Cihaz kilidini aç - Biometrik, cihaz şəxsiyyət məlumatları - Şifrələmə, açar hazırlama funskiyası + Biometrik, cihaz şəxsiyyətini təyin edən məlumatlar + Şifrələmə, açar yaratma funskiyası Ana açar parametrləri Parametrlər Tətbiq parametrləri @@ -250,7 +250,7 @@ Klaviaturanı dəyişdir Açarlar Düyməyə toxunduqda səs çıxar - Məlumat bazasının şifrəsini açmaq üçün şifrə və\\və ya açar faylı daxil edin.\n\nMəlumat bazası faylını hər dəfə dəyişəndən sonra etibarlı bir yerdə ehtiyatda nüsxələyin. + Məlumat bazanızın şifrəsini açmaq üçün şifrə və\\və ya açar faylı daxil edin.\n\nMəlumat bazası faylını hər dəfə dəyişəndən sonra etibarlı bir yerdə ehtiyat üçün nüsxələyin. Biometrik kilid açma Məlumat bazasını açmaq üçün biometrikləri skan etməyə imkan verir Cihaz şəxsiyyət məlumatları ilə kilid açma @@ -309,7 +309,351 @@ Birdəfəlik şifrə (OTP) təyin edin Məlaumat bazasının şifrəsini açın Məlumat bazasını dəyişiklik edilməsinə qarşı qoruyun - Bölməni nüsxələyin - Nüsxələnmiş bölmələr istənilən yerə köçürülə bilər.\n\nÜntünlük verdiyiniz form doldurma metodunu seçin. + Bölməni (sahəni) nüsxələyin + Nüsxələnmiş bölmələr (sahələr) istənilən yerə nüsxələnə bilər.\n\nÜntünlük verdiyiniz form doldurma metodunu seçin. Məlumat bazasını kilidləyin + Azadlığımızı qorumaq və daima aktiv olmağınız üçün sizin yardımınıza güvənirik. + Bu görünüş stilisizin əliaçıqlığınız sayəsində mövuddur. + Bu xüsusiyyət <strong>hazırlıq mərhələsindədir</strong> və tezliklə <strong>istifadə verilməsi üçün sizin <strong>yardımınıza ehtiyyacı var. + tərtibatçıları yeni funksiyalar əlavə etməyəsizin rəylərinizə əsasən xətaları düzəltməyə həvəsləndirirsiniz. + Yardım et + KiB + MiB + GiB + Sadə + Yadda saxla + Nömrə + CVV + PİN + İBAN + Standart + Hər bir halda fayl əlavə edilsinmi? + Əlaqəsiz məlumatların silinməsi məlumat bazanızın həcmini azalda bilər, lakin KeePass modulları üçün olan məlumatları da silə bilər. + Hər bir halda bu məlumatlar silinsinmi? + Boş bir açar faylı əlavə etmək məsləhət görülmür. + Açar faylın məzmunu heç vaxt dəyişdirilə bilinməməlidir və ən yaxşı halda təsadüfi yaradılmış məlumatlardan ibarət olmalıdır. + Məlumat bazası faylınızda olan informasiya tətbiq xaricində dəyişdirilib. + Ən son dəyişikliklərlə məlumat bazasını yenidən yükləyin. + Bildiriş icazəsi, məlumat bazasının statusunu göstərməyə və onu əlçatan bir düymə ilə kilidləməyə imkan verir.\n\nƏgər icazəni aktivləşdirməsəniz arxa planda açıq olan məlumat bazası, ön planda başqa bir tətbiq varkən görünməyəcəkdir. + Məlumatları birləşdirin, məlumat bazasını yadda saxlayaraq xarici dəyişikliklərin üzərinə yazın və ya ən son dəyişikliklər ilə onu yenidən yükləyin. + Mübadilə buferi + Cihazınızın mübadilə buferindən istifadə edərək şifrə sahələrini (bölmələrini) nüsxələyin + Mübadilə buferi bildirişləri + Şifrəni göstərərkən sahələri (bölmə) nüsxələmək üçün mübadilə buferi bildirişlərini göstər + Əgər mübadilə buferinin avtomatik silinməsi uğursuz olarsa, onun tarixçəsini əllə silin. + Digər bir çox şifrə menecerlerindən fərqli olaraq, bu tətbiq reklamsız,azad lisenziyaya sahibdir və hansı versiyanı istifadə etdiyinizdən asılı olmayaraq, şəxsi məlumatlarınızı öz serverlərində toplamır. + Bu xüsusiyyət, şifrələnən şəxsiyyəti təsdiq edən məlumatları cihazın təhlükəsiz açar bazasında saxlayacaqdır.\n\nƏməliyyat sisteminin yerli APİ-nin tətbiqindən asılı olaraq, tam olaraq funksional olmaya bilər.\n\nCihazın istehsalçısı və istifadə etdiyiniz ROM-un tərtibatçısı ilə açar bazasının uyğunluğu və təhlükəsizliyini yoxlayın. + Cümlə daxili təkliflər + Birbaşa uyğun olan klaviaturadan avtomatik doldurma təkliflərini göstərməyə çalış + Əllə seçim + İstifadəçiyə məlumat bazası şifrəsini seçməyə imkan verən seçimi göstər + Axtarış məlumatlarını yadda saxla + Avtomatik doldurma təklifləri əlavə edildi. + Ana açar olmamasına icazə ver + Məlumat bazasını standart olaraq yazma-qorumalı (dəyişməz) aç + Məlumat bazasını avtomatik olaraq yadda saxla + Bütün təlim məlumatlarını yenidən göstər + Təlim ipuclarını sıfırlamaq + Məlumat bazanıza məlumatlar (fayl) əlavə edin + Şifrələrinizi geri əldə etmək üçün başlıq, istifadəçi adı və ya digər sahələrin (bölmə) məzmununu daxil et. + Şifrəyə düzəliş edin + Şifrənizlə əlaqələndirmək üçün güclü bir şifrə yaradın, anketin kriteriyalarına görə onu asanlıqla müəyyənlşdirin və güvənli şifrəni unutmayın. + Güclü şifrə yaradın + Məlumat bazasını kilidlə + Məlumat bazası fayllarını yaratmaq, açmaq və yadda saxlamaq üçün ACTION_CREATE_DOCUMENT və ACTION_OPEN_DOCUMENT funksiyalarını həyata keçirə bilən bir fayl meneceri tələb olunur. + Şəbəkə nöqtəsinin alt kateqoriyası + Şəbəkə nöqtəsi əlavə edin + Şifrənin görünüb-görünməməsinin dəyişdirilməsini təkrarlayın + Naviqasiya başlığı + Naviqasiya panelini aç + Naviqasiya panelini bağla + Sahə (bölmə) əlavə et + Sahəni (bölməni) sil + Sahələri (bölmələri) bağla + KeePassDX©%1$dKunzisoftaçıq mənbəlidir vəondan heç bir reklam yoxdur.\nGPLv3lisenziyasına sahibdir, hər hansısa bir qarantiyası yoxdur. + İdxal et + Avtomatik yazma + Avtomatik yazma sırası + Şifrə məlumatları tapılmadı. + Özəl məlumat + Başlıq + Tək səfərlik şifrə təyin et + OTP növü + Sirr + Müddət (saniyə) + Sayğac + Rəqəmlər + Axtarış filterləri + Alqoritma + Hazırki qrup + Müntəzəm ifadə + Debet / Kredit Kartı + Sahib + Səxsiyyət Vəsiqəsi + Ad + Verildiyi yer + Verildiyi tarix + Elektron poçt + Elektron poçt adresi + Wi-Fi + SSİD + Növ + Kripto valyuta pul kisəsi + Jeton + Şəxsi açar + Ortaq açar + Başlanğıc + Hesab + Bank + Bank adı + SWIFT / BIC + Təhlükəsizlik Qeydi + Üzvlük + Şablon + Versiya + OTP + URL + İstifadəçi adı + Arcfour axın şifrəsi dəstəklənmir. + Faylı yaratmaq mümkün olmadə + Bu URİ-nin KeePassDX-də istifadəsi mümkün olmadı. + Böyük/kiçik hərf həssaslığı + Məlumat bazasını oxumaq mümkün olmadı. + Fayl yolunun doğru olduğundan əmin olun. + Etibarsız gizli OTP. + Ad daxil edin. + Bu söz rezerv edilib və istifadəsi mümkün deyil. + Açar faylı seçin. + Aparat-təchizat açarı seçin. + Bütün məlumat bazanızı yükləyəcək qədər yaddaşda yer yoxdur. + XML xətalı formalaşıb. + Məlumat bazasını yükləmək mümkün olmadı. + Açarı yükləmək mümkün olmadı. KDF \"Yaddaş İstifadəsini\" azaltmağa çalışın. + Bu şifrəni buraya köçürə bilməzsiniz. + Bu şifrəni buraya nüsxələyə bilməzsiniz. + Jeton %1$d ilə %2$d arası rəqəmlərdən ibarət olmalıdır. + Mövcud OTP növü bu form tərəfindən tanınmır, onun doğrulaması artıq düzgün şəkildə jeton yaratmaya bilər. + Bu mətn istənilən məlumat (fayl) ilə uyğunlaşmır. + Dəyişməz (yalnız oxuna bilən) məlumat bazasında yeni bir məlumatın yadda saxlanılmasına icazə verilmir + Sahə (bölmə) adı artıq mövcuddur. + Mləlumat bazası URİ-sini geri qaytarmaq olmur. + Listi düzgün şəkildə yenidən hazırlamaq mümkün deyil. + Qarşıya yükləməyə çalışdığınız faylın həcmi çox böyükdür. + Fayl məlumatları artıq mövcuddur. + Fayl məlumatları qarşıya yüklənərkən xəta baş verdi. + Fayl məlumatlarını silərkən xəta baş verdi. + Məlumat bazasında prosses həyata keçirilərkən xəta baş verdi. + Doğrulama istəyindən cavab almaq mümkün deyil. + kdb məlumat bazası faylı ilə birləşdirmə etmək mümkün deyil + Şəxsiyyəti təsdiq edən məlumatları oxumaq mümkün olmadı. + Yanlış alqoritma. + %1$s eyni UUİD dəyərinə sahib %2$s artıq mövcuddur. + Məlumat bazasının formatını tanımaq mümkün olmadı. + Açar faylı boşdur. + Uzunluq + Şifrələri gizlət + Şifrələri standart olaraq (***) ilə maskala + Şifrələri rəngləndir + Şifrə hərflərini (simvollarını) növə görə rəngləndir + İstifadəçi adlarını göstər + Şifrə siyahılarında olan istifadəçi adlarını göstər + Şifrələrin sayını göstər + OTP Jetononu göstər + Şifrələrin siyahısında OTP jetonlarını göstər + Cihaz kilid açma açarını sil + URL-ni aç + Yazma qoruması + Modifikasiya edilə bilən + Zibil qutusunu boşalt + Tarixçəni bərpa et + Tarixçəni sil + Xarici ikona + Mənfi + Heç vaxt + Axtarılan nəticə tapılmadı + Bu URL-ni açmaq üçün bir veb brauzer quraşdır. + Mövcud kassanı aç + Yeni kassa yarat + Sürətli axtarış + Məlumat bazasını açarkən axtarış tələb et + Alt domendə axtarış + Veb domenləri, alt domen məhdudiyyətləri ilə arxtarın + Yeni məlumat bazası yaradılır … + İşləyir … + Qoruma + Yazma qorumalı + Fayl menecerinizdən asılı olaraq, KeePassDX cihazınızın yaddaşına yazmasına icazə verilməyə bilər. + Məluamt bazasında təkrarlanan UUİD-lər mövcuddur. + Təkrarlananlar üçün yeni UUİD-lər yaradaraq problemi həll edib davam et istəyirsinizmi? + Axtarış modu + Yadda saxlama modu + Seçim modu + Qeydiyyat modu + Məlumat bazalarının yerlərini xatırlayın + Məlumat bazalarının harada saxlanıldığını izlə + Aparat-təchizat açarlarının harada istifadə olunduğunu izlə + Son məlumat bazaları siyahısındakı yararsız linkləri gizlət + Tətbiq parametrlərini idxal et + Tətbiq parametrlərini idxal etmək üçün fayl seçin + Transformasiya turları + Əlavə şifrələmə turları, brute force hücumlarına qarşı yüksək qoruma təmin edər, lakin yükləmə və yadda saxlama prossesini ciddi şəkildə yavaşladır. + Yaddaş istifadəsi + Açar yaratma funksiyası tərəfindən istifadə ediləcək yaddaşın miqdarı. + Paralellik + Şifrələmə alqoritmasının açarını hazırlamaq üçün ana açar, təsadüfi açar yaratma funksiyasından istifadə edilərək çevrilir. + Açar yaratma funksiyası tərəfindən istifadə edilən paralellik dərəcəsi (yəni thread-lərin sayı). + Məlumat bazası yadda saxlanılır … + Əmr yerinə yetirilir … + Şifrələmə açarı olmadan davam edilsinmi? + Seçilmiş şəbəkə nöqtələri qalıcı olaraq silinsinmi? + Zibil qutusundakı bütün şəbəkə nöqtələri qalıcı olaraq silinsinmi? + KeePassDX məlumat bazası sadəcə kiçik köməkçi faylları (PGP açar faylları kimi) ehtiva edə bilər.\n\nMəlumat bazanızın bu yükləməylə həcmi çox arta və performansı aşağı düşə bilər. + Bu faylın yüklənməsi mövcud olanı əvəzləyəcəkdir. + Məlumat bazası faylındakı mətn kodlama formatından xaric şifrə hərflərindən (simvol) istifadə etməkdən yayının (tanınmayan hərflər (simvollar) eyni hərfə çevrilir). + Məlumat bazasındakı dəyişiklikləri yadda saxlamaq üçün faylların yazılmasına icazə verin + Fayla giriş icazəsi fayl meneceri tərəfindən rədd edildi + Məlumat bazası artıq açıqdır, yenisi açmaq üçün öncə onu bağlayın + Şifrə qoruması olmadan davam edilsinmi? + Cihazın kilid açma funksiyasından istifadə etsəniz belə, kassanın əsas şəxsiyyət təyin etmə məlumatlarını yenə də xatırlamaq lazımdır. + Cihazın kilid açma funksiyası ilə məlumat bazasının şəxsiyyət təyin etmə məlumatlarını əldə edin + Cihazın kilid açma açarı oxunmadı. Zəhmət olmazsa, onu silin və kilid açma prossesini təkrarlayın. + Cihaz kilid açma istəyini başlatmaq mümkün deyil. + Digər tətbiqlərdə formları (anket) daha sürətli doldurmaq üçün avtomatik doldurma funksiyasını aktiv edin + Şifrə seç .… + Standart avtomatik doldurma xidmətini təyin edin + Avtomatik doldurmanın parametrləri + Yaradılan şifrə həcmi + Yaradılan şifrələrin standart həcmini təyin edər + Şifrə hərfləri (simvolları) + İcazə verilən şifrə yaratma hərflərini (simvollarını) təyin et + Məlumat bazası açıldı + Kilid + Ekran kilidi + Ekran söndükdən bir neçə saniyə sonra məlumat bazasının kilidləyin + Kilidləmək üçün \"Geri\" düyməsinə sıxın + İstifadəçi kök ekranında geri düyməsinə klik etdikdə məlumat bazasını kilidlə + Kilid düyməsini göstərin + İstifadəçi interfeysində kilid düyməsini göstərin + Məzmun + Kilidi aç + Cihaz kilidini aç + Cihaz kilid açma açarlarını silmək üçün toxunun + Məzmunu silmədən öncə cihazın kilidini açma istifadə müddəti + Cihaz kilidi açma taymout müddəti + Cihaz kilid açma tanıması ilə bağlı bütün şifrəli açarlar silin + Cihaz kilid açma tanıması ilə bağlı bütün şifrəli açarlar silinsinmi? + Məlumat bazasında olan, lakin şifrəyə bağlı olmayan qoşmaları silin + Hər şifrə başına düşən keçmiş məlumatların (fayl) sayının limitləyin + Sahə (bölmə) yazı tipi + Hərflərin (simvol) daha yaxşı görünməsi üçün sahələrdə (bölmə) istifadə olunan fontu dəyişdirin + Mübadilə buferi güvəni + Mübadilə buferinin istifadə müddəti bitdikdə və ya istifadə etməyə başladıqdan sonra bildiriş bağlandığında məlumat bazasını kilidləyin + Şifrə və bütün şəxsiyyət məlumatlarının daxil olduğu özəl klaviaturanı aktivləşdirin + KeePassDX-də bir şifrəyə baxarkən, Magikeyboard-da həmin şifrəni göstər + Gələcəkdə daha asan istifadələr üçün əl ilə şifrə seçimi edərkən paylaşılan məlumatları yadda saxlamağa çalışın + Klaviatura şifrəsini təmizləmək üçün taym-aut + Avtomatik düymə funksiyası (hərəkəti) + \"Sahə\" düyməsinə basdıqdan sonra \"Get\" düyməsi funksiyası (hərəkəti) + Məlumat bazasının şəxsiyyətini təsdiq edən məlumatların ekranı + Şifrə seç + Backspace (geri silmə) + Enter (daxil et) + Məlumat bazasını bağla + Avtomatik doldurma seçimindən sonra məlumat bazasını bağla + Gələcəkdə daha asan istifadələr üçün əllə şifrə seçimi edərkən axtarış məlumatlarını yadda saxlamağa çalış + Məlumatları yadda saxlamaq üçün sorğula + Anket doldurma prossesi tamamlandığında məlumatları yadda saxlamaq üçün sorğula + Tətbiqin bloklama siyahısı + Tətbiqlərin avtomatik olaraq doldurulmasını əngəlləyən bloklama siyahısı + Veb domen bloklama siyahısı + Veb domenlərin avtomatik olaraq doldurulmasını əngəlləyən bloklama siyahısı + Avtomatik doldurmanı blokla + Bloklamanı aktiv etmək üçün anketin daxil olduğu tətbiqi yenidən başladın. + Yazma-qorumalı (dəyişməz) olaraq açılan məlumat bazasında yeni məlumatları yadda saxlamağa icazə verilmir. + Əgər şəxsiyyəti təsdiq edən məlumatlar seçilməyibsə, \"Aç\" düyməsinin sıxılmasına icazə ver + Şifrəni sil + Məlumat bazasına bağlantı cəhdindən sonra daxil edilmiş şifrəni sil + Yazma qorumalı + Hər önəmli prossesdən sonra məlumat bazasını yadda saxla (\"Modifikasiya edilə bilən\" modda keçərlidir) + Ekranı açıq saxla + Şifrəyə baxarkən və ya redaktə edərkən ekranı açıq saxla + Məlumat bazası şəxsiyyətini təsdiq edən məlumatlar ekranında avtomatik olaraq əvvəlki klaviaturaya geri dön + Axtarış ekranı + Axtarış ekranında avtomatik olaraq əvvəlki klaviaturaya geri dön + Geri dön + \"Avtomatik funksiya düyməsi\" prossesi həyata keçirildikdən sonra avtomatik olaraq əvvəlki klaviaturaya geri dön + Şifrəni doğrula + Şifrəni doğrulamağı və məlumat bazasını yadda saxlamağı unutmayın.\n\nƏgər avtomatik kilidləmə aktivləşərsə və dəyişiklik etdiyinizi unutsanız, məlumatlarınızı itirmə riskiniz olar. + Əlavə bir sahəni (bölmə) qeydiyyata alın, bir dəyər əlavə edin və istəyə bağlı olaraq onu qoruyun. + İki faktorlu doğrulama (2FA) üçün tələb olunan jetonu yaratmaq üçün bir dəfəlik şifrə menecerini (HOTP / TOTP) təyin edin. + Sessiya üçün açılış modunu dəyişin.\n\n\"Yazma qoruması\" funksiyası, məlumat bazasına istənilməyən dəyişikliklərin qarşısını alır.\n\"Modifikasiya edilə bilmə\" funksiyası, istədiyiniz kimi bütün elementləri əlavə etməyinizə, silmənizə və ya dəyişdirməyinizə icazə verir. + Məlumat bazanızı cəld şəkildə kilidləyin, müəyyən müddət sonra və ekran söndükdə tətbiqin onu kilidləməsi üçün təyinatlandıra bilərsiniz. + Ekran görüntüsü modu + Üçüncü tərəf tətbiqlərə bu tətbiqdə ekran görüntüsü qeyd etməyə və almağa icazə ver + Təlim ipucları + Tətbiqin necə işlədiyini öyrənmək üçün elementləri önə çıxarın + Təlim ipuclarını sıfırla + Məlumat bazası faylınızı yaradın + İlk şifrə meneceri faylınızı yaradın + Mövcud məlumat bazasını açın + İstifadəyə davam etmək üçün fayl brauzerinizdən əvvəlki məlumat bazası faylını açın. + Şifrələr rəqəmsal şəxsiyyəti təsdiq edən məlumatları idarə etməyinizə kömək edir.\n\nQruplar (~qovluqlar) məlumat bazasındakı şifrələri düzəltdir. + Şifrələrdə axtarış edin + Cihaz maəlumat bazası kilidini açma + Məlumat bazanızı daha sürətli açmaq üçün şifrənizi skan edilmiş biometriya və ya cihaz şəxsiyyəti təsdiq edən məlumatlarla əlaqələndirin. + Şifrəyə özəl sahələrlə (bölmə) düzəliş edin. Ümumi məlumatlara müxtəlif şifrə sahələri arasında istinad edilə bilər. + Məlumatları (fayl) sıralayın + Şifrə və qrupların necə sıralandığını seçin. + İştirak et + Stabilliyin, təhlükəsizliyin artırılmasına və daha çox funksiyaların əlavə edilməsinə yardım edin. + Pro versiyasını alaraq, bu görünüş stilindənistifadə edə və xüsusilə ictimai layihələrinin həyata keçirilməsinə yardım etmiş olacaqsınız. + Proversiyasını alaraq, + Yardım göstərərək, + Yardım etdiyiniz üçün çox sağ olun. + Bu funksiyası tezliklə yayımlamaq üçün çox çaılşırıq. + Yeni versiyaları quraşdıraraq tətbiqi yeni saxlamağı unutmayın. + Yüklə + Yüklə%1$s + %1$sYüklə + Başladılır … + Davam edir:%1$d%% + Yekunlaşdırılır… + Bitdi! + Ləğv edildi! + B + Entropiya:%1$s bit + Entropiya: Yüksək + Entropiya: Hesabla … + Hər birindən ən az bir hərf (simvol) + Qeyri-müəyyən hərfləri (simvolları) istisna et + Hərfləri (simvolları) nəzərə al + Ayırıcı + Hərfləri (simvolları) nəzərə alma + kiçik hərf + BÖYÜK HƏRF + İlk hərflər böyük + Hərf (simvol) sayı:%1$d + Ekran görüntüsü modu + Tətbiq teması + Tətbiqdə istifadə olunan tema + Meşə + Müqəddəs + Klassik + Ay + Günəş + Cavab ver + Kunzit + Sistemi izle + Tema parlaqlığı + Açıq və ya tünd temaları seç + Açıq + Tünd + Standart + Özəl + İkona paketi + Tətbiqdə istifadı edilən ikona paketi + Şifrə rəngləri + Şifrələr üçün ön və arxa plan rənglərini göstərir + İstifadə müddəti bitən, istifadə olunmayan şifrələri gizlət + İstifadə müddəti bitən şifrələr göstərilmir \ No newline at end of file From 13d667d81ca1104ee79ad1f2fbdfcdc24107e70b Mon Sep 17 00:00:00 2001 From: Jamil Farajov Date: Wed, 6 Nov 2024 11:04:56 +0000 Subject: [PATCH 099/119] Translated using Weblate (Azerbaijani) Currently translated at 98.6% (650 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 45 ++++++++++++++------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index dd42bfddd..5c599ccb7 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -84,7 +84,7 @@ Şifrədəki söz sayısı Yenilə Sil - <strong>Müstəqilliyimiz qorumaq</strong>, <strong>xətaları düzəltmək</strong>,<strong>yeni funskiyalar əlavə etmək</strong> və <strong>hər zaman aktiv olmaq</strong>üçün<strong>sizin dəstəyinizə etibar edirik. + Müstəqilliyimiz qorumaq, xətaları düzəltmək,yeni funskiyalar əlavə etməkhər zaman aktiv olmaqüçünsizin dəstəyinizə etibar edirik. Yaradıldı İstifadə müddəti biti Etiketlər @@ -139,7 +139,7 @@ Məlumat bazası parametrləri Meta məlumatlar, zibil qutusu, şablonlar, tarixçə Təhlükəsizlik parametrləri - Yapışdır + Mubadilə buferindən əlavə et Sil Ləğv et Şifrəni gizlət @@ -203,7 +203,7 @@ Məlumat bazasını yenidən yükləmək lokal olaraq modifikasiya olunmuş faylları siləcəkdir. Fayla giriş fayl meneceri tərəfindən ləğv edildi, məlumat bazasını bağlayın və onu olduğu yerdən yenidən açın. Siz tətəbiqin zəngli saatdan istifadə etməsinə icazə verməmisiniz. Nəticədə, taymer tələb edən funksiyalar dəqiq bir zamanda işləməyəckdir. - Android, məlumatlarını anında dəyişdirə biləcəyindən heş faylı qaranti edilməyib. Doğru bütünlüyk üçün fayl əlavəsini .bin olaraq dəyişin. + Android, məlumatlarını anında dəyişdirə biləcəyindən faylın heşi qaranti edilməyib. Doğru bütünlük üçün fayl əlavəsini .bin olaraq dəyişin. İcazə Versiya %1$s Nüvə%1$s @@ -219,7 +219,7 @@ Görünüş Tema, rəng və atributlar Biometriya - Cihazın şəxsiyyət məlumatları + Cihazın şəxsiyyətini təsdiq edən məlumatları Ümumi Avtomatik doldurma KeePassDX avtomatik doldurma formu @@ -230,10 +230,10 @@ Məlumat bazasını açmaq üçün cihaz şəxsiyyət məlumatlarından istifadə etməyə imkan verir Önəmli xarici məlumatları yadda saxlamaq üçün şifrənizə (qeyd) qoşma əlavə edin. Müvəqqəti kilid açma - Cihaz kilid açma müddəti bitdi + Cihazın kilid açma müddəti bitdi Bu cihazda Andoird %1$s versiyası var, lakin %2$svə ya daha sonrakı versiya lazımdır. Yol - Lazımi qurğu-təchizat tapılmadı. + Lazımi aparat-təchizat tapılmadı. Maksimum həcm Şablonlar qrupu Maskimum sayı @@ -243,13 +243,13 @@ Bir sonrakı səfərə yeniləməyə məcbur et Ana açarın dəyişdirilməsini tələb et (gün) Bir sonrakı səfərə ana açarın dəyişdirilməsini tələb et (tək səfərlik) - Qeyd mövcud olanda bildirişi göstər + Şifrə mövcud olanda bildirişi göstər %1$s Görünüş Klaviatura teması Klaviaturanı dəyişdir Açarlar - Düyməyə toxunduqda səs çıxar + Düyməyə toxunulduğunda səs çıxart Məlumat bazanızın şifrəsini açmaq üçün şifrə və\\və ya açar faylı daxil edin.\n\nMəlumat bazası faylını hər dəfə dəyişəndən sonra etibarlı bir yerdə ehtiyat üçün nüsxələyin. Biometrik kilid açma Məlumat bazasını açmaq üçün biometrikləri skan etməyə imkan verir @@ -258,7 +258,7 @@ Məlumat bazası ondan istifadə ediləcək şəkildə quraşdırılıbsa, cihaz kilidini avtomatik olaraq tələb et Cihaz kilidini açmaq üçün hər hansısa şifrələnmiş məzmunu saxlamayın Şifrələnmiş açarları silin - Bu funksiya işləmədi + Bu funksiya işləmədi. Fayl adı Ana açar təyin edin Məlumat @@ -296,16 +296,16 @@ Magikeyboard Magikeyboard (KeePassDX) Magikeyboard parametrləri - Qeyd - Qeyd seçimi + Şifrə + Şifrə seçimi Bildiriş məlumatı Paylaşılan məlumatları yadda saxla - Tətbiqi bağlayarkən sil + Tətbiqi bağlayarkən təmizlə Bildirişi bağlayarkən məlumat bazasını bağla - taymaut - Qeyd (şifrə) - %1$sMagikeyboard-da istifadə edilə bilər - Düyməyə toxunduqda titrət + Taymaut + Şifrə + %1$s Magikeyboard-da istifadə edilə bilər + Düyməyə toxunulduğunda titrət Birdəfəlik şifrə (OTP) təyin edin Məlaumat bazasının şifrəsini açın Məlumat bazasını dəyişiklik edilməsinə qarşı qoruyun @@ -515,7 +515,7 @@ Məlumat bazası artıq açıqdır, yenisi açmaq üçün öncə onu bağlayın Şifrə qoruması olmadan davam edilsinmi? Cihazın kilid açma funksiyasından istifadə etsəniz belə, kassanın əsas şəxsiyyət təyin etmə məlumatlarını yenə də xatırlamaq lazımdır. - Cihazın kilid açma funksiyası ilə məlumat bazasının şəxsiyyət təyin etmə məlumatlarını əldə edin + Cihazın kilid açma funksiyası ilə məlumat bazasının şəxsiyyətini tədiq edən məlumatlarını əldə edin Cihazın kilid açma açarı oxunmadı. Zəhmət olmazsa, onu silin və kilid açma prossesini təkrarlayın. Cihaz kilid açma istəyini başlatmaq mümkün deyil. Digər tətbiqlərdə formları (anket) daha sürətli doldurmaq üçün avtomatik doldurma funksiyasını aktiv edin @@ -538,12 +538,12 @@ Kilidi aç Cihaz kilidini aç Cihaz kilid açma açarlarını silmək üçün toxunun - Məzmunu silmədən öncə cihazın kilidini açma istifadə müddəti + Məzmununu silmədən öncə cihazın kilidini açma istifadə müddəti Cihaz kilidi açma taymout müddəti - Cihaz kilid açma tanıması ilə bağlı bütün şifrəli açarlar silin + Cihaz kilid açma tanıması ilə bağlı bütün şifrəli açarları silin Cihaz kilid açma tanıması ilə bağlı bütün şifrəli açarlar silinsinmi? Məlumat bazasında olan, lakin şifrəyə bağlı olmayan qoşmaları silin - Hər şifrə başına düşən keçmiş məlumatların (fayl) sayının limitləyin + Hər şifrə başına düşən keçmiş məlumatların (fayl) sayını limitləyin Sahə (bölmə) yazı tipi Hərflərin (simvol) daha yaxşı görünməsi üçün sahələrdə (bölmə) istifadə olunan fontu dəyişdirin Mübadilə buferi güvəni @@ -594,7 +594,7 @@ Tətbiqin necə işlədiyini öyrənmək üçün elementləri önə çıxarın Təlim ipuclarını sıfırla Məlumat bazası faylınızı yaradın - İlk şifrə meneceri faylınızı yaradın + İlk şifrə meneceri faylınızı yaradın. Mövcud məlumat bazasını açın İstifadəyə davam etmək üçün fayl brauzerinizdən əvvəlki məlumat bazası faylını açın. Şifrələr rəqəmsal şəxsiyyəti təsdiq edən məlumatları idarə etməyinizə kömək edir.\n\nQruplar (~qovluqlar) məlumat bazasındakı şifrələri düzəltdir. @@ -656,4 +656,7 @@ Şifrələr üçün ön və arxa plan rənglərini göstərir İstifadə müddəti bitən, istifadə olunmayan şifrələri gizlət İstifadə müddəti bitən şifrələr göstərilmir + Məlumat bazasını kilidlədikdən sonra avtomatik olaraq əvvəlki klaviaturaya geri dön + Özəl sahələr (bölmə) + Əvvəlki klaviaturaya geri dön \ No newline at end of file From 4723fb39e9a3679de08e9f43a9c83514d752e78d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 8 Nov 2024 13:27:26 +0100 Subject: [PATCH 100/119] fix: Sort --- .../keepass/adapters/NodesAdapter.kt | 5 +++++ .../keepass/database/element/DateInstant.kt | 4 ++-- .../keepass/tests/utils/ValuesTest.kt | 21 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt index 56d89c90b..1561d5fc8 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt @@ -204,6 +204,11 @@ class NodesAdapter ( && oldItem.type == newItem.type && oldItem.title == newItem.title && oldItem.icon == newItem.icon + && oldItem.creationTime == newItem.creationTime + && oldItem.lastModificationTime == newItem.lastModificationTime + && oldItem.lastAccessTime == newItem.lastAccessTime + && oldItem.expiryTime == newItem.expiryTime + && oldItem.expires == newItem.expires && oldItem.isCurrentlyExpires == newItem.isCurrentlyExpires } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt index 1b7e8d20b..f2e938624 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt @@ -229,8 +229,8 @@ class DateInstant : Parcelable { return this.mInstant.isAfter(dateInstant.mInstant) } - fun compareTo(other: DateInstant?): Int { - return mInstant.compareTo(other?.mInstant) + fun compareTo(other: DateInstant): Int { + return mInstant.compareTo(other.mInstant) } enum class Type { diff --git a/database/src/test/java/com/kunzisoft/keepass/tests/utils/ValuesTest.kt b/database/src/test/java/com/kunzisoft/keepass/tests/utils/ValuesTest.kt index 3471febe4..adc78eaa1 100644 --- a/database/src/test/java/com/kunzisoft/keepass/tests/utils/ValuesTest.kt +++ b/database/src/test/java/com/kunzisoft/keepass/tests/utils/ValuesTest.kt @@ -165,6 +165,27 @@ class ValuesTest : TestCase() { assertTrue("jDate $jDate and cDate $cDate not equal", cDate == jDate) } + fun testDateCompare() { + val dateInstantA = DateInstant().apply { + setDate(2024, 12, 2) + setTime(5, 13) + } + val dateInstantB = DateInstant().apply { + setDate(2024, 12, 2) + setTime(5, 10) + } + val dateInstantC = DateInstant().apply { + setDate(2024, 12, 2) + setTime(5, 10) + } + assertTrue(dateInstantA.compareTo(dateInstantB) > 0) + assertTrue(dateInstantB.compareTo(dateInstantA) < 0) + assertTrue(dateInstantB.compareTo(dateInstantC) == 0) + assertTrue(dateInstantA.isAfter(dateInstantB)) + assertTrue(dateInstantB.isBefore(dateInstantA)) + assertFalse(dateInstantB.isBefore(dateInstantC)) + } + fun testUUID() { val bUUID = ByteArray(16) Random().nextBytes(bUUID) From 1c95a0edc4b0ad3128f450ab7e54b87298c1fdd3 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 8 Nov 2024 21:11:26 +0100 Subject: [PATCH 101/119] fix: distinct domain names #1105 --- CHANGELOG | 1 + ...tWebDomainPreferenceDialogFragmentCompat.kt | 2 +- .../keepass/database/element/Database.kt | 4 ++-- .../keepass/database/search/SearchHelper.kt | 18 +++++++++++++++--- .../metadata/android/en-US/changelogs/132.txt | 1 + 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 8c51a5fed..dd255274d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ KeePassDX(4.1.0) * Hide template group #1894 * Group count sum recursively #421 * Fix when selecting date fields #1695 + * Fix distinct domain names #1105 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 KeePassDX(4.0.8) diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/AutofillBlocklistWebDomainPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/AutofillBlocklistWebDomainPreferenceDialogFragmentCompat.kt index 2698ec66a..e6ef0a5f8 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/AutofillBlocklistWebDomainPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/AutofillBlocklistWebDomainPreferenceDialogFragmentCompat.kt @@ -26,7 +26,7 @@ import com.kunzisoft.keepass.model.SearchInfo class AutofillBlocklistWebDomainPreferenceDialogFragmentCompat : AutofillBlocklistPreferenceDialogFragmentCompat() { - override fun buildSearchInfoFromString(searchInfoString: String): SearchInfo? { + override fun buildSearchInfoFromString(searchInfoString: String): SearchInfo { val newSearchInfo = searchInfoString // remove prefix https:// .replace(Regex("^.*://"), "") diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index 9d42744c9..12439ed0f 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -866,8 +866,8 @@ open class Database { fun createVirtualGroupFromSearch( searchParameters: SearchParameters, - fromGroup: NodeId<*>? = null, - max: Int = Integer.MAX_VALUE + fromGroup: NodeId<*>? = null, + max: Int = Integer.MAX_VALUE ): Group? { return mSearchHelper.createVirtualGroupWithSearchResult(this, searchParameters, fromGroup, max) diff --git a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt index 7bb10be08..9692010c5 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt @@ -148,7 +148,15 @@ class SearchHelper { return true } if (searchParameters.searchInUrls) { - if (checkSearchQuery(entry.url, searchParameters)) + if (checkSearchQuery(entry.url, searchParameters) { stringToCheck, word -> + // domain.org + stringToCheck.equals(word, !searchParameters.caseSensitive) || + // subdomain.domain.org + stringToCheck.endsWith(".$word", !searchParameters.caseSensitive) || + // https://domain.org + stringToCheck.endsWith("\\/$word", !searchParameters.caseSensitive) + // Don't allow mydomain.org + }) return true } if (searchParameters.searchInNotes) { @@ -176,7 +184,10 @@ class SearchHelper { return false } - private fun checkSearchQuery(stringToCheck: String, searchParameters: SearchParameters): Boolean { + private fun checkSearchQuery( + stringToCheck: String, + searchParameters: SearchParameters, + specialComparison: ((check: String, word: String) -> Boolean)? = null): Boolean { /* // TODO Search settings var removeAccents = true <- Too much time, to study @@ -196,7 +207,8 @@ class SearchHelper { var searchFound = true searchParameters.searchQuery.split(" ").forEach { word -> searchFound = searchFound - && stringToCheck.contains(word, !searchParameters.caseSensitive) + && (specialComparison?.invoke(stringToCheck, word) + ?: stringToCheck.contains(word, !searchParameters.caseSensitive)) } searchFound } diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index 0378f07ac..fef95058e 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -3,4 +3,5 @@ * Hide template group #1894 * Group count sum recursively #421 * Fix when selecting date fields #1695 + * Fix distinct domain names #1105 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 \ No newline at end of file From 26fdf870707ac23ecdf3d6500ab39957cc7f8ed1 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 11 Nov 2024 15:34:48 +0100 Subject: [PATCH 102/119] fix: distinct domain names #1820 --- CHANGELOG | 2 +- fastlane/metadata/android/en-US/changelogs/132.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index dd255274d..f3ee296f4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,7 +4,7 @@ KeePassDX(4.1.0) * Hide template group #1894 * Group count sum recursively #421 * Fix when selecting date fields #1695 - * Fix distinct domain names #1105 + * Fix distinct domain names #1105 #1820 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 KeePassDX(4.0.8) diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index fef95058e..6ff74e342 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -3,5 +3,5 @@ * Hide template group #1894 * Group count sum recursively #421 * Fix when selecting date fields #1695 - * Fix distinct domain names #1105 + * Fix distinct domain names #1105 #1820 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 \ No newline at end of file From 8e05309021d4d842de621a37e6868ad36f0f0e87 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 11 Nov 2024 16:06:48 +0100 Subject: [PATCH 103/119] feat: Support otpauth://steam/Steam link #1289 --- CHANGELOG | 1 + .../kunzisoft/keepass/otp/OtpEntryFields.kt | 22 +++++++++++-------- .../metadata/android/en-US/changelogs/132.txt | 1 + 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f3ee296f4..21938f66e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,7 @@ KeePassDX(4.1.0) * Group count sum recursively #421 * Fix when selecting date fields #1695 * Fix distinct domain names #1105 #1820 + * Support otpauth://steam/Steam link #1289 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 KeePassDX(4.0.8) diff --git a/database/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt b/database/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt index e32611cf3..69e9a8d2c 100644 --- a/database/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt +++ b/database/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt @@ -22,12 +22,15 @@ package com.kunzisoft.keepass.otp import android.net.Uri import android.util.Log -import com.kunzisoft.keepass.database.element.security.ProtectedString import com.kunzisoft.keepass.database.element.Field -import com.kunzisoft.keepass.otp.TokenCalculator.* +import com.kunzisoft.keepass.database.element.security.ProtectedString +import com.kunzisoft.keepass.otp.TokenCalculator.HOTP_INITIAL_COUNTER +import com.kunzisoft.keepass.otp.TokenCalculator.HashAlgorithm +import com.kunzisoft.keepass.otp.TokenCalculator.OTP_DEFAULT_DIGITS +import com.kunzisoft.keepass.otp.TokenCalculator.TOTP_DEFAULT_PERIOD import com.kunzisoft.keepass.utils.StringUtil.removeLineChars import com.kunzisoft.keepass.utils.StringUtil.removeSpaceChars -import java.util.* +import java.util.Locale import java.util.regex.Pattern object OtpEntryFields { @@ -40,6 +43,7 @@ object OtpEntryFields { // URL parameters (https://github.com/google/google-authenticator/wiki/Key-Uri-Format) private const val OTP_SCHEME = "otpauth" private const val TOTP_AUTHORITY = "totp" // time-based + private const val STEAM_AUTHORITY = "steam" // time-based private const val HOTP_AUTHORITY = "hotp" // counter-based private const val ALGORITHM_URL_PARAM = "algorithm" private const val ISSUER_URL_PARAM = "issuer" @@ -50,7 +54,9 @@ object OtpEntryFields { private const val COUNTER_URL_PARAM = "counter" // OTPauth URI - private const val REGEX_OTP_AUTH = "^otpauth://([ht]otp)/?(?:([^:?#]*): *)?([^:?#]*)\\?([^#]+)$" + private const val REGEX_OTP_AUTH = "^otpauth://(" + + "$TOTP_AUTHORITY|$STEAM_AUTHORITY|$HOTP_AUTHORITY" + + ")/?(?:([^:?#]*): *)?([^:?#]*)\\?([^#]+)$" // Key-values (maybe from plugin or old KeePassXC) private const val SEED_KEY = "key" @@ -116,9 +122,7 @@ object OtpEntryFields { * Tell if [otpUri] is a valid Otp URI */ fun isOTPUri(otpUri: String): Boolean { - if (Pattern.matches(REGEX_OTP_AUTH, otpUri)) - return true - return false + return Pattern.matches(REGEX_OTP_AUTH, otpUri) } /** @@ -135,7 +139,7 @@ object OtpEntryFields { * Parses a secret value from a URI. The format will be: * * otpauth://totp/user@example.com?secret=FFF... - * + * otpauth://steam/user@example.com?secret=FFF... * otpauth://hotp/user@example.com?secret=FFF...&counter=123 */ private fun parseOTPUri(getField: (id: String) -> String?, otpElement: OtpElement): Boolean { @@ -149,7 +153,7 @@ object OtpEntryFields { } val authority = uri.authority - if (TOTP_AUTHORITY == authority) { + if (TOTP_AUTHORITY == authority || STEAM_AUTHORITY == authority) { otpElement.type = OtpType.TOTP } else if (HOTP_AUTHORITY == authority) { diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index 6ff74e342..40c4f2693 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -4,4 +4,5 @@ * Group count sum recursively #421 * Fix when selecting date fields #1695 * Fix distinct domain names #1105 #1820 + * Support otpauth://steam/Steam link #1289 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 \ No newline at end of file From 23afee453ea486988c107379b05f0dc63ac14b58 Mon Sep 17 00:00:00 2001 From: Aitor Elorza Date: Tue, 12 Nov 2024 16:47:58 +0000 Subject: [PATCH 104/119] Translated using Weblate (Basque) Currently translated at 96.8% (638 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/eu/ --- app/src/main/res/values-eu/strings.xml | 77 +++++++++++++++----------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 7ffe818a3..838d62fa9 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -45,7 +45,7 @@ Digituak KeePassDX © %1$d Kunzisoft <strong>kode irekiko</strong> eta <strong>iragarki gabekoa da</strong>. \n<strong>GPLv3</strong> lizentziapean banatu da, hori dela eta ez dakar inolako bermerik. - Ireki aurrez sortutako datu-basea + Ireki aurrez sortutako kutxa gotorra Atzituta Utzi Iruzkinak @@ -138,7 +138,7 @@ Segurtasuna Harremanetarako - Ekarpen + Diru-laguntza Gako nagusia Sarrera editatu Gakoaren eratorpen funtzioa @@ -281,7 +281,7 @@ Sortu zure lehen pasahaitz kudeatzaile fitxategia. Gehitu elementuak zure datu-basera Berrezarri hezkuntza-pistak - Sortu fitxategia aplikazioaren propietateak esportatzeko + Sortu fitxategia aplikazioaren ezarpenak esportatzeko Mugatu historial elementu kopurua sarrera bakoitzeko Tamaina maximoa Blokeatu datu-basea arbelaren iraupena amaitzean edo jakinarazpena ixtean erabiltzen hasi ondoren @@ -300,7 +300,7 @@ Bilatu sarreren artean Ezin izan da fitxategia aurkitu. Saiatu zure fitxategi nabigatzailetik berriro irekitzen. Datuak gorde - Aplikazioaren ezaugarriak esportatuta + Aplikazioaren ezarpenak esportatuta Aldatu eremuen iturria karaktereen ikusgarritasuna hobetzeko Baimendu sarrera pasahitza eta babestutako eremuak arbelean kopiatzea Abisua: Arbela aplikazio guztiek partekatzen dute. Datu sentikorrak kopiatzen badira, beste software batek berreskura ditzake. @@ -331,7 +331,7 @@ Ezinezkoa da erronkaren erantzuna jasotzea. Erabiltzaileak bertan behera utzita. Kontrolagailu bat behar da %1$srentzat. - Ezinezkoa da V1 datu-basetik fusionatzea. + Ezinezkoa da kdb datu-base fitxategitik fusionatzea. Datu-basearen kokalekua ezezaguna da, ezin da datu-basearen akzioa bete. Gako-fisikoa ez da onartzen. Gakoak ezin du hutsik egon. @@ -347,7 +347,7 @@ Fusionatu hemendik… Gorde kopia hemen… Ezabatu historiala - Kendu gakoa desblokeo aurreratutik + Ezabatu gailuaren desblokeo gakoa Idazketaren aurka babestua Berrezarri historiala Eskatu bilaketa bat datu-base bat irekitzean @@ -364,11 +364,11 @@ Erabilitako hardware-gakoen segimendua egiten du Erakusti azken datu-baseen kokapena Ezkutatu datu-baseetara hautsitako estekak - Inportatu aplikazio baten ezaugarriak - Hautatu fitxategia aplikazioaren ezaugarriak inportatzeko - Inportatutako aplikazioen ezaugarriak - Errorea aplikazioaren ezaugarriak inportatzean - Errorea aplikazioaren ezaugarriak esportatzean + Inportatu aplikazioaren ezarpenak + Hautatu fitxategia aplikazioaren ezarpenak inportatzeko + Aplikazioen ezarpenak inportatu dira + Errorea aplikazioaren ezarpenak inportatzean + Errorea aplikazioaren ezarpenak esportatzean Memoria erabilpena Gakoaren eratorpen funtzioak erabilitako paralelismo gradua (adb. hari kopurua). Komandoa exekutatzen… @@ -416,14 +416,14 @@ Idazketaren aurka babestua Azpi-domeinu bilaketa Bilaketa azkarra - Sortu datu-base berria + Sortu kutxa gotor berria Hustu zakarrontzia Editagarri Kopiatu Segurtasun ezarpenak Deuseztu Itsatsi - Desblokeatze aurreratua + Gailu blokeatzailea Talde bateko sarrera kopurua erakusten du %1$sk %2$sren UUID bera du. Baxuena lehenbizi↓ @@ -474,7 +474,7 @@ Nabarmendu elementuak aplikazioak nola funtzionatzen duen ikasteko Erakutsi hezkuntza informazioa berriro Ireki aurrez existitzen den datu-basea - Esportatu aplikazioaren ezaugarriak + Esportatu aplikazioaren ezarpenak Zifraketa algoritmorako gakoa sortzeko, gako nagusia itxuraldatu egiten da eratorpen funtzio eta ausazko gatz baten bidez. Bilaketa pantaila Erabiltzaileari datu-baseko sarrera hautatzeko aukera erakutsi @@ -486,14 +486,14 @@ Ezin da fitxategiaren hasha bermatu Androidek aldaketak egin ditzakeelako sortu ahala. Aldatu fitxategiaren luzapena .binera integritate zuzen baterako. Fusionatu datuak, gain idatzi kanpo aldaketak datu-basean gordez edo birkargatu azken aldaketekin. Ez diozu aplikazioari alarma zehatz bat erabiltzen utzi, Hori dela eta, tenporizadore bat behar dituzten ezaugarriak ez dira ordu zehatz batean egingo. - Zure pasahitz-nagusia gogoratu behar duzu desblokeo aurreratuko ezagutzea erabili arren. + Zure kutxa gotorraren pasahitz-nagusia gogoratu behar duzu naiz eta desblokeo aurreratuko ezagutzea erabili arren. Zifratutako pasahitza gordeta Datu-base honek ez du biltegiratuta kredentzialik. - Desblokeatze aurreratuko errorea: %1$s + Gailuaren desblokeatze errorea: %1$s Itxura KeePassDXekin erregistratu Gaitu betetze automatikoa beste aplikazioetako formularioak errez betetzeko - Desblokeo aurreratua + Gailua desblokeatu Ezabatu ezagutze desblokeo aurreratuaren zifraketa gako guztiak\? Bidea \"Aurrera\" teklaren akzioa \"Eremu\" tekla zapaltzean @@ -505,12 +505,12 @@ Baimena Konpilazio bertsioa%1$s Historiala - Ukitu desblokeatze aurreratuko gakoak ezabatzeko + Ukitu gailua desblokeatzeko gakoak ezabatzeko Fitxategiaren izena Zakarrontziaren taldea Esleitu gako nagusia Aplikazioak erabilitako ikono paketea - Ezin da irakurri desblokeatze aurreratuko gakoa. Mesedez ezabatu ezatu eta errepikatu desblokeatze prozedura. + Ezin da irakurri desblokeatze gakoa. Mesedez ezabatu ezatu eta errepikatu desblokeatze prozedura. Gailuaren kredentzialen desblokeoa Ezaugarri honek zifratutako kredentzialen informazioa zure gailuaren KeyStorean gordeko ditu. \n @@ -530,8 +530,8 @@ Sarrerako koloreak Erakutsi sarreraren aurreko eta atzeko planoen koloreak Iraungitako sarrerak ez dira erakusten - Ireki datu-basea desblokeo aurreratuko ezagutzearekin - Atera datu-baseko kredentzialak desblokeo aurreratuko datuekin + Gailuaren desblokeo ezagutza + Atera datu-baseko kredentzialak desblokeo datuekin Ezarri erabilera bakarreko pasahitzen kudeaketa (HOTP/TOTP) bi faktoreko autentifikazioak (2FA) eskatzen duen tokena sortzeko. Aldatu saioaren irekiera modua. \n @@ -553,9 +553,9 @@ Dagoeneko datu-base bat irekita dago, itxi ezazu beste bat ireki ahal izateko Ezabatu betiko hautatutako nodoak\? Gehitu fitxategia edonola ere\? - Ez gorde zifratutako edukirik desblokeatze aurreratua erabiltzeko - Desblokeatze aurreratuaren iraungitzea - Desblokeatze aurreratua erabiltzeko denbora muga + Ez gorde zifratutako edukirik gailu desblokeatzea erabiltzeko + Gailu desblokeatzearen iraungitzea + Gailu desblokeatzea erabiltzeko denbora muga Blokeatu Gure askatasuna mantentzeko eta beti aktibo egoteko, aintzat dugu zure <strong>ekarpena.</strong> Babestu zure datu-basea idazketen aurka @@ -576,8 +576,8 @@ Eman idazketa baimena datu-basean aldaketak gordetzeko Saihestu kodetze formatutik kanpoko karaktereak datu-baseko pasahitz fitxategietan (ezagutzen ez diren karaktereak letra berarengatik ordezten dira). Fitxategirako atzipena baliogabetu du fitxategi kudeatzaileak, itxi datu-basea eta berriro ireki ezazu bere lokalizaziotik. - Desblokeo aurreratuko ezagutzea - Ezin izan da hasieratu desblokeatze aurreratuko menua. + Gailuaren desblokeorako esteka + Ezin izan da hasieratu gailuaren desblokeatze menua. Lehenetsi betetze automatiko zerbitzua Edukia Datu-basearen desblokeatze automatikoa @@ -594,14 +594,14 @@ Blokeatu datu-basea erabiltzaileak atzera botoia sakatzen duenean hasierako pantailan Erakutsi blokeatzeko botoia Blokeatzeko botoia erakusten du interfazean - Erabili desblokeatze aurreratua datu-base bat errazago irekitzeko + Erabili gailu desblokeatzea datu-base bat errazago irekitzeko Desblokeo biometrikoa Zure datu biometrikoak eskaneatzen uzten dizu datu-basea irekitzeko Zure gailuaren kredentzialak datu-basea irekitzeko erabiltzen uzten dizu - Automatikoki eskatu desblokeatze aurreratua datu-basea horrela erabiltzeko prestatu bada - Denboraz mugatutako desblokeatze aurreratua + Automatikoki eskatu gailu desblokeatzea datu-basea horrela erabiltzeko prestatu bada + Denboraz mugatutako gailu desblokeatze Ezabatu zifraketa gakoak - Ezabatu ezagutze desblokeo aurreratuaren zifraketa gako guztiak + Ezabatu gailu desblokeoari lotutako zifraketa gako guztiak Ezin izan da ezaugarri hau hasieratu. Gailuak Android %1$srekin funtzionatzen du, baina %2$s edo ondorengoak behar ditu. Ezin izan da dagokion hardwarea aurkitu. @@ -619,7 +619,7 @@ Desblokeatu zure datu-basea Betetze automatikoaren ezarpenak Segurtasun biometrikoko eguneraketa behar da. - Ezin izan da errekonozitu desblokeatze aurreratuko aztarna + Ezin izan da errekonozitu desblokeatze aztarna Biometria Gailuaren kredentzialak Orokor @@ -668,4 +668,19 @@ Bertan behera utzi da! Karaktere kopurua:%1$d Oraingoz egindakoa:%1$d%% + Info + Bilatu, blokeoatu, historiala,ezaugarriak + Teklatua,beteze automatikoa,arbela + Biometria, gailuaren egiztagiria + Metadatuak, zakarrontzia, txantilioiak, historiala + Zifraketa, gakoen deribazio funtzioa + Aldaketa,berriztapena + Jakinarazpen baimena behar da arbelaren jakinarazpen funtziorako. + Gailua desblokeatzeko esteka + Gaiak,koloreak,atributuak + Birkargatu datu-basea azken aldaketekin. + Beranduago + Galdetu + Konfiguratu + Desblokeatu \ No newline at end of file From e1a44477af2ef06914a6be5d613a78111f4fbbc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 11 Nov 2024 16:58:39 +0000 Subject: [PATCH 105/119] Translated using Weblate (Estonian) Currently translated at 32.9% (217 of 659 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/et/ --- app/src/main/res/values-et/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 110f5a6a8..b612d3ab7 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -215,4 +215,6 @@ Näitab kirje või grupiga seotud UUID\'d Peida salasõna Näita salasõna + Katkestatud kasutaja poolt. + %1$s draiver on vajalik. \ No newline at end of file From 55206b3dded236cb6232131810da6292812c1f90 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 13 Nov 2024 20:54:31 +0100 Subject: [PATCH 106/119] fix: All past dates and times are crossed out #1710 --- CHANGELOG | 2 +- .../keepass/view/DateTimeFieldView.kt | 9 ++++++-- .../kunzisoft/keepass/view/TemplateView.kt | 5 ++--- .../database/element/template/Template.kt | 5 ++++- .../template/TemplateAttributeOption.kt | 21 +++++++++++++++++++ .../template/TemplateEngineCompatible.kt | 5 +++++ .../metadata/android/en-US/changelogs/132.txt | 2 +- .../metadata/android/fr-FR/changelogs/132.txt | 3 +++ 8 files changed, 44 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 21938f66e..18b8592e0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,7 +3,7 @@ KeePassDX(4.1.0) * Generate keyfile #1290 * Hide template group #1894 * Group count sum recursively #421 - * Fix when selecting date fields #1695 + * Fix date fields #1695 #1710 * Fix distinct domain names #1105 #1820 * Support otpauth://steam/Steam link #1289 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 diff --git a/app/src/main/java/com/kunzisoft/keepass/view/DateTimeFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/DateTimeFieldView.kt index 7b33e7079..1f09aa20a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/DateTimeFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/DateTimeFieldView.kt @@ -57,8 +57,6 @@ class DateTimeFieldView @JvmOverloads constructor(context: Context, } private fun assignExpiresDateText() { - val isExpires = mDateTime.isCurrentlyExpire() - // Show or not the warning icon expiresImage.isVisible = if (mActivated) { isExpires @@ -100,6 +98,13 @@ class DateTimeFieldView @JvmOverloads constructor(context: Context, mDateTime.type = value } + var isExpirable: Boolean = false + + val isExpires: Boolean + get() { + return isExpirable && mDateTime.isCurrentlyExpire() + } + override var activation: Boolean get() { return mActivated diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt index e0bd7f811..34ef53dc3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt @@ -100,13 +100,12 @@ class TemplateView @JvmOverloads constructor(context: Context, return context?.let { DateTimeFieldView(it).apply { label = TemplateField.getLocalizedName(context, field.name) - val dateInstantType = templateAttribute.options.getDateFormat() + type = templateAttribute.options.getDateFormat() + isExpirable = templateAttribute.options.getExpirable() try { val value = field.protectedValue.toString().trim() - type = dateInstantType activation = value.isNotEmpty() } catch (e: Exception) { - type = dateInstantType activation = false } } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt index dd7910680..a5c8626da 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt @@ -154,7 +154,10 @@ class Template : Parcelable { val EXPIRATION_ATTRIBUTE = TemplateAttribute( TemplateField.LABEL_EXPIRATION, TemplateAttributeType.DATETIME, - false) + false, + TemplateAttributeOption().apply { + setExpirable(true) + }) val NOTES_ATTRIBUTE = TemplateAttribute( TemplateField.LABEL_NOTES, TemplateAttributeType.TEXT, diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt index 58692bb42..82ff39f63 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt @@ -152,6 +152,18 @@ class TemplateAttributeOption() : Parcelable { mOptions[DATETIME_FORMAT_ATTR] = DATETIME_FORMAT_VALUE_TIME } + fun getExpirable(): Boolean { + return try { + mOptions[DATETIME_EXPIRABLE_ATTR]?.toBoolean() ?: DATETIME_EXPIRABLE_VALUE_DEFAULT + } catch (e: Exception) { + DATETIME_EXPIRABLE_VALUE_DEFAULT + } + } + + fun setExpirable(value: Boolean) { + mOptions[DATETIME_EXPIRABLE_ATTR] = value.toString().lowercase() + } + fun get(label: String): String? { return mOptions[label] } @@ -246,6 +258,15 @@ class TemplateAttributeOption() : Parcelable { private const val DATETIME_FORMAT_VALUE_DATE = "date" private const val DATETIME_FORMAT_VALUE_TIME = "time" + /** + * Applicable to type DATETIME + * Define if a datetime is expirable + * Boolean ("true" or "false") + * "false" if not defined + */ + private const val DATETIME_EXPIRABLE_ATTR = "expirable" + private const val DATETIME_EXPIRABLE_VALUE_DEFAULT = false + private fun removeSpecialChars(string: String): String { return string.filterNot { "{,:}".indexOf(it) > -1 } } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt index c47abc75b..85e4d5f32 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt @@ -216,6 +216,11 @@ class TemplateEngineCompatible(database: DatabaseKDBX): TemplateEngine(database) attribute.options.associatePasswordGenerator() } + // Add expiration + if (attribute.label.equals(TEMPLATE_ATTRIBUTE_EXPIRES, true)) { + attribute.options.setExpirable(true) + } + // Add default value if (defaultValues.containsKey(attribute.label)) { attribute.options.default = defaultValues[attribute.label]!! diff --git a/fastlane/metadata/android/en-US/changelogs/132.txt b/fastlane/metadata/android/en-US/changelogs/132.txt index 40c4f2693..8c164ae6d 100644 --- a/fastlane/metadata/android/en-US/changelogs/132.txt +++ b/fastlane/metadata/android/en-US/changelogs/132.txt @@ -2,7 +2,7 @@ * Generate keyfile #1290 * Hide template group #1894 * Group count sum recursively #421 - * Fix when selecting date fields #1695 + * Fix date fields #1695 #1710 * Fix distinct domain names #1105 #1820 * Support otpauth://steam/Steam link #1289 * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/132.txt b/fastlane/metadata/android/fr-FR/changelogs/132.txt index c06e4f937..b6cf005e7 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/132.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/132.txt @@ -2,4 +2,7 @@ * Génération de fichier de clé #1290 * Cacher les groupes de modèles #1894 * Somme de comptage de groupes de manière récursive #421 + * Correction des champs date #1695 #1710 + * Correction des noms de domaines #1105 #1820 + * Support des liens otpauth://steam/Steam #1289 * Petites corrections #1711 #1831 #1780 #1821 #1863 \ No newline at end of file From 6de14a384040974a1d2f291f64b36d1abcb75080 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 13 Nov 2024 21:13:50 +0100 Subject: [PATCH 107/119] fix: TimeZone --- .../com/kunzisoft/keepass/database/element/DateInstant.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt index f2e938624..3326bd3f1 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt @@ -123,7 +123,7 @@ class DateInstant : Parcelable { } fun setDate(year: Int, month: Int, day: Int) { - mInstant = DateTime(mInstant) + mInstant = DateTime(mInstant, DateTimeZone.getDefault()) .withYear(year) .withMonthOfYear(month) .withDayOfMonth(day) @@ -131,7 +131,7 @@ class DateInstant : Parcelable { } fun setTime(hour: Int, minute: Int) { - mInstant = DateTime(mInstant) + mInstant = DateTime(mInstant, DateTimeZone.getDefault()) .withHourOfDay(hour) .withMinuteOfHour(minute) .toInstant() From c7c51300308a93ab7e1402ec81f692cf9c6ef16a Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 14 Nov 2024 19:57:35 +0100 Subject: [PATCH 108/119] fix: passkeyview to passwordview --- .../dialogs/SetMainCredentialDialogFragment.kt | 4 ++-- .../fragments/PassphraseGeneratorFragment.kt | 12 ++++++------ .../fragments/PasswordGeneratorFragment.kt | 12 ++++++------ .../view/{PassKeyView.kt => PasswordView.kt} | 16 ++++++++-------- .../keepass/viewmodels/KeyGeneratorViewModel.kt | 4 ++-- .../res/layout/fragment_generate_passphrase.xml | 6 +++--- .../res/layout/fragment_generate_password.xml | 2 +- .../res/layout/fragment_set_main_credential.xml | 4 ++-- .../{view_passkey.xml => view_password.xml} | 0 app/src/main/res/values/attrs.xml | 8 ++++---- 10 files changed, 34 insertions(+), 34 deletions(-) rename app/src/main/java/com/kunzisoft/keepass/view/{PassKeyView.kt => PasswordView.kt} (91%) rename app/src/main/res/layout/{view_passkey.xml => view_password.xml} (100%) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt index 098441077..76a1019e3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt @@ -43,7 +43,7 @@ import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile import com.kunzisoft.keepass.utils.UriUtil.openUrl import com.kunzisoft.keepass.view.HardwareKeySelectionView import com.kunzisoft.keepass.view.KeyFileSelectionView -import com.kunzisoft.keepass.view.PassKeyView +import com.kunzisoft.keepass.view.PasswordView import com.kunzisoft.keepass.view.applyFontVisibility import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -60,7 +60,7 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { private lateinit var rootView: View private lateinit var passwordCheckBox: CompoundButton - private lateinit var passwordView: PassKeyView + private lateinit var passwordView: PasswordView private lateinit var passwordRepeatTextInputLayout: TextInputLayout private lateinit var passwordRepeatView: TextView diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt index 09820bd8a..92be05ba3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt @@ -34,12 +34,12 @@ import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.password.PassphraseGenerator import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.ClipboardHelper -import com.kunzisoft.keepass.view.PassKeyView +import com.kunzisoft.keepass.view.PasswordView import com.kunzisoft.keepass.viewmodels.KeyGeneratorViewModel class PassphraseGeneratorFragment : DatabaseFragment() { - private lateinit var passKeyView: PassKeyView + private lateinit var passwordView: PasswordView private lateinit var sliderWordCount: Slider private lateinit var wordCountText: EditText @@ -62,7 +62,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - passKeyView = view.findViewById(R.id.passphrase_view) + passwordView = view.findViewById(R.id.passphrase_view) val passphraseCopyView: ImageView? = view.findViewById(R.id.passphrase_copy_button) sliderWordCount = view.findViewById(R.id.slider_word_count) wordCountText = view.findViewById(R.id.word_count) @@ -80,7 +80,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() { passphraseCopyView?.setOnClickListener { clipboardHelper.timeoutCopyToClipboard( getString(R.string.passphrase), - passKeyView.passwordString, + passwordView.passwordString, true ) } @@ -146,7 +146,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() { generatePassphrase() mKeyGeneratorViewModel.passphraseGeneratedValidated.observe(viewLifecycleOwner) { - mKeyGeneratorViewModel.setKeyGenerated(passKeyView.passwordString) + mKeyGeneratorViewModel.setKeyGenerated(passwordView.passwordString) } mKeyGeneratorViewModel.requirePassphraseGeneration.observe(viewLifecycleOwner) { @@ -219,7 +219,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() { } catch (e: Exception) { Log.e(TAG, "Unable to generate a passphrase", e) } - passKeyView.passwordString = passphrase + passwordView.passwordString = passphrase charactersCountText.text = getString(R.string.character_count, passphrase.length) } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt index e3c1c08e8..d95bf2eb3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt @@ -36,12 +36,12 @@ import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.ClipboardHelper -import com.kunzisoft.keepass.view.PassKeyView +import com.kunzisoft.keepass.view.PasswordView import com.kunzisoft.keepass.viewmodels.KeyGeneratorViewModel class PasswordGeneratorFragment : DatabaseFragment() { - private lateinit var passKeyView: PassKeyView + private lateinit var passwordView: PasswordView private lateinit var sliderLength: Slider private lateinit var lengthEditView: EditText @@ -74,7 +74,7 @@ class PasswordGeneratorFragment : DatabaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - passKeyView = view.findViewById(R.id.password_view) + passwordView = view.findViewById(R.id.password_view) val passwordCopyView: ImageView? = view.findViewById(R.id.password_copy_button) sliderLength = view.findViewById(R.id.slider_length) @@ -101,7 +101,7 @@ class PasswordGeneratorFragment : DatabaseFragment() { passwordCopyView?.setOnClickListener { clipboardHelper.timeoutCopyToClipboard( getString(R.string.password), - passKeyView.passwordString, + passwordView.passwordString, true ) } @@ -195,7 +195,7 @@ class PasswordGeneratorFragment : DatabaseFragment() { generatePassword() mKeyGeneratorViewModel.passwordGeneratedValidated.observe(viewLifecycleOwner) { - mKeyGeneratorViewModel.setKeyGenerated(passKeyView.passwordString) + mKeyGeneratorViewModel.setKeyGenerated(passwordView.passwordString) } mKeyGeneratorViewModel.requirePasswordGeneration.observe(viewLifecycleOwner) { @@ -310,7 +310,7 @@ class PasswordGeneratorFragment : DatabaseFragment() { } catch (e: Exception) { Log.e(TAG, "Unable to generate a password", e) } - passKeyView.passwordString = password + passwordView.passwordString = password } override fun onDestroy() { diff --git a/app/src/main/java/com/kunzisoft/keepass/view/PassKeyView.kt b/app/src/main/java/com/kunzisoft/keepass/view/PasswordView.kt similarity index 91% rename from app/src/main/java/com/kunzisoft/keepass/view/PassKeyView.kt rename to app/src/main/java/com/kunzisoft/keepass/view/PasswordView.kt index 54c12f44c..408a35abc 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/PassKeyView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/PasswordView.kt @@ -37,9 +37,9 @@ import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.password.PasswordEntropy import com.kunzisoft.keepass.settings.PreferencesUtil -class PassKeyView @JvmOverloads constructor(context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0) +class PasswordView @JvmOverloads constructor(context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0) : FrameLayout(context, attrs, defStyle) { private var mPasswordEntropyCalculator: PasswordEntropy? = null @@ -60,13 +60,13 @@ class PassKeyView @JvmOverloads constructor(context: Context, init { context.theme.obtainStyledAttributes( attrs, - R.styleable.PassKeyView, + R.styleable.PasswordView, 0, 0).apply { try { - mViewHint = getString(R.styleable.PassKeyView_passKeyHint) + mViewHint = getString(R.styleable.PasswordView_passwordHint) ?: context.getString(R.string.password) - mMaxLines = getInteger(R.styleable.PassKeyView_passKeyMaxLines, mMaxLines) - mShowPassword = getBoolean(R.styleable.PassKeyView_passKeyVisible, + mMaxLines = getInteger(R.styleable.PasswordView_passwordMaxLines, mMaxLines) + mShowPassword = getBoolean(R.styleable.PasswordView_passwordVisible, !PreferencesUtil.hideProtectedValue(context)) } finally { recycle() @@ -74,7 +74,7 @@ class PassKeyView @JvmOverloads constructor(context: Context, } val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? - inflater?.inflate(R.layout.view_passkey, this) + inflater?.inflate(R.layout.view_password, this) passwordInputLayout = findViewById(R.id.password_input_layout) passwordInputLayout?.hint = mViewHint diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/KeyGeneratorViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/KeyGeneratorViewModel.kt index 7b9263abf..a52fb578b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/KeyGeneratorViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/KeyGeneratorViewModel.kt @@ -43,8 +43,8 @@ class KeyGeneratorViewModel: ViewModel() { val requirePassphraseGeneration : LiveData get() = _requirePassphraseGeneration private val _requirePassphraseGeneration = SingleLiveEvent() - fun setKeyGenerated(passKey: String) { - _keyGenerated.value = passKey + fun setKeyGenerated(value: String) { + _keyGenerated.value = value } fun validateKeyGenerated() { diff --git a/app/src/main/res/layout/fragment_generate_passphrase.xml b/app/src/main/res/layout/fragment_generate_passphrase.xml index 153ed7347..369c9b67a 100644 --- a/app/src/main/res/layout/fragment_generate_passphrase.xml +++ b/app/src/main/res/layout/fragment_generate_passphrase.xml @@ -50,14 +50,14 @@ android:layout_height="wrap_content" android:layout_margin="@dimen/card_view_padding"> - + app:passwordHint="@string/passphrase" + app:passwordMaxLines="7"/> - - + app:passwordVisible="false"/> - - - - + + + + From eee61db18984644e197094d61e6b1b981423b09e Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 15 Nov 2024 17:45:09 +0100 Subject: [PATCH 109/119] Add entropy --- .../SetMainCredentialDialogFragment.kt | 12 +- .../fragments/PassphraseGeneratorFragment.kt | 12 +- .../fragments/PasswordGeneratorFragment.kt | 12 +- .../{PasswordView.kt => PasswordEditView.kt} | 8 +- .../keepass/view/PasswordTextEditFieldView.kt | 109 ++++++++++++++++++ .../keepass/view/TemplateEditView.kt | 4 +- .../keepass/view/TextEditFieldView.kt | 14 +-- .../layout/fragment_generate_passphrase.xml | 2 +- .../res/layout/fragment_generate_password.xml | 2 +- .../layout/fragment_set_main_credential.xml | 2 +- ...ew_password.xml => view_password_edit.xml} | 4 +- 11 files changed, 146 insertions(+), 35 deletions(-) rename app/src/main/java/com/kunzisoft/keepass/view/{PasswordView.kt => PasswordEditView.kt} (95%) create mode 100644 app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt rename app/src/main/res/layout/{view_password.xml => view_password_edit.xml} (95%) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt index 76a1019e3..f8e0c7013 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetMainCredentialDialogFragment.kt @@ -43,7 +43,7 @@ import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile import com.kunzisoft.keepass.utils.UriUtil.openUrl import com.kunzisoft.keepass.view.HardwareKeySelectionView import com.kunzisoft.keepass.view.KeyFileSelectionView -import com.kunzisoft.keepass.view.PasswordView +import com.kunzisoft.keepass.view.PasswordEditView import com.kunzisoft.keepass.view.applyFontVisibility import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -60,7 +60,7 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { private lateinit var rootView: View private lateinit var passwordCheckBox: CompoundButton - private lateinit var passwordView: PasswordView + private lateinit var passwordEditView: PasswordEditView private lateinit var passwordRepeatTextInputLayout: TextInputLayout private lateinit var passwordRepeatView: TextView @@ -147,7 +147,7 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { } passwordCheckBox = rootView.findViewById(R.id.password_checkbox) - passwordView = rootView.findViewById(R.id.password_view) + passwordEditView = rootView.findViewById(R.id.password_view) passwordRepeatTextInputLayout = rootView.findViewById(R.id.password_repeat_input_layout) passwordRepeatView = rootView.findViewById(R.id.password_confirmation) passwordRepeatView.applyFontVisibility() @@ -276,7 +276,7 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { var error = false passwordRepeatTextInputLayout.error = null if (passwordCheckBox.isChecked) { - mMasterPassword = passwordView.passwordString + mMasterPassword = passwordEditView.passwordString val confPassword = passwordRepeatView.text.toString() // Verify that passwords match @@ -328,13 +328,13 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() { super.onResume() // To check checkboxes if a text is present - passwordView.addTextChangedListener(passwordTextWatcher) + passwordEditView.addTextChangedListener(passwordTextWatcher) } override fun onPause() { super.onPause() - passwordView.removeTextChangedListener(passwordTextWatcher) + passwordEditView.removeTextChangedListener(passwordTextWatcher) } private fun showEmptyPasswordConfirmationDialog() { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt index 92be05ba3..6070ea8d2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt @@ -34,12 +34,12 @@ import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.password.PassphraseGenerator import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.ClipboardHelper -import com.kunzisoft.keepass.view.PasswordView +import com.kunzisoft.keepass.view.PasswordEditView import com.kunzisoft.keepass.viewmodels.KeyGeneratorViewModel class PassphraseGeneratorFragment : DatabaseFragment() { - private lateinit var passwordView: PasswordView + private lateinit var passwordEditView: PasswordEditView private lateinit var sliderWordCount: Slider private lateinit var wordCountText: EditText @@ -62,7 +62,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - passwordView = view.findViewById(R.id.passphrase_view) + passwordEditView = view.findViewById(R.id.passphrase_view) val passphraseCopyView: ImageView? = view.findViewById(R.id.passphrase_copy_button) sliderWordCount = view.findViewById(R.id.slider_word_count) wordCountText = view.findViewById(R.id.word_count) @@ -80,7 +80,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() { passphraseCopyView?.setOnClickListener { clipboardHelper.timeoutCopyToClipboard( getString(R.string.passphrase), - passwordView.passwordString, + passwordEditView.passwordString, true ) } @@ -146,7 +146,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() { generatePassphrase() mKeyGeneratorViewModel.passphraseGeneratedValidated.observe(viewLifecycleOwner) { - mKeyGeneratorViewModel.setKeyGenerated(passwordView.passwordString) + mKeyGeneratorViewModel.setKeyGenerated(passwordEditView.passwordString) } mKeyGeneratorViewModel.requirePassphraseGeneration.observe(viewLifecycleOwner) { @@ -219,7 +219,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() { } catch (e: Exception) { Log.e(TAG, "Unable to generate a passphrase", e) } - passwordView.passwordString = passphrase + passwordEditView.passwordString = passphrase charactersCountText.text = getString(R.string.character_count, passphrase.length) } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt index d95bf2eb3..7a7d9c067 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt @@ -36,12 +36,12 @@ import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.ClipboardHelper -import com.kunzisoft.keepass.view.PasswordView +import com.kunzisoft.keepass.view.PasswordEditView import com.kunzisoft.keepass.viewmodels.KeyGeneratorViewModel class PasswordGeneratorFragment : DatabaseFragment() { - private lateinit var passwordView: PasswordView + private lateinit var passwordEditView: PasswordEditView private lateinit var sliderLength: Slider private lateinit var lengthEditView: EditText @@ -74,7 +74,7 @@ class PasswordGeneratorFragment : DatabaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - passwordView = view.findViewById(R.id.password_view) + passwordEditView = view.findViewById(R.id.password_view) val passwordCopyView: ImageView? = view.findViewById(R.id.password_copy_button) sliderLength = view.findViewById(R.id.slider_length) @@ -101,7 +101,7 @@ class PasswordGeneratorFragment : DatabaseFragment() { passwordCopyView?.setOnClickListener { clipboardHelper.timeoutCopyToClipboard( getString(R.string.password), - passwordView.passwordString, + passwordEditView.passwordString, true ) } @@ -195,7 +195,7 @@ class PasswordGeneratorFragment : DatabaseFragment() { generatePassword() mKeyGeneratorViewModel.passwordGeneratedValidated.observe(viewLifecycleOwner) { - mKeyGeneratorViewModel.setKeyGenerated(passwordView.passwordString) + mKeyGeneratorViewModel.setKeyGenerated(passwordEditView.passwordString) } mKeyGeneratorViewModel.requirePasswordGeneration.observe(viewLifecycleOwner) { @@ -310,7 +310,7 @@ class PasswordGeneratorFragment : DatabaseFragment() { } catch (e: Exception) { Log.e(TAG, "Unable to generate a password", e) } - passwordView.passwordString = password + passwordEditView.passwordString = password } override fun onDestroy() { diff --git a/app/src/main/java/com/kunzisoft/keepass/view/PasswordView.kt b/app/src/main/java/com/kunzisoft/keepass/view/PasswordEditView.kt similarity index 95% rename from app/src/main/java/com/kunzisoft/keepass/view/PasswordView.kt rename to app/src/main/java/com/kunzisoft/keepass/view/PasswordEditView.kt index 408a35abc..03e4f4f9a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/PasswordView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/PasswordEditView.kt @@ -37,9 +37,9 @@ import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.password.PasswordEntropy import com.kunzisoft.keepass.settings.PreferencesUtil -class PasswordView @JvmOverloads constructor(context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0) +class PasswordEditView @JvmOverloads constructor(context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0) : FrameLayout(context, attrs, defStyle) { private var mPasswordEntropyCalculator: PasswordEntropy? = null @@ -74,7 +74,7 @@ class PasswordView @JvmOverloads constructor(context: Context, } val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? - inflater?.inflate(R.layout.view_password, this) + inflater?.inflate(R.layout.view_password_edit, this) passwordInputLayout = findViewById(R.id.password_input_layout) passwordInputLayout?.hint = mViewHint diff --git a/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt new file mode 100644 index 000000000..c74dfec56 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt @@ -0,0 +1,109 @@ +package com.kunzisoft.keepass.view + +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.util.TypedValue +import android.widget.TextView +import androidx.core.view.ViewCompat +import androidx.core.view.setPadding +import com.google.android.material.progressindicator.LinearProgressIndicator +import com.kunzisoft.keepass.password.PasswordEntropy + + +class PasswordTextEditFieldView @JvmOverloads constructor(context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0) + : TextEditFieldView(context, attrs, defStyle) { + + private var passwordProgressViewId = ViewCompat.generateViewId() + private var passwordEntropyViewId = ViewCompat.generateViewId() + + private var mPasswordProgress = LinearProgressIndicator(context).apply { + layoutParams = LayoutParams( + LayoutParams.MATCH_PARENT, + LayoutParams.WRAP_CONTENT).apply { + addRule(ALIGN_PARENT_BOTTOM) + } + setPadding( + TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + 1f, + context.resources.displayMetrics + ).toInt() + ) + setIndicatorColor(PasswordEntropy.Strength.RISKY.color) + progress = 0 + max = 100 + } + + private val mPasswordEntropyView = TextView(context).apply { + LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT).apply { + addRule(ALIGN_PARENT_BOTTOM or ALIGN_PARENT_RIGHT) + } + } + + private var mPasswordEntropyCalculator: PasswordEntropy = PasswordEntropy { + valueView.text?.toString()?.let { firstPassword -> + getEntropyStrength(firstPassword) + } + } + + init { + buildViews() + + addView(mPasswordProgress) + addView(mPasswordEntropyView) + } + + private fun buildViews() { + mPasswordProgress.apply { + id = passwordProgressViewId + layoutParams = (layoutParams as LayoutParams?)?.also { + it.addRule(LEFT_OF, actionImageButtonId) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + it.addRule(START_OF, actionImageButtonId) + } + } + } + mPasswordEntropyView.apply { + id = passwordEntropyViewId + layoutParams = (layoutParams as LayoutParams?)?.also { + it.addRule(LEFT_OF, actionImageButtonId) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + it.addRule(START_OF, actionImageButtonId) + } + } + } + } + + private fun getEntropyStrength(passwordText: String) { + mPasswordEntropyCalculator.getEntropyStrength(passwordText) { entropyStrength -> + mPasswordProgress.apply { + post { + setIndicatorColor(entropyStrength.strength.color) + setProgressCompat(entropyStrength.estimationPercent, true) + } + } + mPasswordEntropyView.apply { + post { + text = PasswordEntropy.getStringEntropy(resources, entropyStrength.entropy) + } + } + } + } + + override var label: String + get() { + return super.label + } + set(value) { + super.label = value + // Define views Ids with label value + passwordProgressViewId = "passwordProgressViewId $value".hashCode() + passwordEntropyViewId = "passwordEntropyViewId $value".hashCode() + buildViews() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt index 470e19a69..9aa01ed49 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt @@ -113,7 +113,9 @@ class TemplateEditView @JvmOverloads constructor(context: Context, override fun buildLinearTextView(templateAttribute: TemplateAttribute, field: Field): TextEditFieldView? { return context?.let { - TextEditFieldView(it).apply { + (if (templateAttribute.label == TemplateField.LABEL_PASSWORD) + PasswordTextEditFieldView(it) + else TextEditFieldView(it)).apply { // hiddenProtectedValue (mHideProtectedValue) don't work with TextInputLayout setProtection(field.protectedValue.isProtected) default = templateAttribute.default diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt index a5706c052..bb8b533ed 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt @@ -27,24 +27,24 @@ import com.kunzisoft.keepass.database.helper.isStandardPasswordName import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.settings.PreferencesUtil -class TextEditFieldView @JvmOverloads constructor(context: Context, +open class TextEditFieldView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : RelativeLayout(context, attrs, defStyle), GenericTextFieldView { private var labelViewId = ViewCompat.generateViewId() private var valueViewId = ViewCompat.generateViewId() - private var actionImageButtonId = ViewCompat.generateViewId() + protected var actionImageButtonId = ViewCompat.generateViewId() private var textModified = false private var isColorizedPasswordActivated = PreferencesUtil.colorizePassword(context) - private val labelView = TextInputLayout(context).apply { + protected val labelView = TextInputLayout(context).apply { layoutParams = LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) } - private val valueView = TextInputEditText( + protected val valueView = TextInputEditText( ContextThemeWrapper(getContext(), R.style.KeepassDXStyle_TextInputLayout) ).apply { @@ -106,10 +106,10 @@ class TextEditFieldView @JvmOverloads constructor(context: Context, private fun buildViews() { labelView.apply { id = labelViewId - layoutParams = (layoutParams as LayoutParams?).also { - it?.addRule(LEFT_OF, actionImageButtonId) + layoutParams = (layoutParams as LayoutParams?)?.also { + it.addRule(LEFT_OF, actionImageButtonId) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it?.addRule(START_OF, actionImageButtonId) + it.addRule(START_OF, actionImageButtonId) } } } diff --git a/app/src/main/res/layout/fragment_generate_passphrase.xml b/app/src/main/res/layout/fragment_generate_passphrase.xml index 369c9b67a..8947a7fe6 100644 --- a/app/src/main/res/layout/fragment_generate_passphrase.xml +++ b/app/src/main/res/layout/fragment_generate_passphrase.xml @@ -50,7 +50,7 @@ android:layout_height="wrap_content" android:layout_margin="@dimen/card_view_padding"> - - - + app:layout_constraintBottom_toBottomOf="@+id/password_input_layout"/> Date: Fri, 15 Nov 2024 19:25:00 +0100 Subject: [PATCH 110/119] fix: Password color and entropy view --- CHANGELOG | 2 +- .../keepass/password/PasswordGenerator.kt | 86 +++++++++++-------- .../keepass/view/PasswordEditView.kt | 22 ++--- .../keepass/view/PasswordTextEditFieldView.kt | 59 ++++++++++--- .../keepass/view/TemplateEditView.kt | 3 +- .../keepass/view/TextEditFieldView.kt | 50 +++-------- .../main/res/layout/view_password_edit.xml | 20 ++--- app/src/main/res/values/styles.xml | 7 ++ .../metadata/android/en-US/changelogs/132.txt | 2 +- .../metadata/android/fr-FR/changelogs/132.txt | 2 +- 10 files changed, 135 insertions(+), 118 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 18b8592e0..7c4fa2f48 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,7 +6,7 @@ KeePassDX(4.1.0) * Fix date fields #1695 #1710 * Fix distinct domain names #1105 #1820 * Support otpauth://steam/Steam link #1289 - * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 + * Small fixes #1711 #1831 #1780 #1821 #1863 #1889 #1490 #1355 KeePassDX(4.0.8) * Fix graphical bug that prevented databases from being opened on some versions of Android #1848 #1850 diff --git a/app/src/main/java/com/kunzisoft/keepass/password/PasswordGenerator.kt b/app/src/main/java/com/kunzisoft/keepass/password/PasswordGenerator.kt index b34629e58..692f33557 100644 --- a/app/src/main/java/com/kunzisoft/keepass/password/PasswordGenerator.kt +++ b/app/src/main/java/com/kunzisoft/keepass/password/PasswordGenerator.kt @@ -21,6 +21,7 @@ package com.kunzisoft.keepass.password import android.content.res.Resources import android.graphics.Color +import android.text.Editable import android.text.Spannable import android.text.SpannableString import android.text.SpannableStringBuilder @@ -253,51 +254,62 @@ class PasswordGenerator(private val resources: Resources) { return charSet.toString() } + fun colorizedPassword(editable: Editable?) { + editable.toString().forEachIndexed { index, char -> + colorFromChar(char)?.let { color -> + editable?.setSpan( + ForegroundColorSpan(color), + index, + index + 1, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + } + } + fun getColorizedPassword(password: String): Spannable { val spannableString = SpannableStringBuilder() if (password.isNotEmpty()) { - password.forEach { - when { - UPPERCASE_CHARS.contains(it)|| - LOWERCASE_CHARS.contains(it) -> { - spannableString.append(it) - } - DIGIT_CHARS.contains(it) -> { - // RED - spannableString.append(colorizeChar(it, Color.rgb(246, 79, 62))) - } - SPECIAL_CHARS.contains(it) -> { - // Blue - spannableString.append(colorizeChar(it, Color.rgb(39, 166, 228))) - } - MINUS_CHAR.contains(it)|| - UNDERLINE_CHAR.contains(it)|| - BRACKET_CHARS.contains(it) -> { - // Purple - spannableString.append(colorizeChar(it, Color.rgb(185, 38, 209))) - } - extendedChars().contains(it) -> { - // Green - spannableString.append(colorizeChar(it, Color.rgb(44, 181, 50))) - } - else -> { - spannableString.append(it) - } - } + password.forEach { char -> + colorFromChar(char)?.let { color -> + val spannableColorChar = SpannableString(char.toString()) + spannableColorChar.setSpan( + ForegroundColorSpan(color), + 0, + 1, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + spannableString.append(spannableColorChar) + } ?: spannableString.append(char) } } return spannableString } - private fun colorizeChar(char: Char, color: Int): Spannable { - val spannableColorChar = SpannableString(char.toString()) - spannableColorChar.setSpan( - ForegroundColorSpan(color), - 0, - 1, - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE - ) - return spannableColorChar + private fun colorFromChar(char: Char): Int? { + return when { + DIGIT_CHARS.contains(char) -> { + // RED + Color.rgb(246, 79, 62) + } + SPECIAL_CHARS.contains(char) -> { + // Blue + Color.rgb(39, 166, 228) + } + MINUS_CHAR.contains(char)|| + UNDERLINE_CHAR.contains(char)|| + BRACKET_CHARS.contains(char) -> { + // Purple + Color.rgb(185, 38, 209) + } + extendedChars().contains(char) -> { + // Green + Color.rgb(44, 181, 50) + } + else -> { + null + } + } } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/PasswordEditView.kt b/app/src/main/java/com/kunzisoft/keepass/view/PasswordEditView.kt index 03e4f4f9a..d0c2059c6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/PasswordEditView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/PasswordEditView.kt @@ -33,8 +33,8 @@ import android.widget.TextView import com.google.android.material.progressindicator.LinearProgressIndicator import com.google.android.material.textfield.TextInputLayout import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.password.PasswordEntropy +import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.settings.PreferencesUtil class PasswordEditView @JvmOverloads constructor(context: Context, @@ -46,7 +46,6 @@ class PasswordEditView @JvmOverloads constructor(context: Context, private val passwordInputLayout: TextInputLayout private val passwordText: EditText - private var textModified = false private val passwordStrengthProgress: LinearProgressIndicator private val passwordEntropy: TextView @@ -76,22 +75,22 @@ class PasswordEditView @JvmOverloads constructor(context: Context, val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? inflater?.inflate(R.layout.view_password_edit, this) - passwordInputLayout = findViewById(R.id.password_input_layout) + passwordInputLayout = findViewById(R.id.password_edit_input_layout) passwordInputLayout?.hint = mViewHint - passwordText = findViewById(R.id.password_text) + passwordText = findViewById(R.id.password_edit_text) if (mShowPassword) { passwordText?.inputType = passwordText.inputType or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD } passwordText?.maxLines = mMaxLines passwordText?.applyFontVisibility() - passwordStrengthProgress = findViewById(R.id.password_strength_progress) + passwordStrengthProgress = findViewById(R.id.password_edit_strength_progress) passwordStrengthProgress?.apply { setIndicatorColor(PasswordEntropy.Strength.RISKY.color) progress = 0 max = 100 } - passwordEntropy = findViewById(R.id.password_entropy) + passwordEntropy = findViewById(R.id.password_edit_entropy) mPasswordEntropyCalculator = PasswordEntropy { passwordText?.text?.toString()?.let { firstPassword -> @@ -113,20 +112,11 @@ class PasswordEditView @JvmOverloads constructor(context: Context, } override fun afterTextChanged(editable: Editable) { - /* Fixme 1686 - if (textModified) { - textModified = false - } else { - textModified = true - val selectionStart = passwordText.selectionStart - val selectionEnd = passwordText.selectionEnd - passwordString = editable.toString() - passwordText.setSelection(selectionStart, selectionEnd) - }*/ mPasswordTextWatchers.forEach { it.afterTextChanged(editable) } getEntropyStrength(editable.toString()) + PasswordGenerator.colorizedPassword(editable) } } passwordText?.addTextChangedListener(mPasswordTextWatcher) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt index c74dfec56..faafa6709 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt @@ -2,13 +2,19 @@ package com.kunzisoft.keepass.view import android.content.Context import android.os.Build +import android.text.Spannable import android.util.AttributeSet import android.util.TypedValue import android.widget.TextView import androidx.core.view.ViewCompat import androidx.core.view.setPadding +import androidx.core.widget.TextViewCompat +import androidx.core.widget.doAfterTextChanged import com.google.android.material.progressindicator.LinearProgressIndicator +import com.kunzisoft.keepass.R import com.kunzisoft.keepass.password.PasswordEntropy +import com.kunzisoft.keepass.password.PasswordGenerator +import com.kunzisoft.keepass.settings.PreferencesUtil class PasswordTextEditFieldView @JvmOverloads constructor(context: Context, @@ -16,15 +22,23 @@ class PasswordTextEditFieldView @JvmOverloads constructor(context: Context, defStyle: Int = 0) : TextEditFieldView(context, attrs, defStyle) { + private var mPasswordEntropyCalculator: PasswordEntropy = PasswordEntropy { + valueView.text?.toString()?.let { firstPassword -> + getEntropyStrength(firstPassword) + } + } + private var isColorizedPasswordActivated = PreferencesUtil.colorizePassword(context) + private var passwordProgressViewId = ViewCompat.generateViewId() private var passwordEntropyViewId = ViewCompat.generateViewId() private var mPasswordProgress = LinearProgressIndicator(context).apply { layoutParams = LayoutParams( LayoutParams.MATCH_PARENT, - LayoutParams.WRAP_CONTENT).apply { - addRule(ALIGN_PARENT_BOTTOM) - } + LayoutParams.WRAP_CONTENT + ).apply { + addRule(ALIGN_PARENT_BOTTOM) + } setPadding( TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, @@ -38,22 +52,30 @@ class PasswordTextEditFieldView @JvmOverloads constructor(context: Context, } private val mPasswordEntropyView = TextView(context).apply { - LayoutParams( + layoutParams = LayoutParams( LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT).apply { - addRule(ALIGN_PARENT_BOTTOM or ALIGN_PARENT_RIGHT) - } - } - - private var mPasswordEntropyCalculator: PasswordEntropy = PasswordEntropy { - valueView.text?.toString()?.let { firstPassword -> - getEntropyStrength(firstPassword) + LayoutParams.WRAP_CONTENT + ).apply { + addRule(ALIGN_PARENT_BOTTOM) } + setPadding( + TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + 4f, + context.resources.displayMetrics + ).toInt() + ) + TextViewCompat.setTextAppearance(this, R.style.KeepassDXStyle_Text_Indicator) } init { buildViews() + valueView.doAfterTextChanged { editable -> + getEntropyStrength(editable.toString()) + PasswordGenerator.colorizedPassword(editable) + } + addView(mPasswordProgress) addView(mPasswordEntropyView) } @@ -71,9 +93,9 @@ class PasswordTextEditFieldView @JvmOverloads constructor(context: Context, mPasswordEntropyView.apply { id = passwordEntropyViewId layoutParams = (layoutParams as LayoutParams?)?.also { - it.addRule(LEFT_OF, actionImageButtonId) + it.addRule(ALIGN_RIGHT, passwordProgressViewId) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(START_OF, actionImageButtonId) + it.addRule(ALIGN_END, passwordProgressViewId) } } } @@ -95,6 +117,15 @@ class PasswordTextEditFieldView @JvmOverloads constructor(context: Context, } } + override fun spannableValue(value: String?): Spannable? { + if (value == null) + return null + return if (isColorizedPasswordActivated) + PasswordGenerator.getColorizedPassword(value) + else + super.spannableValue(value) + } + override var label: String get() { return super.label diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt index 9aa01ed49..e22baa1a4 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt @@ -17,6 +17,7 @@ import com.kunzisoft.keepass.database.element.template.TemplateAttribute import com.kunzisoft.keepass.database.element.template.TemplateAttributeAction import com.kunzisoft.keepass.database.element.template.TemplateField import com.kunzisoft.keepass.database.helper.getLocalizedName +import com.kunzisoft.keepass.database.helper.isStandardPasswordName import com.kunzisoft.keepass.model.DataDate import com.kunzisoft.keepass.model.DataTime import com.kunzisoft.keepass.otp.OtpEntryFields @@ -113,7 +114,7 @@ class TemplateEditView @JvmOverloads constructor(context: Context, override fun buildLinearTextView(templateAttribute: TemplateAttribute, field: Field): TextEditFieldView? { return context?.let { - (if (templateAttribute.label == TemplateField.LABEL_PASSWORD) + (if (TemplateField.isStandardPasswordName(context, templateAttribute.label)) PasswordTextEditFieldView(it) else TextEditFieldView(it)).apply { // hiddenProtectedValue (mHideProtectedValue) don't work with TextInputLayout diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt index bb8b533ed..ae5a09e50 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt @@ -8,23 +8,19 @@ import android.text.Spannable import android.text.SpannableString import android.util.AttributeSet import android.util.TypedValue -import android.view.ContextThemeWrapper import android.view.View import android.view.inputmethod.EditorInfo import android.widget.LinearLayout import android.widget.RelativeLayout import androidx.annotation.DrawableRes +import androidx.appcompat.view.ContextThemeWrapper import androidx.appcompat.widget.AppCompatImageButton import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.core.view.isVisible -import androidx.core.widget.doAfterTextChanged import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.database.element.template.TemplateField -import com.kunzisoft.keepass.database.helper.isStandardPasswordName -import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.settings.PreferencesUtil open class TextEditFieldView @JvmOverloads constructor(context: Context, @@ -36,17 +32,16 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, private var valueViewId = ViewCompat.generateViewId() protected var actionImageButtonId = ViewCompat.generateViewId() - private var textModified = false - private var isColorizedPasswordActivated = PreferencesUtil.colorizePassword(context) - - protected val labelView = TextInputLayout(context).apply { + private val labelView = TextInputLayout(context).apply { layoutParams = LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) } protected val valueView = TextInputEditText( - ContextThemeWrapper(getContext(), - R.style.KeepassDXStyle_TextInputLayout) + ContextThemeWrapper( + getContext(), + R.style.KeepassDXStyle_TextInputLayout + ) ).apply { layoutParams = LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, @@ -62,7 +57,10 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, maxLines = 1 } private var actionImageButton = AppCompatImageButton( - ContextThemeWrapper(context, R.style.KeepassDXStyle_ImageButton_Simple), null, 0).apply { + ContextThemeWrapper( + context, + R.style.KeepassDXStyle_ImageButton_Simple + ), null, 0).apply { layoutParams = LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).also { @@ -83,21 +81,6 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, init { // Manually write view to avoid view id bugs buildViews() - // To change the password color dynamically - /* Fixme 1686 - valueView.doAfterTextChanged { editable -> - editable?.let { text -> - if (textModified) { - textModified = false - } else { - textModified = true - val selectionStart = valueView.selectionStart - val selectionEnd = valueView.selectionEnd - value = text.toString() - valueView.setSelection(selectionStart, selectionEnd) - } - } - }*/ labelView.addView(valueView) addView(labelView) addView(actionImageButton) @@ -130,15 +113,6 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, return actionImageButton } - private fun spannableValue(value: String?): Spannable? { - if (value == null) - return null - return if (isColorizedPasswordActivated && TemplateField.isStandardPasswordName(context, label)) - PasswordGenerator.getColorizedPassword(value) - else - SpannableString(value) - } - override var label: String get() { return labelView.hint?.toString() ?: "" @@ -152,6 +126,10 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, buildViews() } + protected open fun spannableValue(value: String?): Spannable? { + return SpannableString(value) + } + override var value: String get() { return valueView.text?.toString() ?: "" diff --git a/app/src/main/res/layout/view_password_edit.xml b/app/src/main/res/layout/view_password_edit.xml index 81ce5eb2c..501f49f56 100644 --- a/app/src/main/res/layout/view_password_edit.xml +++ b/app/src/main/res/layout/view_password_edit.xml @@ -7,7 +7,7 @@ xmlns:tools="http://schemas.android.com/tools"> + app:layout_constraintBottom_toBottomOf="@+id/password_edit_input_layout"/> + style="@style/KeepassDXStyle.Text.Indicator" + android:padding="4dp" + app:layout_constraintBottom_toBottomOf="@+id/password_edit_input_layout" + app:layout_constraintEnd_toEndOf="@+id/password_edit_input_layout" /> \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 19103591e..234886ff1 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -416,6 +416,13 @@ ?attr/colorSecondary + + +