]> git.pld-linux.org Git - packages/KeePassX.git/blame - git.patch
- added update to current git master
[packages/KeePassX.git] / git.patch
CommitLineData
dddba08b
JR
1diff --git a/.travis.yml b/.travis.yml
2new file mode 100644
3index 0000000..15af85b
4--- /dev/null
5+++ b/.travis.yml
6@@ -0,0 +1,19 @@
7+os:
8+ - linux
9+ - osx
10+compiler:
11+ - gcc
12+ - clang
13+language: cpp
14+install:
15+ - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq update; fi
16+ - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake libqt4-dev libgcrypt11-dev zlib1g-dev libxtst-dev; fi
17+ - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; fi
18+ - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew install cmake qt libgcrypt; fi
19+before_script: mkdir build && pushd build
20+script:
21+ - cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_GUI_TESTS=ON ..
22+ - make
23+ - if [ "$TRAVIS_OS_NAME" = "linux" ]; then make test ARGS+="-E testgui"; fi
24+ - if [ "$TRAVIS_OS_NAME" = "linux" ]; then xvfb-run -a --server-args="-screen 0 800x600x24" make test ARGS+="-R testgui"; fi
25+ - if [ "$TRAVIS_OS_NAME" = "osx" ]; then make test; fi
26diff --git a/.tx/config b/.tx/config
27new file mode 100644
28index 0000000..015acf4
29--- /dev/null
30+++ b/.tx/config
31@@ -0,0 +1,8 @@
32+[main]
33+host = https://www.transifex.com
34+
35+[keepassx.keepassx_ents]
36+source_file = share/translations/keepassx_en.ts
37+file_filter = share/translations/keepassx_<lang>.ts
38+source_lang = en
39+type = QT
40diff --git a/CHANGELOG b/CHANGELOG
41index 2ffae87..b61597b 100644
42--- a/CHANGELOG
43+++ b/CHANGELOG
44@@ -1,4 +1,4 @@
45-2.0 Alpha 6 (2014-04-06)
46+2.0 Alpha 6 (2014-04-12)
47 =========================
48
49 - Add option to lock databases after user inactivity [#62]
50diff --git a/CMakeLists.txt b/CMakeLists.txt
51index 35642eb..3532c46 100644
52--- a/CMakeLists.txt
53+++ b/CMakeLists.txt
54@@ -32,7 +32,7 @@ include(CheckCXXSourceCompiles)
55 option(WITH_TESTS "Enable building of unit tests" ON)
56 option(WITH_GUI_TESTS "Enable building of GUI tests" OFF)
57 option(WITH_LTO "Enable Link Time Optimization (LTO)" OFF)
58-option(WITH_CXX11 "Build with the C++ 11 standard" OFF)
59+option(WITH_CXX11 "Build with the C++ 11 standard" ON)
60
61 set(KEEPASSX_VERSION "2.0 alpha 6")
62 set(KEEPASSX_VERSION_NUM "1.9.85")
63@@ -165,6 +165,9 @@ endif()
64
65 find_package(Qt4 4.6.0 REQUIRED ${QT_REQUIRED_MODULES})
66 include(${QT_USE_FILE})
67+# Debian sets the the build type to None for package builds.
68+# Make sure we don't enable asserts there.
69+set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG)
70
71 find_package(Gcrypt REQUIRED)
72 if(NOT (${GCRYPT_VERSION_STRING} VERSION_LESS "1.6.0"))
73diff --git a/INSTALL b/INSTALL
74index 028ccff..bde991b 100644
75--- a/INSTALL
76+++ b/INSTALL
77@@ -2,7 +2,7 @@ Building:
78 =========
79 mkdir build
80 cd build
81-cmake .. [CMAKE PARAMETERS]
82+cmake [CMAKE PARAMETERS] ..
83 make [-jX]
84
85 Common cmake parameters:
86diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt
87index 7069c6c..0e2b7fa 100644
88--- a/share/CMakeLists.txt
89+++ b/share/CMakeLists.txt
90@@ -13,6 +13,8 @@
91 # You should have received a copy of the GNU General Public License
92 # along with this program. If not, see <http://www.gnu.org/licenses/>.
93
94+add_subdirectory(translations)
95+
96 file(GLOB DATABASE_ICONS icons/database/*.png)
97
98 install(FILES ${DATABASE_ICONS} DESTINATION ${DATA_INSTALL_DIR}/icons/database)
99diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt
100new file mode 100644
101index 0000000..b1aa878
102--- /dev/null
103+++ b/share/translations/CMakeLists.txt
104@@ -0,0 +1,26 @@
105+# Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
106+#
107+# This program is free software: you can redistribute it and/or modify
108+# it under the terms of the GNU General Public License as published by
109+# the Free Software Foundation, either version 2 or (at your option)
110+# version 3 of the License.
111+#
112+# This program is distributed in the hope that it will be useful,
113+# but WITHOUT ANY WARRANTY; without even the implied warranty of
114+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
115+# GNU General Public License for more details.
116+#
117+# You should have received a copy of the GNU General Public License
118+# along with this program. If not, see <http://www.gnu.org/licenses/>.
119+
120+file(GLOB TRANSLATION_FILES *.ts)
121+get_filename_component(TRANSLATION_EN_ABS keepassx_en.ts ABSOLUTE)
122+list(REMOVE_ITEM TRANSLATION_FILES keepassx_en.ts)
123+list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS})
124+message(STATUS ${TRANSLATION_FILES})
125+
126+qt4_add_translation(QM_FILES ${TRANSLATION_FILES})
127+
128+install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations)
129+add_custom_target(translations DEPENDS ${QM_FILES})
130+add_dependencies(${PROGNAME} translations)
131diff --git a/share/translations/keepassx_de.ts b/share/translations/keepassx_de.ts
132new file mode 100644
133index 0000000..5433c3c
134--- /dev/null
135+++ b/share/translations/keepassx_de.ts
136@@ -0,0 +1,1177 @@
137+<?xml version="1.0" ?><!DOCTYPE TS><TS language="de" version="2.0">
138+<context>
139+ <name>AboutDialog</name>
140+ <message>
141+ <source>About KeePassX</source>
142+ <translation>Über KeePassX</translation>
143+ </message>
144+ <message>
145+ <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
146+ <translation>KeePassX ist unter der GNU General Public License (GPL) version 2 (version 3) veröffentlicht.</translation>
147+ </message>
148+</context>
149+<context>
150+ <name>AutoType</name>
151+ <message>
152+ <source>Auto-Type - KeePassX</source>
153+ <translation>Auto-Type - KeePassX</translation>
154+ </message>
155+ <message>
156+ <source>Couldn&apos;t find an entry that matches the window title.</source>
157+ <translation>Konnte dem Fenstertitel keinen passenden Eintrag zuordnen.</translation>
158+ </message>
159+</context>
160+<context>
161+ <name>AutoTypeAssociationsModel</name>
162+ <message>
163+ <source>Window</source>
164+ <translation>Fenster</translation>
165+ </message>
166+ <message>
167+ <source>Sequence</source>
168+ <translation>Reihenfolge</translation>
169+ </message>
170+ <message>
171+ <source>Default sequence</source>
172+ <translation>Standardreihenfolge</translation>
173+ </message>
174+</context>
175+<context>
176+ <name>AutoTypeSelectDialog</name>
177+ <message>
178+ <source>Auto-Type - KeePassX</source>
179+ <translation>Auto-Type - KeePassX</translation>
180+ </message>
181+ <message>
182+ <source>Select entry to Auto-Type:</source>
183+ <translation>Wählen Sie einen Eintrag für Auto-Type:</translation>
184+ </message>
185+</context>
186+<context>
187+ <name>ChangeMasterKeyWidget</name>
188+ <message>
189+ <source>Password</source>
190+ <translation>Passwort</translation>
191+ </message>
192+ <message>
193+ <source>Enter password:</source>
194+ <translation>Passwort eingeben:</translation>
195+ </message>
196+ <message>
197+ <source>Repeat password:</source>
198+ <translation>Passwort wiederholen:</translation>
199+ </message>
200+ <message>
201+ <source>Key file</source>
202+ <translation>Schlüsseldatei</translation>
203+ </message>
204+ <message>
205+ <source>Browse</source>
206+ <translation>Durchsuchen</translation>
207+ </message>
208+ <message>
209+ <source>Create</source>
210+ <translation>Erstellen</translation>
211+ </message>
212+ <message>
213+ <source>Key files</source>
214+ <translation>Schlüsseldateien</translation>
215+ </message>
216+ <message>
217+ <source>All files</source>
218+ <translation>Alle Dateien</translation>
219+ </message>
220+ <message>
221+ <source>Create Key File...</source>
222+ <translation>Erzeuge eine Schlüsseldatei...</translation>
223+ </message>
224+ <message>
225+ <source>Error</source>
226+ <translation>Fehler</translation>
227+ </message>
228+ <message>
229+ <source>Unable to create Key File : </source>
230+ <translation>Erzeugen der Schlüsseldatei nicht möglich:</translation>
231+ </message>
232+ <message>
233+ <source>Select a key file</source>
234+ <translation>Schlüsseldatei auswählen</translation>
235+ </message>
236+ <message>
237+ <source>Question</source>
238+ <translation>Frage</translation>
239+ </message>
240+ <message>
241+ <source>Do you really want to use an empty string as password?</source>
242+ <translation>Wollen Sie wirklich eine leere Zeichenkette als Passwort verwenden?</translation>
243+ </message>
244+ <message>
245+ <source>Different passwords supplied.</source>
246+ <translation>Unterschiedliche Passwörter eingegeben.</translation>
247+ </message>
248+</context>
249+<context>
250+ <name>DatabaseOpenWidget</name>
251+ <message>
252+ <source>Enter master key</source>
253+ <translation>Hauptschlüssel eingeben</translation>
254+ </message>
255+ <message>
256+ <source>Key File:</source>
257+ <translation>Schlüsseldatei:</translation>
258+ </message>
259+ <message>
260+ <source>Password:</source>
261+ <translation>Passwort:</translation>
262+ </message>
263+ <message>
264+ <source>Browse</source>
265+ <translation>Durchsuchen</translation>
266+ </message>
267+ <message>
268+ <source>Error</source>
269+ <translation>Fehler</translation>
270+ </message>
271+ <message>
272+ <source>Unable to open the database.</source>
273+ <translation>Öffnen der Datenbank nicht möglich.</translation>
274+ </message>
275+ <message>
276+ <source>Can&apos;t open key file</source>
277+ <translation>Schlüsseldatein kann nicht geöffnet werden</translation>
278+ </message>
279+ <message>
280+ <source>All files</source>
281+ <translation>Alle Dateien</translation>
282+ </message>
283+ <message>
284+ <source>Key files</source>
285+ <translation>Schlüsseldateien</translation>
286+ </message>
287+ <message>
288+ <source>Select key file</source>
289+ <translation>Schlüsseldatei auswählen</translation>
290+ </message>
291+</context>
292+<context>
293+ <name>DatabaseSettingsWidget</name>
294+ <message>
295+ <source>Database name:</source>
296+ <translation>Datenbankname:</translation>
297+ </message>
298+ <message>
299+ <source>Database description:</source>
300+ <translation>Datenbankbeschreibung:</translation>
301+ </message>
302+ <message>
303+ <source>Transform rounds:</source>
304+ <translation>Verschlüsselungsdurchläufe:</translation>
305+ </message>
306+ <message>
307+ <source>Default username:</source>
308+ <translation>Standardbenutzername:</translation>
309+ </message>
310+ <message>
311+ <source>Use recycle bin:</source>
312+ <translation>Verwende Papierkorb:</translation>
313+ </message>
314+ <message>
315+ <source> MiB</source>
316+ <translation> MiB</translation>
317+ </message>
318+ <message>
319+ <source>Benchmark</source>
320+ <translation>Benchmark</translation>
321+ </message>
322+ <message>
323+ <source>Max. history items:</source>
324+ <translation>Max Einträge im Verlauf:</translation>
325+ </message>
326+ <message>
327+ <source>Max. history size:</source>
328+ <translation>Max. Verlaufsgröße:</translation>
329+ </message>
330+</context>
331+<context>
332+ <name>DatabaseTabWidget</name>
333+ <message>
334+ <source>Root</source>
335+ <translation>Root</translation>
336+ </message>
337+ <message>
338+ <source>KeePass 2 Database</source>
339+ <translation>KeePass 2 Datenbank</translation>
340+ </message>
341+ <message>
342+ <source>All files</source>
343+ <translation>Alle Dateien</translation>
344+ </message>
345+ <message>
346+ <source>Open database</source>
347+ <translation>Datenbank öffnen</translation>
348+ </message>
349+ <message>
350+ <source>Warning</source>
351+ <translation>Warnung</translation>
352+ </message>
353+ <message>
354+ <source>File not found!</source>
355+ <translation>Datei nicht gefunden!</translation>
356+ </message>
357+ <message>
358+ <source>Open KeePass 1 database</source>
359+ <translation>KeePass 1 Datenbank öffnen</translation>
360+ </message>
361+ <message>
362+ <source>KeePass 1 database</source>
363+ <translation>KeePass 1 Datenbank</translation>
364+ </message>
365+ <message>
366+ <source>All files (*)</source>
367+ <translation>Alle Dateien (*)</translation>
368+ </message>
369+ <message>
370+ <source>Close?</source>
371+ <translation>Schließen?</translation>
372+ </message>
373+ <message>
374+ <source>&quot;%1&quot; is in edit mode.
375+Close anyway?</source>
376+ <translation>&quot;%1&quot; wird bearbeitet.
377+Trotzdem schließen?</translation>
378+ </message>
379+ <message>
380+ <source>Save changes?</source>
381+ <translation>Änderungen speichern?</translation>
382+ </message>
383+ <message>
384+ <source>&quot;%1&quot; was modified.
385+Save changes?</source>
386+ <translation>&quot;%1&quot; wurde geändert.
387+Änderungen speichern?</translation>
388+ </message>
389+ <message>
390+ <source>Error</source>
391+ <translation>Fehler</translation>
392+ </message>
393+ <message>
394+ <source>Writing the database failed.</source>
395+ <translation>Schreiben der Datenbank fehlgeschlagen.</translation>
396+ </message>
397+ <message>
398+ <source>Save database as</source>
399+ <translation>Datenbank speichern unter</translation>
400+ </message>
401+ <message>
402+ <source>New database</source>
403+ <translation>Neue Datenbank</translation>
404+ </message>
405+ <message>
406+ <source>locked</source>
407+ <translation>gesperrt</translation>
408+ </message>
409+</context>
410+<context>
411+ <name>DatabaseWidget</name>
412+ <message>
413+ <source>Change master key</source>
414+ <translation>Hauptschlüssel ändern</translation>
415+ </message>
416+ <message>
417+ <source>Delete entry?</source>
418+ <translation>Eintrag löschen?</translation>
419+ </message>
420+ <message>
421+ <source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
422+ <translation>Wollen Sie den Eintrag &quot;%1&quot; wirklich löschen?</translation>
423+ </message>
424+ <message>
425+ <source>Delete entries?</source>
426+ <translation>Einträge löschen?</translation>
427+ </message>
428+ <message>
429+ <source>Do you really want to delete %1 entries for good?</source>
430+ <translation>Wollen Sie die Einträge &quot;%1&quot; wirklich löschen?</translation>
431+ </message>
432+ <message>
433+ <source>Move entries to recycle bin?</source>
434+ <translation>Einträge in den Papierkorb verschieben?</translation>
435+ </message>
436+ <message numerus="yes">
437+ <source>Do you really want to move %n entry(s) to the recycle bin?</source>
438+ <translation><numerusform>Wollen Sie wirklich %n Eintrag in den Papierkorb verschieben?</numerusform><numerusform>Wollen Sie wirklich %n Einträge in den Papierkorb verschieben?</numerusform></translation>
439+ </message>
440+ <message>
441+ <source>Delete group?</source>
442+ <translation>Gruppe löschen?</translation>
443+ </message>
444+ <message>
445+ <source>Do you really want to delete the group &quot;%1&quot; for good?</source>
446+ <translation>Wollen Sie die Gruppe &quot;%1&quot; wirklich löschen?</translation>
447+ </message>
448+ <message>
449+ <source>Current group</source>
450+ <translation>Aktuelle Gruppe</translation>
451+ </message>
452+</context>
453+<context>
454+ <name>EditEntryWidget</name>
455+ <message>
456+ <source>Entry</source>
457+ <translation>Eintrag</translation>
458+ </message>
459+ <message>
460+ <source>Advanced</source>
461+ <translation>Fortgeschritten</translation>
462+ </message>
463+ <message>
464+ <source>Icon</source>
465+ <translation>Symbol</translation>
466+ </message>
467+ <message>
468+ <source>Auto-Type</source>
469+ <translation>Auto-Type</translation>
470+ </message>
471+ <message>
472+ <source>Properties</source>
473+ <translation>Eigenschaften</translation>
474+ </message>
475+ <message>
476+ <source>History</source>
477+ <translation>Verlauf</translation>
478+ </message>
479+ <message>
480+ <source>Entry history</source>
481+ <translation>Eintragsverlauf</translation>
482+ </message>
483+ <message>
484+ <source>Add entry</source>
485+ <translation>Eintrag hinzufügen</translation>
486+ </message>
487+ <message>
488+ <source>Edit entry</source>
489+ <translation>Eintrag bearbeiten</translation>
490+ </message>
491+ <message>
492+ <source>Error</source>
493+ <translation>Fehler</translation>
494+ </message>
495+ <message>
496+ <source>Different passwords supplied.</source>
497+ <translation>Unterschiedliche Passwörter eingegeben.</translation>
498+ </message>
499+ <message>
500+ <source>New attribute</source>
501+ <translation>Neue Eigenschaft</translation>
502+ </message>
503+ <message>
504+ <source>Select file</source>
505+ <translation>Datei wählen</translation>
506+ </message>
507+ <message>
508+ <source>Unable to open file</source>
509+ <translation>Öffnen der Datei nicht möglich</translation>
510+ </message>
511+ <message>
512+ <source>Save attachment</source>
513+ <translation>Anhang speichern</translation>
514+ </message>
515+ <message>
516+ <source>Unable to save the attachment:
517+</source>
518+ <translation>Speichern des Anhangs nicht möglich:</translation>
519+ </message>
520+ <message>
521+ <source>Tomorrow</source>
522+ <translation>Morgen</translation>
523+ </message>
524+ <message numerus="yes">
525+ <source>%n week(s)</source>
526+ <translation><numerusform>%n Woche</numerusform><numerusform>%n Wochen</numerusform></translation>
527+ </message>
528+ <message numerus="yes">
529+ <source>%n month(s)</source>
530+ <translation><numerusform>%n Monat</numerusform><numerusform>%n Monaten</numerusform></translation>
531+ </message>
532+ <message>
533+ <source>1 year</source>
534+ <translation>1 Jahr</translation>
535+ </message>
536+</context>
537+<context>
538+ <name>EditEntryWidgetAdvanced</name>
539+ <message>
540+ <source>Additional attributes</source>
541+ <translation>Zusätzliche Eigenschaften</translation>
542+ </message>
543+ <message>
544+ <source>Add</source>
545+ <translation>Hinzufügen</translation>
546+ </message>
547+ <message>
548+ <source>Edit</source>
549+ <translation>Bearbeiten</translation>
550+ </message>
551+ <message>
552+ <source>Remove</source>
553+ <translation>Entfernen</translation>
554+ </message>
555+ <message>
556+ <source>Attachments</source>
557+ <translation>Anhänge</translation>
558+ </message>
559+ <message>
560+ <source>Save</source>
561+ <translation>Speichern</translation>
562+ </message>
563+</context>
564+<context>
565+ <name>EditEntryWidgetAutoType</name>
566+ <message>
567+ <source>Enable Auto-Type for this entry</source>
568+ <translation>Auto-Type für diesen Eintrag aktivieren</translation>
569+ </message>
570+ <message>
571+ <source>Inherit default Auto-Type sequence from the group</source>
572+ <translation>Standard-Auto-Type-Sequenz von der Gruppe erben</translation>
573+ </message>
574+ <message>
575+ <source>Use custom Auto-Type sequence:</source>
576+ <translation>Benutzerdefinierte Auto-Type-Sequenz benutzen:</translation>
577+ </message>
578+ <message>
579+ <source>+</source>
580+ <translation>+</translation>
581+ </message>
582+ <message>
583+ <source>-</source>
584+ <translation>-</translation>
585+ </message>
586+ <message>
587+ <source>Window title:</source>
588+ <translation>Fenstertitel:</translation>
589+ </message>
590+ <message>
591+ <source>Use default sequence</source>
592+ <translation>Standardsequenz benutzen</translation>
593+ </message>
594+ <message>
595+ <source>Set custom sequence:</source>
596+ <translation>Benutzerdefinierte Sequenz verwenden:</translation>
597+ </message>
598+</context>
599+<context>
600+ <name>EditEntryWidgetHistory</name>
601+ <message>
602+ <source>Show</source>
603+ <translation>Anzeigen</translation>
604+ </message>
605+ <message>
606+ <source>Restore</source>
607+ <translation>Wiederherstellen</translation>
608+ </message>
609+ <message>
610+ <source>Delete</source>
611+ <translation>Löschen</translation>
612+ </message>
613+ <message>
614+ <source>Delete all</source>
615+ <translation>Alle löschen</translation>
616+ </message>
617+</context>
618+<context>
619+ <name>EditEntryWidgetMain</name>
620+ <message>
621+ <source>Title:</source>
622+ <translation>Titel:</translation>
623+ </message>
624+ <message>
625+ <source>Username:</source>
626+ <translation>Benutzername:</translation>
627+ </message>
628+ <message>
629+ <source>Password:</source>
630+ <translation>Passwort:</translation>
631+ </message>
632+ <message>
633+ <source>Repeat:</source>
634+ <translation>Wiederholen:</translation>
635+ </message>
636+ <message>
637+ <source>Gen.</source>
638+ <translation>Gen.</translation>
639+ </message>
640+ <message>
641+ <source>URL:</source>
642+ <translation>URL:</translation>
643+ </message>
644+ <message>
645+ <source>Expires</source>
646+ <translation>Erlischt</translation>
647+ </message>
648+ <message>
649+ <source>Presets</source>
650+ <translation>Vorgaben</translation>
651+ </message>
652+ <message>
653+ <source>Notes:</source>
654+ <translation>Notizen:</translation>
655+ </message>
656+</context>
657+<context>
658+ <name>EditGroupWidget</name>
659+ <message>
660+ <source>Group</source>
661+ <translation>Gruppe</translation>
662+ </message>
663+ <message>
664+ <source>Icon</source>
665+ <translation>Symbol</translation>
666+ </message>
667+ <message>
668+ <source>Properties</source>
669+ <translation>Eigenschaften</translation>
670+ </message>
671+ <message>
672+ <source>Add group</source>
673+ <translation>Gruppe hinzufügen</translation>
674+ </message>
675+ <message>
676+ <source>Edit group</source>
677+ <translation>Gruppe bearbeiten</translation>
678+ </message>
679+ <message>
680+ <source>Enable</source>
681+ <translation>Aktivieren</translation>
682+ </message>
683+ <message>
684+ <source>Disable</source>
685+ <translation>Deaktivieren</translation>
686+ </message>
687+ <message>
688+ <source>Inherit from parent group (%1)</source>
689+ <translation>Von der übergeordneten Gruppe (%1) erben</translation>
690+ </message>
691+</context>
692+<context>
693+ <name>EditGroupWidgetMain</name>
694+ <message>
695+ <source>Name</source>
696+ <translation>Name</translation>
697+ </message>
698+ <message>
699+ <source>Notes</source>
700+ <translation>Notizen</translation>
701+ </message>
702+ <message>
703+ <source>Expires</source>
704+ <translation>Erlischt</translation>
705+ </message>
706+ <message>
707+ <source>Search</source>
708+ <translation>Suche</translation>
709+ </message>
710+ <message>
711+ <source>Auto-type</source>
712+ <translation>Auto-type</translation>
713+ </message>
714+</context>
715+<context>
716+ <name>EditWidgetIcons</name>
717+ <message>
718+ <source>Use default icon</source>
719+ <translation>Standardsymbol verwenden</translation>
720+ </message>
721+ <message>
722+ <source>Use custom icon</source>
723+ <translation>Benutzerdefiniertes Symbol verwenden</translation>
724+ </message>
725+ <message>
726+ <source>Add custom icon</source>
727+ <translation>Benutzerdefiniertes Symbol hinzufügen</translation>
728+ </message>
729+ <message>
730+ <source>Delete custom icon</source>
731+ <translation>Benutzerdefiniertes Symbol löschen</translation>
732+ </message>
733+ <message>
734+ <source>Images</source>
735+ <translation>Bilder</translation>
736+ </message>
737+ <message>
738+ <source>All files</source>
739+ <translation>Alle Dateien</translation>
740+ </message>
741+ <message>
742+ <source>Select Image</source>
743+ <translation>Bild auswählen</translation>
744+ </message>
745+ <message>
746+ <source>Can&apos;t delete icon!</source>
747+ <translation>Symbol kann nicht gelöscht werden!</translation>
748+ </message>
749+ <message numerus="yes">
750+ <source>Can&apos;t delete icon. Still used by %n item(s).</source>
751+ <translation><numerusform>Symbol kann nicht gelöscht werden. Es wird von %n Eintrag verwendet.</numerusform><numerusform>Symbol kann nicht gelöscht werden. Es wird von %n Einträgen verwendet.</numerusform></translation>
752+ </message>
753+</context>
754+<context>
755+ <name>EditWidgetProperties</name>
756+ <message>
757+ <source>Created:</source>
758+ <translation>Erstellt:</translation>
759+ </message>
760+ <message>
761+ <source>Modified:</source>
762+ <translation>Bearbeitet:</translation>
763+ </message>
764+ <message>
765+ <source>Accessed:</source>
766+ <translation>Zugegriffen:</translation>
767+ </message>
768+ <message>
769+ <source>Uuid:</source>
770+ <translation>Uuid:</translation>
771+ </message>
772+</context>
773+<context>
774+ <name>EntryAttributesModel</name>
775+ <message>
776+ <source>Name</source>
777+ <translation>Name</translation>
778+ </message>
779+</context>
780+<context>
781+ <name>EntryHistoryModel</name>
782+ <message>
783+ <source>Last modified</source>
784+ <translation>Zuletzt geändert</translation>
785+ </message>
786+ <message>
787+ <source>Title</source>
788+ <translation>Titel</translation>
789+ </message>
790+ <message>
791+ <source>Username</source>
792+ <translation>Benutzername</translation>
793+ </message>
794+ <message>
795+ <source>URL</source>
796+ <translation>URL</translation>
797+ </message>
798+</context>
799+<context>
800+ <name>EntryModel</name>
801+ <message>
802+ <source>Group</source>
803+ <translation>Gruppe</translation>
804+ </message>
805+ <message>
806+ <source>Title</source>
807+ <translation>Titel</translation>
808+ </message>
809+ <message>
810+ <source>Username</source>
811+ <translation>Benutzername</translation>
812+ </message>
813+ <message>
814+ <source>URL</source>
815+ <translation>URL</translation>
816+ </message>
817+</context>
818+<context>
819+ <name>Group</name>
820+ <message>
821+ <source>Recycle Bin</source>
822+ <translation>Papierkorb</translation>
823+ </message>
824+</context>
825+<context>
826+ <name>KeePass1OpenWidget</name>
827+ <message>
828+ <source>Import KeePass1 database</source>
829+ <translation>KeePass 1 Datenbank importieren</translation>
830+ </message>
831+ <message>
832+ <source>Error</source>
833+ <translation>Fehler</translation>
834+ </message>
835+ <message>
836+ <source>Unable to open the database.</source>
837+ <translation>Öffnen der Datenbank nicht möglich.</translation>
838+ </message>
839+</context>
840+<context>
841+ <name>KeePass1Reader</name>
842+ <message>
843+ <source>Unable to read keyfile.</source>
844+ <translation>Lesen der Schlüsseldatei nicht möglich.</translation>
845+ </message>
846+ <message>
847+ <source>Not a KeePass database.</source>
848+ <translation>Keine KeePass-Datenbank.</translation>
849+ </message>
850+ <message>
851+ <source>Unsupported encryption algorithm.</source>
852+ <translation>Nicht unterstützter Verschlüsselungsalgorithmus.</translation>
853+ </message>
854+ <message>
855+ <source>Unsupported KeePass database version.</source>
856+ <translation>Nicht unterstützte KeePass-Datenbankversion.</translation>
857+ </message>
858+ <message>
859+ <source>Root</source>
860+ <translation>Root</translation>
861+ </message>
862+</context>
863+<context>
864+ <name>KeePass2Reader</name>
865+ <message>
866+ <source>Not a KeePass database.</source>
867+ <translation>Keine KeePass-Datenbank.</translation>
868+ </message>
869+ <message>
870+ <source>Unsupported KeePass database version.</source>
871+ <translation>Nicht unterstützte KeePass-Datenbankversion.</translation>
872+ </message>
873+ <message>
874+ <source>Wrong key or database file is corrupt.</source>
875+ <translation>Falscher Schlüssel oder die Datei ist beschädigt.</translation>
876+ </message>
877+</context>
878+<context>
879+ <name>MainWindow</name>
880+ <message>
881+ <source>Database</source>
882+ <translation>Datenbank</translation>
883+ </message>
884+ <message>
885+ <source>Recent databases</source>
886+ <translation>Aktuelle Datenbanken</translation>
887+ </message>
888+ <message>
889+ <source>Help</source>
890+ <translation>Hilfe</translation>
891+ </message>
892+ <message>
893+ <source>Entries</source>
894+ <translation>Einträge</translation>
895+ </message>
896+ <message>
897+ <source>Copy attribute to clipboard</source>
898+ <translation>Eingenschaft in die Zwischenablage kopieren</translation>
899+ </message>
900+ <message>
901+ <source>Groups</source>
902+ <translation>Gruppen</translation>
903+ </message>
904+ <message>
905+ <source>Extras</source>
906+ <translation>Extras</translation>
907+ </message>
908+ <message>
909+ <source>View</source>
910+ <translation>Ansicht</translation>
911+ </message>
912+ <message>
913+ <source>Quit</source>
914+ <translation>Beenden</translation>
915+ </message>
916+ <message>
917+ <source>About</source>
918+ <translation>Über</translation>
919+ </message>
920+ <message>
921+ <source>Open database</source>
922+ <translation>Datenbank öffnen</translation>
923+ </message>
924+ <message>
925+ <source>Save database</source>
926+ <translation>Datenbank speichern</translation>
927+ </message>
928+ <message>
929+ <source>Close database</source>
930+ <translation>Datenbank schließen</translation>
931+ </message>
932+ <message>
933+ <source>New database</source>
934+ <translation>Neue Datenbank</translation>
935+ </message>
936+ <message>
937+ <source>Add new entry</source>
938+ <translation>Neuen Eintrag hinzufügen</translation>
939+ </message>
940+ <message>
941+ <source>View/Edit entry</source>
942+ <translation>Eintrag anzeigen/bearbeiten</translation>
943+ </message>
944+ <message>
945+ <source>Delete entry</source>
946+ <translation>Eintrag löschen</translation>
947+ </message>
948+ <message>
949+ <source>Add new group</source>
950+ <translation>Neue Gruppe hinzufügen</translation>
951+ </message>
952+ <message>
953+ <source>Edit group</source>
954+ <translation>Gruppe bearbeiten</translation>
955+ </message>
956+ <message>
957+ <source>Delete group</source>
958+ <translation>Gruppe löschen</translation>
959+ </message>
960+ <message>
961+ <source>Save database as</source>
962+ <translation>Datenbank speichern als</translation>
963+ </message>
964+ <message>
965+ <source>Change master key</source>
966+ <translation>Hauptschlüssel ändern</translation>
967+ </message>
968+ <message>
969+ <source>Database settings</source>
970+ <translation>Datenbankeinstellungen</translation>
971+ </message>
972+ <message>
973+ <source>Import KeePass 1 database</source>
974+ <translation>KeePass 1 Datenbank importieren</translation>
975+ </message>
976+ <message>
977+ <source>Clone entry</source>
978+ <translation>Eintrag klonen</translation>
979+ </message>
980+ <message>
981+ <source>Find</source>
982+ <translation>Suchen</translation>
983+ </message>
984+ <message>
985+ <source>Username</source>
986+ <translation>Benutzername</translation>
987+ </message>
988+ <message>
989+ <source>Copy username to clipboard</source>
990+ <translation>Benutzername in die Zwischenablage kopieren</translation>
991+ </message>
992+ <message>
993+ <source>Password</source>
994+ <translation>Passwort</translation>
995+ </message>
996+ <message>
997+ <source>Copy password to clipboard</source>
998+ <translation>Passwort in die Zwischenablage kopieren</translation>
999+ </message>
1000+ <message>
1001+ <source>Settings</source>
1002+ <translation>Einstellungen</translation>
1003+ </message>
1004+ <message>
1005+ <source>Perform Auto-Type</source>
1006+ <translation>Auto-Type ausführen</translation>
1007+ </message>
1008+ <message>
1009+ <source>Open URL</source>
1010+ <translation>URL öffnen</translation>
1011+ </message>
1012+ <message>
1013+ <source>Lock databases</source>
1014+ <translation>Datenbank sperren</translation>
1015+ </message>
1016+ <message>
1017+ <source>Title</source>
1018+ <translation>Titel</translation>
1019+ </message>
1020+ <message>
1021+ <source>URL</source>
1022+ <translation>URL</translation>
1023+ </message>
1024+ <message>
1025+ <source>Notes</source>
1026+ <translation>Notizen</translation>
1027+ </message>
1028+ <message>
1029+ <source>Show toolbar</source>
1030+ <translation>Symbolleiste anzeigen</translation>
1031+ </message>
1032+ <message>
1033+ <source>read-only</source>
1034+ <translation>Nur Lesezugriff</translation>
1035+ </message>
1036+</context>
1037+<context>
1038+ <name>PasswordGeneratorWidget</name>
1039+ <message>
1040+ <source>Password:</source>
1041+ <translation>Passwort:</translation>
1042+ </message>
1043+ <message>
1044+ <source>Length:</source>
1045+ <translation>Länge:</translation>
1046+ </message>
1047+ <message>
1048+ <source>Character Types</source>
1049+ <translation>Zeichenarten</translation>
1050+ </message>
1051+ <message>
1052+ <source>Upper Case Letters</source>
1053+ <translation>Großbuchstaben</translation>
1054+ </message>
1055+ <message>
1056+ <source>Lower Case Letters</source>
1057+ <translation>Kleinbuchstaben</translation>
1058+ </message>
1059+ <message>
1060+ <source>Numbers</source>
1061+ <translation>Zahlen</translation>
1062+ </message>
1063+ <message>
1064+ <source>Special Characters</source>
1065+ <translation>Sonderzeichen</translation>
1066+ </message>
1067+ <message>
1068+ <source>Exclude look-alike characters</source>
1069+ <translation>Gleich aussehende Zeichen ausschließen</translation>
1070+ </message>
1071+ <message>
1072+ <source>Ensure that the password contains characters from every group</source>
1073+ <translation>Sicher stellen, dass das Passwort Zeichen aller Gruppen enthält</translation>
1074+ </message>
1075+ <message>
1076+ <source>Accept</source>
1077+ <translation>Akzeptieren</translation>
1078+ </message>
1079+</context>
1080+<context>
1081+ <name>QCommandLineParser</name>
1082+ <message>
1083+ <source>Displays version information.</source>
1084+ <translation>Versionsinformationen anzeigen.</translation>
1085+ </message>
1086+ <message>
1087+ <source>Displays this help.</source>
1088+ <translation>Zeigt diese Hilfe an.</translation>
1089+ </message>
1090+ <message>
1091+ <source>Unknown option &apos;%1&apos;.</source>
1092+ <translation>Unbekannte Option &apos;%1&apos;.</translation>
1093+ </message>
1094+ <message>
1095+ <source>Unknown options: %1.</source>
1096+ <translation>Unbekannte Optionen: &apos;%1&apos;.</translation>
1097+ </message>
1098+ <message>
1099+ <source>Missing value after &apos;%1&apos;.</source>
1100+ <translation>Fehlender Wert nach &apos;%1&apos;.</translation>
1101+ </message>
1102+ <message>
1103+ <source>Unexpected value after &apos;%1&apos;.</source>
1104+ <translation>Unerwarteter Wert nach &apos;%1&apos;.</translation>
1105+ </message>
1106+ <message>
1107+ <source>[options]</source>
1108+ <translation>[Optionen]</translation>
1109+ </message>
1110+ <message>
1111+ <source>Usage: %1</source>
1112+ <translation>Verwendung: %1</translation>
1113+ </message>
1114+ <message>
1115+ <source>Options:</source>
1116+ <translation>Optionen:</translation>
1117+ </message>
1118+ <message>
1119+ <source>Arguments:</source>
1120+ <translation>Argumente:</translation>
1121+ </message>
1122+</context>
1123+<context>
1124+ <name>QSaveFile</name>
1125+ <message>
1126+ <source>Existing file %1 is not writable</source>
1127+ <translation>Bestehende Datei(en) %1 ist nicht schreibbar</translation>
1128+ </message>
1129+ <message>
1130+ <source>Writing canceled by application</source>
1131+ <translation>Schreiben von der Applikation abgebrochen</translation>
1132+ </message>
1133+ <message>
1134+ <source>Partial write. Partition full?</source>
1135+ <translation>Unvollständiger Schreibvorgang. Partition voll?</translation>
1136+ </message>
1137+</context>
1138+<context>
1139+ <name>QtIOCompressor</name>
1140+ <message>
1141+ <source>Internal zlib error when compressing: </source>
1142+ <translation>Interner Fehler in zlib beim komprimieren:</translation>
1143+ </message>
1144+ <message>
1145+ <source>Error writing to underlying device: </source>
1146+ <translation>Fehler beim Schreiben auf das zugrunde liegende Gerät: </translation>
1147+ </message>
1148+ <message>
1149+ <source>Error opening underlying device: </source>
1150+ <translation>Fehler beim Öffnen des zugrunde liegenden Gerätes: </translation>
1151+ </message>
1152+ <message>
1153+ <source>Error reading data from underlying device: </source>
1154+ <translation>Fehler beim Lesen von Daten auf dem zugrunde liegenden Gerät: </translation>
1155+ </message>
1156+ <message>
1157+ <source>Internal zlib error when decompressing: </source>
1158+ <translation>Interner Fehler in zlib beim dekomprimieren:</translation>
1159+ </message>
1160+</context>
1161+<context>
1162+ <name>QtIOCompressor::open</name>
1163+ <message>
1164+ <source>The gzip format not supported in this version of zlib.</source>
1165+ <translation>Das gzip-Format wird von dieser zlib Version nicht unterstützt.</translation>
1166+ </message>
1167+ <message>
1168+ <source>Internal zlib error: </source>
1169+ <translation>Interner Fehler in zlib:</translation>
1170+ </message>
1171+</context>
1172+<context>
1173+ <name>SearchWidget</name>
1174+ <message>
1175+ <source>Find:</source>
1176+ <translation>Suchen nach:</translation>
1177+ </message>
1178+ <message>
1179+ <source>Case sensitive</source>
1180+ <translation>Groß-/Kleinschreibung unterscheiden</translation>
1181+ </message>
1182+ <message>
1183+ <source>Current group</source>
1184+ <translation>Aktuelle Gruppe</translation>
1185+ </message>
1186+ <message>
1187+ <source>Root group</source>
1188+ <translation>Root-Gruppe</translation>
1189+ </message>
1190+</context>
1191+<context>
1192+ <name>SettingsWidget</name>
1193+ <message>
1194+ <source>Application Settings</source>
1195+ <translation>Anwendungseinstellungen</translation>
1196+ </message>
1197+ <message>
1198+ <source>General</source>
1199+ <translation>Allgemein</translation>
1200+ </message>
1201+ <message>
1202+ <source>Security</source>
1203+ <translation>Sicherheit</translation>
1204+ </message>
1205+</context>
1206+<context>
1207+ <name>SettingsWidgetGeneral</name>
1208+ <message>
1209+ <source>Remember last databases</source>
1210+ <translation>Letzte Datenbank merken</translation>
1211+ </message>
1212+ <message>
1213+ <source>Open previous databases on startup</source>
1214+ <translation>Letzte Datenbank beim Starten öffnen</translation>
1215+ </message>
1216+ <message>
1217+ <source>Mark as modified on expanded state changes</source>
1218+ <translation>Als erweiterte Zustandsänderungen makieren</translation>
1219+ </message>
1220+ <message>
1221+ <source>Automatically save on exit</source>
1222+ <translation>Automatisch speichern beim Schließen</translation>
1223+ </message>
1224+ <message>
1225+ <source>Automatically save after every change</source>
1226+ <translation>Automatisch nach jeder Änderung speichern</translation>
1227+ </message>
1228+ <message>
1229+ <source>Minimize when copying to clipboard</source>
1230+ <translation>Minimieren beim Kopieren in die Zwischenablage</translation>
1231+ </message>
1232+ <message>
1233+ <source>Use group icon on entry creation</source>
1234+ <translation>Gruppensymbol für das Erstellen neuer Einträge verwenden</translation>
1235+ </message>
1236+ <message>
1237+ <source>Global Auto-Type shortcut</source>
1238+ <translation>Globale Tastenkombination für Auto-Type</translation>
1239+ </message>
1240+ <message>
1241+ <source>Use entry title to match windows for global auto-type</source>
1242+ <translation>Verwende den Eintragstitel für entsprechende Fenster für den globale Auto-Typ</translation>
1243+ </message>
1244+</context>
1245+<context>
1246+ <name>SettingsWidgetSecurity</name>
1247+ <message>
1248+ <source>Clear clipboard after</source>
1249+ <translation>Zwischenablage leeren nach</translation>
1250+ </message>
1251+ <message>
1252+ <source> sec</source>
1253+ <translation> sek</translation>
1254+ </message>
1255+ <message>
1256+ <source>Lock databases after inactivity of</source>
1257+ <translation>Datenbank sperren nach einer Inaktivität von</translation>
1258+ </message>
1259+ <message>
1260+ <source>Show passwords in cleartext by default</source>
1261+ <translation>Passwort standartmäßig in Klartext anzeigen</translation>
1262+ </message>
1263+ <message>
1264+ <source>Always ask before performing auto-type</source>
1265+ <translation>Immer vor einem Auto-type fragen</translation>
1266+ </message>
1267+</context>
1268+<context>
1269+ <name>UnlockDatabaseWidget</name>
1270+ <message>
1271+ <source>Unlock database</source>
1272+ <translation>Datenbank entsperren</translation>
1273+ </message>
1274+ <message>
1275+ <source>Error</source>
1276+ <translation>Fehler</translation>
1277+ </message>
1278+ <message>
1279+ <source>Wrong key.</source>
1280+ <translation>Falscher Schlüssel.</translation>
1281+ </message>
1282+</context>
1283+<context>
1284+ <name>WelcomeWidget</name>
1285+ <message>
1286+ <source>Welcome!</source>
1287+ <translation>Willkommen!</translation>
1288+ </message>
1289+</context>
1290+<context>
1291+ <name>main</name>
1292+ <message>
1293+ <source>KeePassX - cross-platform password manager</source>
1294+ <translation>KeePassX - plattformübergreifender Passwortmanager</translation>
1295+ </message>
1296+ <message>
1297+ <source>filename of the password database to open (*.kdbx)</source>
1298+ <translation>Dateiname für die zu öffnende Passwortdatenbank (*.kdbx)</translation>
1299+ </message>
1300+ <message>
1301+ <source>path to a custom config file</source>
1302+ <translation>Pfad zu einer benutzerdefinierten Konfigurationsdatei</translation>
1303+ </message>
1304+ <message>
1305+ <source>password of the database (DANGEROUS!)</source>
1306+ <translation>Passwort der Datenbank (GEFÄHRLICH!)</translation>
1307+ </message>
1308+ <message>
1309+ <source>key file of the database</source>
1310+ <translation>Schlüsseldatei der Datenbank</translation>
1311+ </message>
1312+</context>
1313+</TS>
1314\ No newline at end of file
1315diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts
1316new file mode 100644
1317index 0000000..a7b5b10
1318--- /dev/null
1319+++ b/share/translations/keepassx_en.ts
1320@@ -0,0 +1,1216 @@
1321+<?xml version="1.0" encoding="utf-8"?>
1322+<!DOCTYPE TS>
1323+<TS version="2.0" language="en_US">
1324+<context>
1325+ <name>AboutDialog</name>
1326+ <message>
1327+ <source>About KeePassX</source>
1328+ <translation type="unfinished"></translation>
1329+ </message>
1330+ <message>
1331+ <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
1332+ <translation type="unfinished"></translation>
1333+ </message>
1334+</context>
1335+<context>
1336+ <name>AutoType</name>
1337+ <message>
1338+ <source>Auto-Type - KeePassX</source>
1339+ <translation type="unfinished"></translation>
1340+ </message>
1341+ <message>
1342+ <source>Couldn&apos;t find an entry that matches the window title:</source>
1343+ <translation type="unfinished"></translation>
1344+ </message>
1345+</context>
1346+<context>
1347+ <name>AutoTypeAssociationsModel</name>
1348+ <message>
1349+ <source>Window</source>
1350+ <translation type="unfinished"></translation>
1351+ </message>
1352+ <message>
1353+ <source>Sequence</source>
1354+ <translation type="unfinished"></translation>
1355+ </message>
1356+ <message>
1357+ <source>Default sequence</source>
1358+ <translation type="unfinished"></translation>
1359+ </message>
1360+</context>
1361+<context>
1362+ <name>AutoTypeSelectDialog</name>
1363+ <message>
1364+ <source>Auto-Type - KeePassX</source>
1365+ <translation type="unfinished"></translation>
1366+ </message>
1367+ <message>
1368+ <source>Select entry to Auto-Type:</source>
1369+ <translation type="unfinished"></translation>
1370+ </message>
1371+</context>
1372+<context>
1373+ <name>ChangeMasterKeyWidget</name>
1374+ <message>
1375+ <source>Password</source>
1376+ <translation type="unfinished"></translation>
1377+ </message>
1378+ <message>
1379+ <source>Enter password:</source>
1380+ <translation type="unfinished"></translation>
1381+ </message>
1382+ <message>
1383+ <source>Repeat password:</source>
1384+ <translation type="unfinished"></translation>
1385+ </message>
1386+ <message>
1387+ <source>Key file</source>
1388+ <translation type="unfinished"></translation>
1389+ </message>
1390+ <message>
1391+ <source>Browse</source>
1392+ <translation type="unfinished"></translation>
1393+ </message>
1394+ <message>
1395+ <source>Create</source>
1396+ <translation type="unfinished"></translation>
1397+ </message>
1398+ <message>
1399+ <source>Key files</source>
1400+ <translation type="unfinished"></translation>
1401+ </message>
1402+ <message>
1403+ <source>All files</source>
1404+ <translation type="unfinished"></translation>
1405+ </message>
1406+ <message>
1407+ <source>Create Key File...</source>
1408+ <translation type="unfinished"></translation>
1409+ </message>
1410+ <message>
1411+ <source>Error</source>
1412+ <translation type="unfinished"></translation>
1413+ </message>
1414+ <message>
1415+ <source>Unable to create Key File : </source>
1416+ <translation type="unfinished"></translation>
1417+ </message>
1418+ <message>
1419+ <source>Select a key file</source>
1420+ <translation type="unfinished"></translation>
1421+ </message>
1422+ <message>
1423+ <source>Question</source>
1424+ <translation type="unfinished"></translation>
1425+ </message>
1426+ <message>
1427+ <source>Do you really want to use an empty string as password?</source>
1428+ <translation type="unfinished"></translation>
1429+ </message>
1430+ <message>
1431+ <source>Different passwords supplied.</source>
1432+ <translation type="unfinished"></translation>
1433+ </message>
1434+</context>
1435+<context>
1436+ <name>DatabaseOpenWidget</name>
1437+ <message>
1438+ <source>Enter master key</source>
1439+ <translation type="unfinished"></translation>
1440+ </message>
1441+ <message>
1442+ <source>Key File:</source>
1443+ <translation type="unfinished"></translation>
1444+ </message>
1445+ <message>
1446+ <source>Password:</source>
1447+ <translation type="unfinished"></translation>
1448+ </message>
1449+ <message>
1450+ <source>Browse</source>
1451+ <translation type="unfinished"></translation>
1452+ </message>
1453+ <message>
1454+ <source>Error</source>
1455+ <translation type="unfinished"></translation>
1456+ </message>
1457+ <message>
1458+ <source>Unable to open the database.</source>
1459+ <translation type="unfinished"></translation>
1460+ </message>
1461+ <message>
1462+ <source>Can&apos;t open key file</source>
1463+ <translation type="unfinished"></translation>
1464+ </message>
1465+ <message>
1466+ <source>All files</source>
1467+ <translation type="unfinished"></translation>
1468+ </message>
1469+ <message>
1470+ <source>Key files</source>
1471+ <translation type="unfinished"></translation>
1472+ </message>
1473+ <message>
1474+ <source>Select key file</source>
1475+ <translation type="unfinished"></translation>
1476+ </message>
1477+</context>
1478+<context>
1479+ <name>DatabaseSettingsWidget</name>
1480+ <message>
1481+ <source>Database name:</source>
1482+ <translation type="unfinished"></translation>
1483+ </message>
1484+ <message>
1485+ <source>Database description:</source>
1486+ <translation type="unfinished"></translation>
1487+ </message>
1488+ <message>
1489+ <source>Transform rounds:</source>
1490+ <translation type="unfinished"></translation>
1491+ </message>
1492+ <message>
1493+ <source>Default username:</source>
1494+ <translation type="unfinished"></translation>
1495+ </message>
1496+ <message>
1497+ <source>Use recycle bin:</source>
1498+ <translation type="unfinished"></translation>
1499+ </message>
1500+ <message>
1501+ <source> MiB</source>
1502+ <translation type="unfinished"></translation>
1503+ </message>
1504+ <message>
1505+ <source>Benchmark</source>
1506+ <translation type="unfinished"></translation>
1507+ </message>
1508+ <message>
1509+ <source>Max. history items:</source>
1510+ <translation type="unfinished"></translation>
1511+ </message>
1512+ <message>
1513+ <source>Max. history size:</source>
1514+ <translation type="unfinished"></translation>
1515+ </message>
1516+</context>
1517+<context>
1518+ <name>DatabaseTabWidget</name>
1519+ <message>
1520+ <source>Root</source>
1521+ <translation type="unfinished"></translation>
1522+ </message>
1523+ <message>
1524+ <source>KeePass 2 Database</source>
1525+ <translation type="unfinished"></translation>
1526+ </message>
1527+ <message>
1528+ <source>All files</source>
1529+ <translation type="unfinished"></translation>
1530+ </message>
1531+ <message>
1532+ <source>Open database</source>
1533+ <translation type="unfinished"></translation>
1534+ </message>
1535+ <message>
1536+ <source>Warning</source>
1537+ <translation type="unfinished"></translation>
1538+ </message>
1539+ <message>
1540+ <source>File not found!</source>
1541+ <translation type="unfinished"></translation>
1542+ </message>
1543+ <message>
1544+ <source>Open KeePass 1 database</source>
1545+ <translation type="unfinished"></translation>
1546+ </message>
1547+ <message>
1548+ <source>KeePass 1 database</source>
1549+ <translation type="unfinished"></translation>
1550+ </message>
1551+ <message>
1552+ <source>All files (*)</source>
1553+ <translation type="unfinished"></translation>
1554+ </message>
1555+ <message>
1556+ <source>Close?</source>
1557+ <translation type="unfinished"></translation>
1558+ </message>
1559+ <message>
1560+ <source>&quot;%1&quot; is in edit mode.
1561+Close anyway?</source>
1562+ <translation type="unfinished"></translation>
1563+ </message>
1564+ <message>
1565+ <source>Save changes?</source>
1566+ <translation type="unfinished"></translation>
1567+ </message>
1568+ <message>
1569+ <source>&quot;%1&quot; was modified.
1570+Save changes?</source>
1571+ <translation type="unfinished"></translation>
1572+ </message>
1573+ <message>
1574+ <source>Error</source>
1575+ <translation type="unfinished"></translation>
1576+ </message>
1577+ <message>
1578+ <source>Writing the database failed.</source>
1579+ <translation type="unfinished"></translation>
1580+ </message>
1581+ <message>
1582+ <source>Save database as</source>
1583+ <translation type="unfinished"></translation>
1584+ </message>
1585+ <message>
1586+ <source>New database</source>
1587+ <translation type="unfinished"></translation>
1588+ </message>
1589+ <message>
1590+ <source>locked</source>
1591+ <translation type="unfinished"></translation>
1592+ </message>
1593+</context>
1594+<context>
1595+ <name>DatabaseWidget</name>
1596+ <message>
1597+ <source>Change master key</source>
1598+ <translation type="unfinished"></translation>
1599+ </message>
1600+ <message>
1601+ <source>Delete entry?</source>
1602+ <translation type="unfinished"></translation>
1603+ </message>
1604+ <message>
1605+ <source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
1606+ <translation type="unfinished"></translation>
1607+ </message>
1608+ <message>
1609+ <source>Delete entries?</source>
1610+ <translation type="unfinished"></translation>
1611+ </message>
1612+ <message>
1613+ <source>Do you really want to delete %1 entries for good?</source>
1614+ <translation type="unfinished"></translation>
1615+ </message>
1616+ <message>
1617+ <source>Move entries to recycle bin?</source>
1618+ <translation type="unfinished"></translation>
1619+ </message>
1620+ <message numerus="yes">
1621+ <source>Do you really want to move %n entry(s) to the recycle bin?</source>
1622+ <translation type="unfinished">
1623+ <numerusform></numerusform>
1624+ <numerusform></numerusform>
1625+ </translation>
1626+ </message>
1627+ <message>
1628+ <source>Delete group?</source>
1629+ <translation type="unfinished"></translation>
1630+ </message>
1631+ <message>
1632+ <source>Do you really want to delete the group &quot;%1&quot; for good?</source>
1633+ <translation type="unfinished"></translation>
1634+ </message>
1635+ <message>
1636+ <source>Current group</source>
1637+ <translation type="unfinished"></translation>
1638+ </message>
1639+</context>
1640+<context>
1641+ <name>EditEntryWidget</name>
1642+ <message>
1643+ <source>Entry</source>
1644+ <translation type="unfinished"></translation>
1645+ </message>
1646+ <message>
1647+ <source>Advanced</source>
1648+ <translation type="unfinished"></translation>
1649+ </message>
1650+ <message>
1651+ <source>Icon</source>
1652+ <translation type="unfinished"></translation>
1653+ </message>
1654+ <message>
1655+ <source>Auto-Type</source>
1656+ <translation type="unfinished"></translation>
1657+ </message>
1658+ <message>
1659+ <source>Properties</source>
1660+ <translation type="unfinished"></translation>
1661+ </message>
1662+ <message>
1663+ <source>History</source>
1664+ <translation type="unfinished"></translation>
1665+ </message>
1666+ <message>
1667+ <source>Entry history</source>
1668+ <translation type="unfinished"></translation>
1669+ </message>
1670+ <message>
1671+ <source>Add entry</source>
1672+ <translation type="unfinished"></translation>
1673+ </message>
1674+ <message>
1675+ <source>Edit entry</source>
1676+ <translation type="unfinished"></translation>
1677+ </message>
1678+ <message>
1679+ <source>Error</source>
1680+ <translation type="unfinished"></translation>
1681+ </message>
1682+ <message>
1683+ <source>Different passwords supplied.</source>
1684+ <translation type="unfinished"></translation>
1685+ </message>
1686+ <message>
1687+ <source>New attribute</source>
1688+ <translation type="unfinished"></translation>
1689+ </message>
1690+ <message>
1691+ <source>Select file</source>
1692+ <translation type="unfinished"></translation>
1693+ </message>
1694+ <message>
1695+ <source>Unable to open file</source>
1696+ <translation type="unfinished"></translation>
1697+ </message>
1698+ <message>
1699+ <source>Save attachment</source>
1700+ <translation type="unfinished"></translation>
1701+ </message>
1702+ <message>
1703+ <source>Unable to save the attachment:
1704+</source>
1705+ <translation type="unfinished"></translation>
1706+ </message>
1707+ <message>
1708+ <source>Tomorrow</source>
1709+ <translation type="unfinished"></translation>
1710+ </message>
1711+ <message numerus="yes">
1712+ <source>%n week(s)</source>
1713+ <translation type="unfinished">
1714+ <numerusform></numerusform>
1715+ <numerusform></numerusform>
1716+ </translation>
1717+ </message>
1718+ <message numerus="yes">
1719+ <source>%n month(s)</source>
1720+ <translation type="unfinished">
1721+ <numerusform></numerusform>
1722+ <numerusform></numerusform>
1723+ </translation>
1724+ </message>
1725+ <message>
1726+ <source>1 year</source>
1727+ <translation type="unfinished"></translation>
1728+ </message>
1729+</context>
1730+<context>
1731+ <name>EditEntryWidgetAdvanced</name>
1732+ <message>
1733+ <source>Additional attributes</source>
1734+ <translation type="unfinished"></translation>
1735+ </message>
1736+ <message>
1737+ <source>Add</source>
1738+ <translation type="unfinished"></translation>
1739+ </message>
1740+ <message>
1741+ <source>Edit</source>
1742+ <translation type="unfinished"></translation>
1743+ </message>
1744+ <message>
1745+ <source>Remove</source>
1746+ <translation type="unfinished"></translation>
1747+ </message>
1748+ <message>
1749+ <source>Attachments</source>
1750+ <translation type="unfinished"></translation>
1751+ </message>
1752+ <message>
1753+ <source>Save</source>
1754+ <translation type="unfinished"></translation>
1755+ </message>
1756+</context>
1757+<context>
1758+ <name>EditEntryWidgetAutoType</name>
1759+ <message>
1760+ <source>Enable Auto-Type for this entry</source>
1761+ <translation type="unfinished"></translation>
1762+ </message>
1763+ <message>
1764+ <source>Inherit default Auto-Type sequence from the group</source>
1765+ <translation type="unfinished"></translation>
1766+ </message>
1767+ <message>
1768+ <source>Use custom Auto-Type sequence:</source>
1769+ <translation type="unfinished"></translation>
1770+ </message>
1771+ <message>
1772+ <source>+</source>
1773+ <translation type="unfinished"></translation>
1774+ </message>
1775+ <message>
1776+ <source>-</source>
1777+ <translation type="unfinished"></translation>
1778+ </message>
1779+ <message>
1780+ <source>Window title:</source>
1781+ <translation type="unfinished"></translation>
1782+ </message>
1783+ <message>
1784+ <source>Use default sequence</source>
1785+ <translation type="unfinished"></translation>
1786+ </message>
1787+ <message>
1788+ <source>Set custom sequence:</source>
1789+ <translation type="unfinished"></translation>
1790+ </message>
1791+</context>
1792+<context>
1793+ <name>EditEntryWidgetHistory</name>
1794+ <message>
1795+ <source>Show</source>
1796+ <translation type="unfinished"></translation>
1797+ </message>
1798+ <message>
1799+ <source>Restore</source>
1800+ <translation type="unfinished"></translation>
1801+ </message>
1802+ <message>
1803+ <source>Delete</source>
1804+ <translation type="unfinished"></translation>
1805+ </message>
1806+ <message>
1807+ <source>Delete all</source>
1808+ <translation type="unfinished"></translation>
1809+ </message>
1810+</context>
1811+<context>
1812+ <name>EditEntryWidgetMain</name>
1813+ <message>
1814+ <source>Title:</source>
1815+ <translation type="unfinished"></translation>
1816+ </message>
1817+ <message>
1818+ <source>Username:</source>
1819+ <translation type="unfinished"></translation>
1820+ </message>
1821+ <message>
1822+ <source>Password:</source>
1823+ <translation type="unfinished"></translation>
1824+ </message>
1825+ <message>
1826+ <source>Repeat:</source>
1827+ <translation type="unfinished"></translation>
1828+ </message>
1829+ <message>
1830+ <source>Gen.</source>
1831+ <translation type="unfinished"></translation>
1832+ </message>
1833+ <message>
1834+ <source>URL:</source>
1835+ <translation type="unfinished"></translation>
1836+ </message>
1837+ <message>
1838+ <source>Expires</source>
1839+ <translation type="unfinished"></translation>
1840+ </message>
1841+ <message>
1842+ <source>Presets</source>
1843+ <translation type="unfinished"></translation>
1844+ </message>
1845+ <message>
1846+ <source>Notes:</source>
1847+ <translation type="unfinished"></translation>
1848+ </message>
1849+</context>
1850+<context>
1851+ <name>EditGroupWidget</name>
1852+ <message>
1853+ <source>Group</source>
1854+ <translation type="unfinished"></translation>
1855+ </message>
1856+ <message>
1857+ <source>Icon</source>
1858+ <translation type="unfinished"></translation>
1859+ </message>
1860+ <message>
1861+ <source>Properties</source>
1862+ <translation type="unfinished"></translation>
1863+ </message>
1864+ <message>
1865+ <source>Add group</source>
1866+ <translation type="unfinished"></translation>
1867+ </message>
1868+ <message>
1869+ <source>Edit group</source>
1870+ <translation type="unfinished"></translation>
1871+ </message>
1872+ <message>
1873+ <source>Enable</source>
1874+ <translation type="unfinished"></translation>
1875+ </message>
1876+ <message>
1877+ <source>Disable</source>
1878+ <translation type="unfinished"></translation>
1879+ </message>
1880+ <message>
1881+ <source>Inherit from parent group (%1)</source>
1882+ <translation type="unfinished"></translation>
1883+ </message>
1884+</context>
1885+<context>
1886+ <name>EditGroupWidgetMain</name>
1887+ <message>
1888+ <source>Name</source>
1889+ <translation type="unfinished"></translation>
1890+ </message>
1891+ <message>
1892+ <source>Notes</source>
1893+ <translation type="unfinished"></translation>
1894+ </message>
1895+ <message>
1896+ <source>Expires</source>
1897+ <translation type="unfinished"></translation>
1898+ </message>
1899+ <message>
1900+ <source>Search</source>
1901+ <translation type="unfinished"></translation>
1902+ </message>
1903+ <message>
1904+ <source>Auto-type</source>
1905+ <translation type="unfinished"></translation>
1906+ </message>
1907+</context>
1908+<context>
1909+ <name>EditWidgetIcons</name>
1910+ <message>
1911+ <source>Use default icon</source>
1912+ <translation type="unfinished"></translation>
1913+ </message>
1914+ <message>
1915+ <source>Use custom icon</source>
1916+ <translation type="unfinished"></translation>
1917+ </message>
1918+ <message>
1919+ <source>Add custom icon</source>
1920+ <translation type="unfinished"></translation>
1921+ </message>
1922+ <message>
1923+ <source>Delete custom icon</source>
1924+ <translation type="unfinished"></translation>
1925+ </message>
1926+ <message>
1927+ <source>Images</source>
1928+ <translation type="unfinished"></translation>
1929+ </message>
1930+ <message>
1931+ <source>All files</source>
1932+ <translation type="unfinished"></translation>
1933+ </message>
1934+ <message>
1935+ <source>Select Image</source>
1936+ <translation type="unfinished"></translation>
1937+ </message>
1938+ <message>
1939+ <source>Can&apos;t delete icon!</source>
1940+ <translation type="unfinished"></translation>
1941+ </message>
1942+ <message numerus="yes">
1943+ <source>Can&apos;t delete icon. Still used by %n item(s).</source>
1944+ <translation type="unfinished">
1945+ <numerusform></numerusform>
1946+ <numerusform></numerusform>
1947+ </translation>
1948+ </message>
1949+</context>
1950+<context>
1951+ <name>EditWidgetProperties</name>
1952+ <message>
1953+ <source>Created:</source>
1954+ <translation type="unfinished"></translation>
1955+ </message>
1956+ <message>
1957+ <source>Modified:</source>
1958+ <translation type="unfinished"></translation>
1959+ </message>
1960+ <message>
1961+ <source>Accessed:</source>
1962+ <translation type="unfinished"></translation>
1963+ </message>
1964+ <message>
1965+ <source>Uuid:</source>
1966+ <translation type="unfinished"></translation>
1967+ </message>
1968+</context>
1969+<context>
1970+ <name>EntryAttributesModel</name>
1971+ <message>
1972+ <source>Name</source>
1973+ <translation type="unfinished"></translation>
1974+ </message>
1975+</context>
1976+<context>
1977+ <name>EntryHistoryModel</name>
1978+ <message>
1979+ <source>Last modified</source>
1980+ <translation type="unfinished"></translation>
1981+ </message>
1982+ <message>
1983+ <source>Title</source>
1984+ <translation type="unfinished"></translation>
1985+ </message>
1986+ <message>
1987+ <source>Username</source>
1988+ <translation type="unfinished"></translation>
1989+ </message>
1990+ <message>
1991+ <source>URL</source>
1992+ <translation type="unfinished"></translation>
1993+ </message>
1994+</context>
1995+<context>
1996+ <name>EntryModel</name>
1997+ <message>
1998+ <source>Group</source>
1999+ <translation type="unfinished"></translation>
2000+ </message>
2001+ <message>
2002+ <source>Title</source>
2003+ <translation type="unfinished"></translation>
2004+ </message>
2005+ <message>
2006+ <source>Username</source>
2007+ <translation type="unfinished"></translation>
2008+ </message>
2009+ <message>
2010+ <source>URL</source>
2011+ <translation type="unfinished"></translation>
2012+ </message>
2013+</context>
2014+<context>
2015+ <name>Group</name>
2016+ <message>
2017+ <source>Recycle Bin</source>
2018+ <translation type="unfinished"></translation>
2019+ </message>
2020+</context>
2021+<context>
2022+ <name>KeePass1OpenWidget</name>
2023+ <message>
2024+ <source>Import KeePass1 database</source>
2025+ <translation type="unfinished"></translation>
2026+ </message>
2027+ <message>
2028+ <source>Error</source>
2029+ <translation type="unfinished"></translation>
2030+ </message>
2031+ <message>
2032+ <source>Unable to open the database.</source>
2033+ <translation type="unfinished"></translation>
2034+ </message>
2035+</context>
2036+<context>
2037+ <name>KeePass1Reader</name>
2038+ <message>
2039+ <source>Unable to read keyfile.</source>
2040+ <translation type="unfinished"></translation>
2041+ </message>
2042+ <message>
2043+ <source>Not a KeePass database.</source>
2044+ <translation type="unfinished"></translation>
2045+ </message>
2046+ <message>
2047+ <source>Unsupported encryption algorithm.</source>
2048+ <translation type="unfinished"></translation>
2049+ </message>
2050+ <message>
2051+ <source>Unsupported KeePass database version.</source>
2052+ <translation type="unfinished"></translation>
2053+ </message>
2054+ <message>
2055+ <source>Root</source>
2056+ <translation type="unfinished"></translation>
2057+ </message>
2058+</context>
2059+<context>
2060+ <name>KeePass2Reader</name>
2061+ <message>
2062+ <source>Not a KeePass database.</source>
2063+ <translation type="unfinished"></translation>
2064+ </message>
2065+ <message>
2066+ <source>Unsupported KeePass database version.</source>
2067+ <translation type="unfinished"></translation>
2068+ </message>
2069+ <message>
2070+ <source>Wrong key or database file is corrupt.</source>
2071+ <translation type="unfinished"></translation>
2072+ </message>
2073+</context>
2074+<context>
2075+ <name>Main</name>
2076+ <message>
2077+ <source>Fatal error while testing the cryptographic functions.</source>
2078+ <translation type="unfinished"></translation>
2079+ </message>
2080+ <message>
2081+ <source>KeePassX - Error</source>
2082+ <translation type="unfinished"></translation>
2083+ </message>
2084+</context>
2085+<context>
2086+ <name>MainWindow</name>
2087+ <message>
2088+ <source>Database</source>
2089+ <translation type="unfinished"></translation>
2090+ </message>
2091+ <message>
2092+ <source>Recent databases</source>
2093+ <translation type="unfinished"></translation>
2094+ </message>
2095+ <message>
2096+ <source>Help</source>
2097+ <translation type="unfinished"></translation>
2098+ </message>
2099+ <message>
2100+ <source>Entries</source>
2101+ <translation type="unfinished"></translation>
2102+ </message>
2103+ <message>
2104+ <source>Copy attribute to clipboard</source>
2105+ <translation type="unfinished"></translation>
2106+ </message>
2107+ <message>
2108+ <source>Groups</source>
2109+ <translation type="unfinished"></translation>
2110+ </message>
2111+ <message>
2112+ <source>Extras</source>
2113+ <translation type="unfinished"></translation>
2114+ </message>
2115+ <message>
2116+ <source>View</source>
2117+ <translation type="unfinished"></translation>
2118+ </message>
2119+ <message>
2120+ <source>Quit</source>
2121+ <translation type="unfinished"></translation>
2122+ </message>
2123+ <message>
2124+ <source>About</source>
2125+ <translation type="unfinished"></translation>
2126+ </message>
2127+ <message>
2128+ <source>Open database</source>
2129+ <translation type="unfinished"></translation>
2130+ </message>
2131+ <message>
2132+ <source>Save database</source>
2133+ <translation type="unfinished"></translation>
2134+ </message>
2135+ <message>
2136+ <source>Close database</source>
2137+ <translation type="unfinished"></translation>
2138+ </message>
2139+ <message>
2140+ <source>New database</source>
2141+ <translation type="unfinished"></translation>
2142+ </message>
2143+ <message>
2144+ <source>Add new entry</source>
2145+ <translation type="unfinished"></translation>
2146+ </message>
2147+ <message>
2148+ <source>View/Edit entry</source>
2149+ <translation type="unfinished"></translation>
2150+ </message>
2151+ <message>
2152+ <source>Delete entry</source>
2153+ <translation type="unfinished"></translation>
2154+ </message>
2155+ <message>
2156+ <source>Add new group</source>
2157+ <translation type="unfinished"></translation>
2158+ </message>
2159+ <message>
2160+ <source>Edit group</source>
2161+ <translation type="unfinished"></translation>
2162+ </message>
2163+ <message>
2164+ <source>Delete group</source>
2165+ <translation type="unfinished"></translation>
2166+ </message>
2167+ <message>
2168+ <source>Save database as</source>
2169+ <translation type="unfinished"></translation>
2170+ </message>
2171+ <message>
2172+ <source>Change master key</source>
2173+ <translation type="unfinished"></translation>
2174+ </message>
2175+ <message>
2176+ <source>Database settings</source>
2177+ <translation type="unfinished"></translation>
2178+ </message>
2179+ <message>
2180+ <source>Import KeePass 1 database</source>
2181+ <translation type="unfinished"></translation>
2182+ </message>
2183+ <message>
2184+ <source>Clone entry</source>
2185+ <translation type="unfinished"></translation>
2186+ </message>
2187+ <message>
2188+ <source>Find</source>
2189+ <translation type="unfinished"></translation>
2190+ </message>
2191+ <message>
2192+ <source>Username</source>
2193+ <translation type="unfinished"></translation>
2194+ </message>
2195+ <message>
2196+ <source>Copy username to clipboard</source>
2197+ <translation type="unfinished"></translation>
2198+ </message>
2199+ <message>
2200+ <source>Password</source>
2201+ <translation type="unfinished"></translation>
2202+ </message>
2203+ <message>
2204+ <source>Copy password to clipboard</source>
2205+ <translation type="unfinished"></translation>
2206+ </message>
2207+ <message>
2208+ <source>Settings</source>
2209+ <translation type="unfinished"></translation>
2210+ </message>
2211+ <message>
2212+ <source>Perform Auto-Type</source>
2213+ <translation type="unfinished"></translation>
2214+ </message>
2215+ <message>
2216+ <source>Open URL</source>
2217+ <translation type="unfinished"></translation>
2218+ </message>
2219+ <message>
2220+ <source>Lock databases</source>
2221+ <translation type="unfinished"></translation>
2222+ </message>
2223+ <message>
2224+ <source>Title</source>
2225+ <translation type="unfinished"></translation>
2226+ </message>
2227+ <message>
2228+ <source>URL</source>
2229+ <translation type="unfinished"></translation>
2230+ </message>
2231+ <message>
2232+ <source>Notes</source>
2233+ <translation type="unfinished"></translation>
2234+ </message>
2235+ <message>
2236+ <source>Show toolbar</source>
2237+ <translation type="unfinished"></translation>
2238+ </message>
2239+ <message>
2240+ <source>read-only</source>
2241+ <translation type="unfinished"></translation>
2242+ </message>
2243+ <message>
2244+ <source>Toggle window</source>
2245+ <translation type="unfinished"></translation>
2246+ </message>
2247+</context>
2248+<context>
2249+ <name>PasswordGeneratorWidget</name>
2250+ <message>
2251+ <source>Password:</source>
2252+ <translation type="unfinished"></translation>
2253+ </message>
2254+ <message>
2255+ <source>Length:</source>
2256+ <translation type="unfinished"></translation>
2257+ </message>
2258+ <message>
2259+ <source>Character Types</source>
2260+ <translation type="unfinished"></translation>
2261+ </message>
2262+ <message>
2263+ <source>Upper Case Letters</source>
2264+ <translation type="unfinished"></translation>
2265+ </message>
2266+ <message>
2267+ <source>Lower Case Letters</source>
2268+ <translation type="unfinished"></translation>
2269+ </message>
2270+ <message>
2271+ <source>Numbers</source>
2272+ <translation type="unfinished"></translation>
2273+ </message>
2274+ <message>
2275+ <source>Special Characters</source>
2276+ <translation type="unfinished"></translation>
2277+ </message>
2278+ <message>
2279+ <source>Exclude look-alike characters</source>
2280+ <translation type="unfinished"></translation>
2281+ </message>
2282+ <message>
2283+ <source>Ensure that the password contains characters from every group</source>
2284+ <translation type="unfinished"></translation>
2285+ </message>
2286+ <message>
2287+ <source>Accept</source>
2288+ <translation type="unfinished"></translation>
2289+ </message>
2290+</context>
2291+<context>
2292+ <name>QCommandLineParser</name>
2293+ <message>
2294+ <source>Displays version information.</source>
2295+ <translation type="unfinished"></translation>
2296+ </message>
2297+ <message>
2298+ <source>Displays this help.</source>
2299+ <translation type="unfinished"></translation>
2300+ </message>
2301+ <message>
2302+ <source>Unknown option &apos;%1&apos;.</source>
2303+ <translation type="unfinished"></translation>
2304+ </message>
2305+ <message>
2306+ <source>Unknown options: %1.</source>
2307+ <translation type="unfinished"></translation>
2308+ </message>
2309+ <message>
2310+ <source>Missing value after &apos;%1&apos;.</source>
2311+ <translation type="unfinished"></translation>
2312+ </message>
2313+ <message>
2314+ <source>Unexpected value after &apos;%1&apos;.</source>
2315+ <translation type="unfinished"></translation>
2316+ </message>
2317+ <message>
2318+ <source>[options]</source>
2319+ <translation type="unfinished"></translation>
2320+ </message>
2321+ <message>
2322+ <source>Usage: %1</source>
2323+ <translation type="unfinished"></translation>
2324+ </message>
2325+ <message>
2326+ <source>Options:</source>
2327+ <translation type="unfinished"></translation>
2328+ </message>
2329+ <message>
2330+ <source>Arguments:</source>
2331+ <translation type="unfinished"></translation>
2332+ </message>
2333+</context>
2334+<context>
2335+ <name>QSaveFile</name>
2336+ <message>
2337+ <source>Existing file %1 is not writable</source>
2338+ <translation type="unfinished"></translation>
2339+ </message>
2340+ <message>
2341+ <source>Writing canceled by application</source>
2342+ <translation type="unfinished"></translation>
2343+ </message>
2344+ <message>
2345+ <source>Partial write. Partition full?</source>
2346+ <translation type="unfinished"></translation>
2347+ </message>
2348+</context>
2349+<context>
2350+ <name>QtIOCompressor</name>
2351+ <message>
2352+ <source>Internal zlib error when compressing: </source>
2353+ <translation type="unfinished"></translation>
2354+ </message>
2355+ <message>
2356+ <source>Error writing to underlying device: </source>
2357+ <translation type="unfinished"></translation>
2358+ </message>
2359+ <message>
2360+ <source>Error opening underlying device: </source>
2361+ <translation type="unfinished"></translation>
2362+ </message>
2363+ <message>
2364+ <source>Error reading data from underlying device: </source>
2365+ <translation type="unfinished"></translation>
2366+ </message>
2367+ <message>
2368+ <source>Internal zlib error when decompressing: </source>
2369+ <translation type="unfinished"></translation>
2370+ </message>
2371+</context>
2372+<context>
2373+ <name>QtIOCompressor::open</name>
2374+ <message>
2375+ <source>The gzip format not supported in this version of zlib.</source>
2376+ <translation type="unfinished"></translation>
2377+ </message>
2378+ <message>
2379+ <source>Internal zlib error: </source>
2380+ <translation type="unfinished"></translation>
2381+ </message>
2382+</context>
2383+<context>
2384+ <name>SearchWidget</name>
2385+ <message>
2386+ <source>Find:</source>
2387+ <translation type="unfinished"></translation>
2388+ </message>
2389+ <message>
2390+ <source>Case sensitive</source>
2391+ <translation type="unfinished"></translation>
2392+ </message>
2393+ <message>
2394+ <source>Current group</source>
2395+ <translation type="unfinished"></translation>
2396+ </message>
2397+ <message>
2398+ <source>Root group</source>
2399+ <translation type="unfinished"></translation>
2400+ </message>
2401+</context>
2402+<context>
2403+ <name>SettingsWidget</name>
2404+ <message>
2405+ <source>Application Settings</source>
2406+ <translation type="unfinished"></translation>
2407+ </message>
2408+ <message>
2409+ <source>General</source>
2410+ <translation type="unfinished"></translation>
2411+ </message>
2412+ <message>
2413+ <source>Security</source>
2414+ <translation type="unfinished"></translation>
2415+ </message>
2416+</context>
2417+<context>
2418+ <name>SettingsWidgetGeneral</name>
2419+ <message>
2420+ <source>Remember last databases</source>
2421+ <translation type="unfinished"></translation>
2422+ </message>
2423+ <message>
2424+ <source>Open previous databases on startup</source>
2425+ <translation type="unfinished"></translation>
2426+ </message>
2427+ <message>
2428+ <source>Mark as modified on expanded state changes</source>
2429+ <translation type="unfinished"></translation>
2430+ </message>
2431+ <message>
2432+ <source>Automatically save on exit</source>
2433+ <translation type="unfinished"></translation>
2434+ </message>
2435+ <message>
2436+ <source>Automatically save after every change</source>
2437+ <translation type="unfinished"></translation>
2438+ </message>
2439+ <message>
2440+ <source>Minimize when copying to clipboard</source>
2441+ <translation type="unfinished"></translation>
2442+ </message>
2443+ <message>
2444+ <source>Use group icon on entry creation</source>
2445+ <translation type="unfinished"></translation>
2446+ </message>
2447+ <message>
2448+ <source>Global Auto-Type shortcut</source>
2449+ <translation type="unfinished"></translation>
2450+ </message>
2451+ <message>
2452+ <source>Use entry title to match windows for global auto-type</source>
2453+ <translation type="unfinished"></translation>
2454+ </message>
2455+ <message>
2456+ <source>Language</source>
2457+ <translation type="unfinished"></translation>
2458+ </message>
2459+ <message>
2460+ <source>Show a system tray icon</source>
2461+ <translation type="unfinished"></translation>
2462+ </message>
2463+ <message>
2464+ <source>Hide window to system tray when minimized</source>
2465+ <translation type="unfinished"></translation>
2466+ </message>
2467+</context>
2468+<context>
2469+ <name>SettingsWidgetSecurity</name>
2470+ <message>
2471+ <source>Clear clipboard after</source>
2472+ <translation type="unfinished"></translation>
2473+ </message>
2474+ <message>
2475+ <source> sec</source>
2476+ <translation type="unfinished"></translation>
2477+ </message>
2478+ <message>
2479+ <source>Lock databases after inactivity of</source>
2480+ <translation type="unfinished"></translation>
2481+ </message>
2482+ <message>
2483+ <source>Show passwords in cleartext by default</source>
2484+ <translation type="unfinished"></translation>
2485+ </message>
2486+ <message>
2487+ <source>Always ask before performing auto-type</source>
2488+ <translation type="unfinished"></translation>
2489+ </message>
2490+</context>
2491+<context>
2492+ <name>UnlockDatabaseWidget</name>
2493+ <message>
2494+ <source>Unlock database</source>
2495+ <translation type="unfinished"></translation>
2496+ </message>
2497+ <message>
2498+ <source>Error</source>
2499+ <translation type="unfinished"></translation>
2500+ </message>
2501+ <message>
2502+ <source>Wrong key.</source>
2503+ <translation type="unfinished"></translation>
2504+ </message>
2505+</context>
2506+<context>
2507+ <name>WelcomeWidget</name>
2508+ <message>
2509+ <source>Welcome!</source>
2510+ <translation type="unfinished"></translation>
2511+ </message>
2512+</context>
2513+<context>
2514+ <name>main</name>
2515+ <message>
2516+ <source>KeePassX - cross-platform password manager</source>
2517+ <translation type="unfinished"></translation>
2518+ </message>
2519+ <message>
2520+ <source>filename of the password database to open (*.kdbx)</source>
2521+ <translation type="unfinished"></translation>
2522+ </message>
2523+ <message>
2524+ <source>path to a custom config file</source>
2525+ <translation type="unfinished"></translation>
2526+ </message>
2527+ <message>
2528+ <source>password of the database (DANGEROUS!)</source>
2529+ <translation type="unfinished"></translation>
2530+ </message>
2531+ <message>
2532+ <source>key file of the database</source>
2533+ <translation type="unfinished"></translation>
2534+ </message>
2535+</context>
2536+</TS>
2537diff --git a/share/translations/keepassx_en_plurals.ts b/share/translations/keepassx_en_plurals.ts
2538new file mode 100644
2539index 0000000..006f6f6
2540--- /dev/null
2541+++ b/share/translations/keepassx_en_plurals.ts
2542@@ -0,0 +1,41 @@
2543+<?xml version="1.0" encoding="utf-8"?>
2544+<!DOCTYPE TS>
2545+<TS version="2.0" language="en_US">
2546+<context>
2547+ <name>DatabaseWidget</name>
2548+ <message numerus="yes">
2549+ <source>Do you really want to move %n entry(s) to the recycle bin?</source>
2550+ <translation>
2551+ <numerusform>Do you really want to move %n entry to the recycle bin?</numerusform>
2552+ <numerusform>Do you really want to move %n entries to the recycle bin?</numerusform>
2553+ </translation>
2554+ </message>
2555+</context>
2556+<context>
2557+ <name>EditEntryWidget</name>
2558+ <message numerus="yes">
2559+ <source>%n week(s)</source>
2560+ <translation>
2561+ <numerusform>%n week</numerusform>
2562+ <numerusform>%n weeks</numerusform>
2563+ </translation>
2564+ </message>
2565+ <message numerus="yes">
2566+ <source>%n month(s)</source>
2567+ <translation>
2568+ <numerusform>%n month</numerusform>
2569+ <numerusform>%n months</numerusform>
2570+ </translation>
2571+ </message>
2572+</context>
2573+<context>
2574+ <name>EditWidgetIcons</name>
2575+ <message numerus="yes">
2576+ <source>Can&apos;t delete icon. Still used by %n item(s).</source>
2577+ <translation>
2578+ <numerusform>Can&apos;t delete icon. Still used by %n item.</numerusform>
2579+ <numerusform>Can&apos;t delete icon. Still used by %n items.</numerusform>
2580+ </translation>
2581+ </message>
2582+</context>
2583+</TS>
2584diff --git a/share/translations/keepassx_it.ts b/share/translations/keepassx_it.ts
2585new file mode 100644
2586index 0000000..4f91b75
2587--- /dev/null
2588+++ b/share/translations/keepassx_it.ts
2589@@ -0,0 +1,1179 @@
2590+<?xml version="1.0" ?><!DOCTYPE TS><TS language="it" version="2.0">
2591+<context>
2592+ <name>AboutDialog</name>
2593+ <message>
2594+ <source>About KeePassX</source>
2595+ <translation>A proposito di KeePassX</translation>
2596+ </message>
2597+ <message>
2598+ <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
2599+ <translation>KeePassX è distribuito sotto i termini della licenza
2600+GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</translation>
2601+ </message>
2602+</context>
2603+<context>
2604+ <name>AutoType</name>
2605+ <message>
2606+ <source>Auto-Type - KeePassX</source>
2607+ <translation>Auto-Type - KeePassX</translation>
2608+ </message>
2609+ <message>
2610+ <source>Couldn&apos;t find an entry that matches the window title.</source>
2611+ <translation>Impossibile trovare una voce che corrisponda al titolo della finestra</translation>
2612+ </message>
2613+</context>
2614+<context>
2615+ <name>AutoTypeAssociationsModel</name>
2616+ <message>
2617+ <source>Window</source>
2618+ <translation>Finestra</translation>
2619+ </message>
2620+ <message>
2621+ <source>Sequence</source>
2622+ <translation>Sequenza</translation>
2623+ </message>
2624+ <message>
2625+ <source>Default sequence</source>
2626+ <translation>Sequenza predefinita</translation>
2627+ </message>
2628+</context>
2629+<context>
2630+ <name>AutoTypeSelectDialog</name>
2631+ <message>
2632+ <source>Auto-Type - KeePassX</source>
2633+ <translation>Auto-Type - KeePassX</translation>
2634+ </message>
2635+ <message>
2636+ <source>Select entry to Auto-Type:</source>
2637+ <translation>Selezionare una voce per Auto-Type:</translation>
2638+ </message>
2639+</context>
2640+<context>
2641+ <name>ChangeMasterKeyWidget</name>
2642+ <message>
2643+ <source>Password</source>
2644+ <translation>Password</translation>
2645+ </message>
2646+ <message>
2647+ <source>Enter password:</source>
2648+ <translation>Inserire password:</translation>
2649+ </message>
2650+ <message>
2651+ <source>Repeat password:</source>
2652+ <translation>Ripetere password:</translation>
2653+ </message>
2654+ <message>
2655+ <source>Key file</source>
2656+ <translation>File chiave</translation>
2657+ </message>
2658+ <message>
2659+ <source>Browse</source>
2660+ <translation>Sfogliare</translation>
2661+ </message>
2662+ <message>
2663+ <source>Create</source>
2664+ <translation>Creare</translation>
2665+ </message>
2666+ <message>
2667+ <source>Key files</source>
2668+ <translation>File chiave</translation>
2669+ </message>
2670+ <message>
2671+ <source>All files</source>
2672+ <translation>Tutti i file</translation>
2673+ </message>
2674+ <message>
2675+ <source>Create Key File...</source>
2676+ <translation>Creare file chiave...</translation>
2677+ </message>
2678+ <message>
2679+ <source>Error</source>
2680+ <translation>Errore</translation>
2681+ </message>
2682+ <message>
2683+ <source>Unable to create Key File : </source>
2684+ <translation>Impossibile creare file chiave:</translation>
2685+ </message>
2686+ <message>
2687+ <source>Select a key file</source>
2688+ <translation>Selezionare file chiave</translation>
2689+ </message>
2690+ <message>
2691+ <source>Question</source>
2692+ <translation>Domanda</translation>
2693+ </message>
2694+ <message>
2695+ <source>Do you really want to use an empty string as password?</source>
2696+ <translation>Vuoi veramente usare una stringa vuota come password?</translation>
2697+ </message>
2698+ <message>
2699+ <source>Different passwords supplied.</source>
2700+ <translation>Sono state fornite password differenti.</translation>
2701+ </message>
2702+</context>
2703+<context>
2704+ <name>DatabaseOpenWidget</name>
2705+ <message>
2706+ <source>Enter master key</source>
2707+ <translation>Inserire password</translation>
2708+ </message>
2709+ <message>
2710+ <source>Key File:</source>
2711+ <translation>File Chiave:</translation>
2712+ </message>
2713+ <message>
2714+ <source>Password:</source>
2715+ <translation>Password:</translation>
2716+ </message>
2717+ <message>
2718+ <source>Browse</source>
2719+ <translation>Sfogliare</translation>
2720+ </message>
2721+ <message>
2722+ <source>Error</source>
2723+ <translation>Errore</translation>
2724+ </message>
2725+ <message>
2726+ <source>Unable to open the database.</source>
2727+ <translation>Impossibile aprire il database.</translation>
2728+ </message>
2729+ <message>
2730+ <source>Can&apos;t open key file</source>
2731+ <translation>Impossibile aprire il file chiave</translation>
2732+ </message>
2733+ <message>
2734+ <source>All files</source>
2735+ <translation>Tutti i file</translation>
2736+ </message>
2737+ <message>
2738+ <source>Key files</source>
2739+ <translation>File chiave</translation>
2740+ </message>
2741+ <message>
2742+ <source>Select key file</source>
2743+ <translation>Selezionare file chiave</translation>
2744+ </message>
2745+</context>
2746+<context>
2747+ <name>DatabaseSettingsWidget</name>
2748+ <message>
2749+ <source>Database name:</source>
2750+ <translation>Nome database:</translation>
2751+ </message>
2752+ <message>
2753+ <source>Database description:</source>
2754+ <translation>Descrizione database:</translation>
2755+ </message>
2756+ <message>
2757+ <source>Transform rounds:</source>
2758+ <translation>Round di trasformazione:</translation>
2759+ </message>
2760+ <message>
2761+ <source>Default username:</source>
2762+ <translation>Nome utente predefinito:</translation>
2763+ </message>
2764+ <message>
2765+ <source>Use recycle bin:</source>
2766+ <translation>Utilizzare cestino:</translation>
2767+ </message>
2768+ <message>
2769+ <source> MiB</source>
2770+ <translation>MiB</translation>
2771+ </message>
2772+ <message>
2773+ <source>Benchmark</source>
2774+ <translation>Benchmark</translation>
2775+ </message>
2776+ <message>
2777+ <source>Max. history items:</source>
2778+ <translation>Max. oggetti nella cronologia:</translation>
2779+ </message>
2780+ <message>
2781+ <source>Max. history size:</source>
2782+ <translation>Max. grandezza della cronologia:</translation>
2783+ </message>
2784+</context>
2785+<context>
2786+ <name>DatabaseTabWidget</name>
2787+ <message>
2788+ <source>Root</source>
2789+ <translation>Root</translation>
2790+ </message>
2791+ <message>
2792+ <source>KeePass 2 Database</source>
2793+ <translation>Database KeePass 2</translation>
2794+ </message>
2795+ <message>
2796+ <source>All files</source>
2797+ <translation>Tutti i file</translation>
2798+ </message>
2799+ <message>
2800+ <source>Open database</source>
2801+ <translation>Aprire database</translation>
2802+ </message>
2803+ <message>
2804+ <source>Warning</source>
2805+ <translation>Avviso</translation>
2806+ </message>
2807+ <message>
2808+ <source>File not found!</source>
2809+ <translation>File non trovato!</translation>
2810+ </message>
2811+ <message>
2812+ <source>Open KeePass 1 database</source>
2813+ <translation>Aprire database KeePass 1</translation>
2814+ </message>
2815+ <message>
2816+ <source>KeePass 1 database</source>
2817+ <translation>Database KeePass 1</translation>
2818+ </message>
2819+ <message>
2820+ <source>All files (*)</source>
2821+ <translation>Tutti i file (*)</translation>
2822+ </message>
2823+ <message>
2824+ <source>Close?</source>
2825+ <translation>Chiudere?</translation>
2826+ </message>
2827+ <message>
2828+ <source>&quot;%1&quot; is in edit mode.
2829+Close anyway?</source>
2830+ <translation>&quot;%1&quot; è in modalità modifica.
2831+Chiudere comunque?</translation>
2832+ </message>
2833+ <message>
2834+ <source>Save changes?</source>
2835+ <translation>Salvare modifiche?</translation>
2836+ </message>
2837+ <message>
2838+ <source>&quot;%1&quot; was modified.
2839+Save changes?</source>
2840+ <translation>&quot;%1&quot; è stata modificata.
2841+Salvare le modifiche?</translation>
2842+ </message>
2843+ <message>
2844+ <source>Error</source>
2845+ <translation>Errore</translation>
2846+ </message>
2847+ <message>
2848+ <source>Writing the database failed.</source>
2849+ <translation>Scrittura del database fallita.</translation>
2850+ </message>
2851+ <message>
2852+ <source>Save database as</source>
2853+ <translation>Salvare database come</translation>
2854+ </message>
2855+ <message>
2856+ <source>New database</source>
2857+ <translation>Nuovo database</translation>
2858+ </message>
2859+ <message>
2860+ <source>locked</source>
2861+ <translation>bloccato</translation>
2862+ </message>
2863+</context>
2864+<context>
2865+ <name>DatabaseWidget</name>
2866+ <message>
2867+ <source>Change master key</source>
2868+ <translation>Cambiare password principale</translation>
2869+ </message>
2870+ <message>
2871+ <source>Delete entry?</source>
2872+ <translation>Eliminare voce?</translation>
2873+ </message>
2874+ <message>
2875+ <source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
2876+ <translation>Vuoi veramente eliminare la voce &quot;%1&quot;?</translation>
2877+ </message>
2878+ <message>
2879+ <source>Delete entries?</source>
2880+ <translation>Eliminare voci?</translation>
2881+ </message>
2882+ <message>
2883+ <source>Do you really want to delete %1 entries for good?</source>
2884+ <translation>Vuoi veramente eliminare %1 voci?</translation>
2885+ </message>
2886+ <message>
2887+ <source>Move entries to recycle bin?</source>
2888+ <translation>Muovere le voci nel cestino?</translation>
2889+ </message>
2890+ <message numerus="yes">
2891+ <source>Do you really want to move %n entry(s) to the recycle bin?</source>
2892+ <translation><numerusform>Vuoi veramente spostare %n voce(i) nel cestino?</numerusform><numerusform>Vuoi veramente spostare %n voce(i) nel cestino?</numerusform></translation>
2893+ </message>
2894+ <message>
2895+ <source>Delete group?</source>
2896+ <translation>Eliminare gruppo?</translation>
2897+ </message>
2898+ <message>
2899+ <source>Do you really want to delete the group &quot;%1&quot; for good?</source>
2900+ <translation>Vuoi veramente eliminare il gruppo &quot;%1&quot;?</translation>
2901+ </message>
2902+ <message>
2903+ <source>Current group</source>
2904+ <translation>Gruppo corrente</translation>
2905+ </message>
2906+</context>
2907+<context>
2908+ <name>EditEntryWidget</name>
2909+ <message>
2910+ <source>Entry</source>
2911+ <translation>Voce</translation>
2912+ </message>
2913+ <message>
2914+ <source>Advanced</source>
2915+ <translation>Avanzate</translation>
2916+ </message>
2917+ <message>
2918+ <source>Icon</source>
2919+ <translation>Icona</translation>
2920+ </message>
2921+ <message>
2922+ <source>Auto-Type</source>
2923+ <translation>Auto-Type</translation>
2924+ </message>
2925+ <message>
2926+ <source>Properties</source>
2927+ <translation>Proprietà</translation>
2928+ </message>
2929+ <message>
2930+ <source>History</source>
2931+ <translation>Cronologia</translation>
2932+ </message>
2933+ <message>
2934+ <source>Entry history</source>
2935+ <translation>Cronologia voce</translation>
2936+ </message>
2937+ <message>
2938+ <source>Add entry</source>
2939+ <translation>Aggiungere voce</translation>
2940+ </message>
2941+ <message>
2942+ <source>Edit entry</source>
2943+ <translation>Modificare voce</translation>
2944+ </message>
2945+ <message>
2946+ <source>Error</source>
2947+ <translation>Errore</translation>
2948+ </message>
2949+ <message>
2950+ <source>Different passwords supplied.</source>
2951+ <translation>Sono state immesse password differenti.</translation>
2952+ </message>
2953+ <message>
2954+ <source>New attribute</source>
2955+ <translation>Nuovo attributo</translation>
2956+ </message>
2957+ <message>
2958+ <source>Select file</source>
2959+ <translation>Selezionare file</translation>
2960+ </message>
2961+ <message>
2962+ <source>Unable to open file</source>
2963+ <translation>Impossibile aprire il file</translation>
2964+ </message>
2965+ <message>
2966+ <source>Save attachment</source>
2967+ <translation>Salvare l&apos;allegato</translation>
2968+ </message>
2969+ <message>
2970+ <source>Unable to save the attachment:
2971+</source>
2972+ <translation>Impossibile salvare l&apos;allegato
2973+</translation>
2974+ </message>
2975+ <message>
2976+ <source>Tomorrow</source>
2977+ <translation>Domani</translation>
2978+ </message>
2979+ <message numerus="yes">
2980+ <source>%n week(s)</source>
2981+ <translation><numerusform>%n settimana(e)</numerusform><numerusform>%n settimana(e)</numerusform></translation>
2982+ </message>
2983+ <message numerus="yes">
2984+ <source>%n month(s)</source>
2985+ <translation><numerusform>%n mese(i)</numerusform><numerusform>%n mese(i)</numerusform></translation>
2986+ </message>
2987+ <message>
2988+ <source>1 year</source>
2989+ <translation>1 anno</translation>
2990+ </message>
2991+</context>
2992+<context>
2993+ <name>EditEntryWidgetAdvanced</name>
2994+ <message>
2995+ <source>Additional attributes</source>
2996+ <translation>Attributi addizionali</translation>
2997+ </message>
2998+ <message>
2999+ <source>Add</source>
3000+ <translation>Aggiungere</translation>
3001+ </message>
3002+ <message>
3003+ <source>Edit</source>
3004+ <translation>Modificare</translation>
3005+ </message>
3006+ <message>
3007+ <source>Remove</source>
3008+ <translation>Rimuovere</translation>
3009+ </message>
3010+ <message>
3011+ <source>Attachments</source>
3012+ <translation>Allegati</translation>
3013+ </message>
3014+ <message>
3015+ <source>Save</source>
3016+ <translation>Salvare</translation>
3017+ </message>
3018+</context>
3019+<context>
3020+ <name>EditEntryWidgetAutoType</name>
3021+ <message>
3022+ <source>Enable Auto-Type for this entry</source>
3023+ <translation>Abilitare Auto-Type per questa voce</translation>
3024+ </message>
3025+ <message>
3026+ <source>Inherit default Auto-Type sequence from the group</source>
3027+ <translation>Ereditare la sequenza predefinita di Auto-Type dal gruppo</translation>
3028+ </message>
3029+ <message>
3030+ <source>Use custom Auto-Type sequence:</source>
3031+ <translation>Usare sequenza personalizzata di Auto-Type:</translation>
3032+ </message>
3033+ <message>
3034+ <source>+</source>
3035+ <translation>+</translation>
3036+ </message>
3037+ <message>
3038+ <source>-</source>
3039+ <translation>-</translation>
3040+ </message>
3041+ <message>
3042+ <source>Window title:</source>
3043+ <translation>Titolo finestra:</translation>
3044+ </message>
3045+ <message>
3046+ <source>Use default sequence</source>
3047+ <translation>Usare sequenza predefinita</translation>
3048+ </message>
3049+ <message>
3050+ <source>Set custom sequence:</source>
3051+ <translation>Impostare sequenza personalizzata:</translation>
3052+ </message>
3053+</context>
3054+<context>
3055+ <name>EditEntryWidgetHistory</name>
3056+ <message>
3057+ <source>Show</source>
3058+ <translation>Mostrare</translation>
3059+ </message>
3060+ <message>
3061+ <source>Restore</source>
3062+ <translation>Ripristinare</translation>
3063+ </message>
3064+ <message>
3065+ <source>Delete</source>
3066+ <translation>Eliminare</translation>
3067+ </message>
3068+ <message>
3069+ <source>Delete all</source>
3070+ <translation>Eliminare tutti</translation>
3071+ </message>
3072+</context>
3073+<context>
3074+ <name>EditEntryWidgetMain</name>
3075+ <message>
3076+ <source>Title:</source>
3077+ <translation>Titolo:</translation>
3078+ </message>
3079+ <message>
3080+ <source>Username:</source>
3081+ <translation>Nome utente:</translation>
3082+ </message>
3083+ <message>
3084+ <source>Password:</source>
3085+ <translation>Password:</translation>
3086+ </message>
3087+ <message>
3088+ <source>Repeat:</source>
3089+ <translation>Ripetere:</translation>
3090+ </message>
3091+ <message>
3092+ <source>Gen.</source>
3093+ <translation>Gen.</translation>
3094+ </message>
3095+ <message>
3096+ <source>URL:</source>
3097+ <translation>URL:</translation>
3098+ </message>
3099+ <message>
3100+ <source>Expires</source>
3101+ <translation>Scade:</translation>
3102+ </message>
3103+ <message>
3104+ <source>Presets</source>
3105+ <translation>Programmare</translation>
3106+ </message>
3107+ <message>
3108+ <source>Notes:</source>
3109+ <translation>Note:</translation>
3110+ </message>
3111+</context>
3112+<context>
3113+ <name>EditGroupWidget</name>
3114+ <message>
3115+ <source>Group</source>
3116+ <translation>Gruppo</translation>
3117+ </message>
3118+ <message>
3119+ <source>Icon</source>
3120+ <translation>Icona</translation>
3121+ </message>
3122+ <message>
3123+ <source>Properties</source>
3124+ <translation>Proprietà</translation>
3125+ </message>
3126+ <message>
3127+ <source>Add group</source>
3128+ <translation>Aggiungere gruppo</translation>
3129+ </message>
3130+ <message>
3131+ <source>Edit group</source>
3132+ <translation>Modificare gruppo</translation>
3133+ </message>
3134+ <message>
3135+ <source>Enable</source>
3136+ <translation>Abilitare</translation>
3137+ </message>
3138+ <message>
3139+ <source>Disable</source>
3140+ <translation>Disabilitare</translation>
3141+ </message>
3142+ <message>
3143+ <source>Inherit from parent group (%1)</source>
3144+ <translation>Ereditare dal gruppo genitore (%1)</translation>
3145+ </message>
3146+</context>
3147+<context>
3148+ <name>EditGroupWidgetMain</name>
3149+ <message>
3150+ <source>Name</source>
3151+ <translation>Nome</translation>
3152+ </message>
3153+ <message>
3154+ <source>Notes</source>
3155+ <translation>Note</translation>
3156+ </message>
3157+ <message>
3158+ <source>Expires</source>
3159+ <translation>Scade</translation>
3160+ </message>
3161+ <message>
3162+ <source>Search</source>
3163+ <translation>Cercare</translation>
3164+ </message>
3165+ <message>
3166+ <source>Auto-type</source>
3167+ <translation>Auto-Type</translation>
3168+ </message>
3169+</context>
3170+<context>
3171+ <name>EditWidgetIcons</name>
3172+ <message>
3173+ <source>Use default icon</source>
3174+ <translation>Usare icona predefinita</translation>
3175+ </message>
3176+ <message>
3177+ <source>Use custom icon</source>
3178+ <translation>Usare icona personalizzata</translation>
3179+ </message>
3180+ <message>
3181+ <source>Add custom icon</source>
3182+ <translation>Aggiungere icona personalizzata</translation>
3183+ </message>
3184+ <message>
3185+ <source>Delete custom icon</source>
3186+ <translation>Rimuovere icona personalizzata</translation>
3187+ </message>
3188+ <message>
3189+ <source>Images</source>
3190+ <translation>Immagini</translation>
3191+ </message>
3192+ <message>
3193+ <source>All files</source>
3194+ <translation>Tutti i file</translation>
3195+ </message>
3196+ <message>
3197+ <source>Select Image</source>
3198+ <translation>Selezionare Immagine</translation>
3199+ </message>
3200+ <message>
3201+ <source>Can&apos;t delete icon!</source>
3202+ <translation>Impossibile eliminare icona!</translation>
3203+ </message>
3204+ <message numerus="yes">
3205+ <source>Can&apos;t delete icon. Still used by %n item(s).</source>
3206+ <translation><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voce(i).</numerusform><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voce(i).</numerusform></translation>
3207+ </message>
3208+</context>
3209+<context>
3210+ <name>EditWidgetProperties</name>
3211+ <message>
3212+ <source>Created:</source>
3213+ <translation>Creato:</translation>
3214+ </message>
3215+ <message>
3216+ <source>Modified:</source>
3217+ <translation>Modificato:</translation>
3218+ </message>
3219+ <message>
3220+ <source>Accessed:</source>
3221+ <translation>Accesso:</translation>
3222+ </message>
3223+ <message>
3224+ <source>Uuid:</source>
3225+ <translation>Uuid:</translation>
3226+ </message>
3227+</context>
3228+<context>
3229+ <name>EntryAttributesModel</name>
3230+ <message>
3231+ <source>Name</source>
3232+ <translation>Nome</translation>
3233+ </message>
3234+</context>
3235+<context>
3236+ <name>EntryHistoryModel</name>
3237+ <message>
3238+ <source>Last modified</source>
3239+ <translation>Ultima modifica</translation>
3240+ </message>
3241+ <message>
3242+ <source>Title</source>
3243+ <translation>Titolo</translation>
3244+ </message>
3245+ <message>
3246+ <source>Username</source>
3247+ <translation>Nome utente</translation>
3248+ </message>
3249+ <message>
3250+ <source>URL</source>
3251+ <translation>URL</translation>
3252+ </message>
3253+</context>
3254+<context>
3255+ <name>EntryModel</name>
3256+ <message>
3257+ <source>Group</source>
3258+ <translation>Gruppo</translation>
3259+ </message>
3260+ <message>
3261+ <source>Title</source>
3262+ <translation>Titolo</translation>
3263+ </message>
3264+ <message>
3265+ <source>Username</source>
3266+ <translation>Nome Utente</translation>
3267+ </message>
3268+ <message>
3269+ <source>URL</source>
3270+ <translation>URL</translation>
3271+ </message>
3272+</context>
3273+<context>
3274+ <name>Group</name>
3275+ <message>
3276+ <source>Recycle Bin</source>
3277+ <translation>Cestino (Gruppo)</translation>
3278+ </message>
3279+</context>
3280+<context>
3281+ <name>KeePass1OpenWidget</name>
3282+ <message>
3283+ <source>Import KeePass1 database</source>
3284+ <translation>Importare database KeePass1</translation>
3285+ </message>
3286+ <message>
3287+ <source>Error</source>
3288+ <translation>Errore</translation>
3289+ </message>
3290+ <message>
3291+ <source>Unable to open the database.</source>
3292+ <translation>Impossibile aprire il database.</translation>
3293+ </message>
3294+</context>
3295+<context>
3296+ <name>KeePass1Reader</name>
3297+ <message>
3298+ <source>Unable to read keyfile.</source>
3299+ <translation>Impossibile leggere il file chiave.</translation>
3300+ </message>
3301+ <message>
3302+ <source>Not a KeePass database.</source>
3303+ <translation>Non è un database KeePass.</translation>
3304+ </message>
3305+ <message>
3306+ <source>Unsupported encryption algorithm.</source>
3307+ <translation>Algoritmo di cifratura non supportato.</translation>
3308+ </message>
3309+ <message>
3310+ <source>Unsupported KeePass database version.</source>
3311+ <translation>Versione database non supportata</translation>
3312+ </message>
3313+ <message>
3314+ <source>Root</source>
3315+ <translation>Root (KeePass1Reader)</translation>
3316+ </message>
3317+</context>
3318+<context>
3319+ <name>KeePass2Reader</name>
3320+ <message>
3321+ <source>Not a KeePass database.</source>
3322+ <translation>Non è un database KeePass.</translation>
3323+ </message>
3324+ <message>
3325+ <source>Unsupported KeePass database version.</source>
3326+ <translation>Versione database non supportata</translation>
3327+ </message>
3328+ <message>
3329+ <source>Wrong key or database file is corrupt.</source>
3330+ <translation>Password errata o database corrotto.</translation>
3331+ </message>
3332+</context>
3333+<context>
3334+ <name>MainWindow</name>
3335+ <message>
3336+ <source>Database</source>
3337+ <translation>Database</translation>
3338+ </message>
3339+ <message>
3340+ <source>Recent databases</source>
3341+ <translation>Database recenti</translation>
3342+ </message>
3343+ <message>
3344+ <source>Help</source>
3345+ <translation>Aiuto</translation>
3346+ </message>
3347+ <message>
3348+ <source>Entries</source>
3349+ <translation>Voci</translation>
3350+ </message>
3351+ <message>
3352+ <source>Copy attribute to clipboard</source>
3353+ <translation>Copiare attributi negli appunti</translation>
3354+ </message>
3355+ <message>
3356+ <source>Groups</source>
3357+ <translation>Gruppi</translation>
3358+ </message>
3359+ <message>
3360+ <source>Extras</source>
3361+ <translation>Extra</translation>
3362+ </message>
3363+ <message>
3364+ <source>View</source>
3365+ <translation>Visualizzare</translation>
3366+ </message>
3367+ <message>
3368+ <source>Quit</source>
3369+ <translation>Uscire</translation>
3370+ </message>
3371+ <message>
3372+ <source>About</source>
3373+ <translation>A Proposito</translation>
3374+ </message>
3375+ <message>
3376+ <source>Open database</source>
3377+ <translation>Aprire database</translation>
3378+ </message>
3379+ <message>
3380+ <source>Save database</source>
3381+ <translation>Salvare database</translation>
3382+ </message>
3383+ <message>
3384+ <source>Close database</source>
3385+ <translation>Chiudere database</translation>
3386+ </message>
3387+ <message>
3388+ <source>New database</source>
3389+ <translation>Nuovo database</translation>
3390+ </message>
3391+ <message>
3392+ <source>Add new entry</source>
3393+ <translation>Aggiungere nuova voce</translation>
3394+ </message>
3395+ <message>
3396+ <source>View/Edit entry</source>
3397+ <translation>Visualizzare/Modificare voce</translation>
3398+ </message>
3399+ <message>
3400+ <source>Delete entry</source>
3401+ <translation>Eliminare voce</translation>
3402+ </message>
3403+ <message>
3404+ <source>Add new group</source>
3405+ <translation>Aggiungere nuovo gruppo</translation>
3406+ </message>
3407+ <message>
3408+ <source>Edit group</source>
3409+ <translation>Modificare gruppo</translation>
3410+ </message>
3411+ <message>
3412+ <source>Delete group</source>
3413+ <translation>Eliminare gruppo</translation>
3414+ </message>
3415+ <message>
3416+ <source>Save database as</source>
3417+ <translation>Salvare database come</translation>
3418+ </message>
3419+ <message>
3420+ <source>Change master key</source>
3421+ <translation>Cambiare password principale</translation>
3422+ </message>
3423+ <message>
3424+ <source>Database settings</source>
3425+ <translation>Impostazioni database</translation>
3426+ </message>
3427+ <message>
3428+ <source>Import KeePass 1 database</source>
3429+ <translation>Importare database KeePass 1</translation>
3430+ </message>
3431+ <message>
3432+ <source>Clone entry</source>
3433+ <translation>Clona voce</translation>
3434+ </message>
3435+ <message>
3436+ <source>Find</source>
3437+ <translation>Trovare</translation>
3438+ </message>
3439+ <message>
3440+ <source>Username</source>
3441+ <translation>Nome Utente</translation>
3442+ </message>
3443+ <message>
3444+ <source>Copy username to clipboard</source>
3445+ <translation>Copiare nome utente negli appunti</translation>
3446+ </message>
3447+ <message>
3448+ <source>Password</source>
3449+ <translation>Password</translation>
3450+ </message>
3451+ <message>
3452+ <source>Copy password to clipboard</source>
3453+ <translation>Copiare password negli appunti</translation>
3454+ </message>
3455+ <message>
3456+ <source>Settings</source>
3457+ <translation>Impostazioni</translation>
3458+ </message>
3459+ <message>
3460+ <source>Perform Auto-Type</source>
3461+ <translation>Eseguire Auto-Type</translation>
3462+ </message>
3463+ <message>
3464+ <source>Open URL</source>
3465+ <translation>Aprire URL</translation>
3466+ </message>
3467+ <message>
3468+ <source>Lock databases</source>
3469+ <translation>Bloccare database</translation>
3470+ </message>
3471+ <message>
3472+ <source>Title</source>
3473+ <translation>Titolo</translation>
3474+ </message>
3475+ <message>
3476+ <source>URL</source>
3477+ <translation>URL</translation>
3478+ </message>
3479+ <message>
3480+ <source>Notes</source>
3481+ <translation>Note</translation>
3482+ </message>
3483+ <message>
3484+ <source>Show toolbar</source>
3485+ <translation>Mostrare barra degli strumenti</translation>
3486+ </message>
3487+ <message>
3488+ <source>read-only</source>
3489+ <translation>sola lettura</translation>
3490+ </message>
3491+</context>
3492+<context>
3493+ <name>PasswordGeneratorWidget</name>
3494+ <message>
3495+ <source>Password:</source>
3496+ <translation>Password:</translation>
3497+ </message>
3498+ <message>
3499+ <source>Length:</source>
3500+ <translation>Lunghezza:</translation>
3501+ </message>
3502+ <message>
3503+ <source>Character Types</source>
3504+ <translation>Tipi di carattere</translation>
3505+ </message>
3506+ <message>
3507+ <source>Upper Case Letters</source>
3508+ <translation>Lettere maiuscole</translation>
3509+ </message>
3510+ <message>
3511+ <source>Lower Case Letters</source>
3512+ <translation>Lettere minuscole</translation>
3513+ </message>
3514+ <message>
3515+ <source>Numbers</source>
3516+ <translation>Numeri</translation>
3517+ </message>
3518+ <message>
3519+ <source>Special Characters</source>
3520+ <translation>Caratteri speciali</translation>
3521+ </message>
3522+ <message>
3523+ <source>Exclude look-alike characters</source>
3524+ <translation>Escludere caratteri simili</translation>
3525+ </message>
3526+ <message>
3527+ <source>Ensure that the password contains characters from every group</source>
3528+ <translation>Assicurare che la password contenga caratteri di ogni gruppo</translation>
3529+ </message>
3530+ <message>
3531+ <source>Accept</source>
3532+ <translation>Accettare</translation>
3533+ </message>
3534+</context>
3535+<context>
3536+ <name>QCommandLineParser</name>
3537+ <message>
3538+ <source>Displays version information.</source>
3539+ <translation>Mostrare informazioni sulla versione.</translation>
3540+ </message>
3541+ <message>
3542+ <source>Displays this help.</source>
3543+ <translation>Mostrare questo aiuto.</translation>
3544+ </message>
3545+ <message>
3546+ <source>Unknown option &apos;%1&apos;.</source>
3547+ <translation>Opzione sconosciuta &apos;%1&apos;.</translation>
3548+ </message>
3549+ <message>
3550+ <source>Unknown options: %1.</source>
3551+ <translation>Opzioni sconosciute &apos;%1&apos;.</translation>
3552+ </message>
3553+ <message>
3554+ <source>Missing value after &apos;%1&apos;.</source>
3555+ <translation>Manca valore dopo &apos;%1&apos;.</translation>
3556+ </message>
3557+ <message>
3558+ <source>Unexpected value after &apos;%1&apos;.</source>
3559+ <translation>Valore inaspettato dopo &apos;%1&apos;.</translation>
3560+ </message>
3561+ <message>
3562+ <source>[options]</source>
3563+ <translation>[opzioni]</translation>
3564+ </message>
3565+ <message>
3566+ <source>Usage: %1</source>
3567+ <translation>Uso: %1</translation>
3568+ </message>
3569+ <message>
3570+ <source>Options:</source>
3571+ <translation>Opzioni:</translation>
3572+ </message>
3573+ <message>
3574+ <source>Arguments:</source>
3575+ <translation>Argomenti:</translation>
3576+ </message>
3577+</context>
3578+<context>
3579+ <name>QSaveFile</name>
3580+ <message>
3581+ <source>Existing file %1 is not writable</source>
3582+ <translation>Il file esistente %1 non è scrivibile</translation>
3583+ </message>
3584+ <message>
3585+ <source>Writing canceled by application</source>
3586+ <translation>Scrittura cancellata dall&apos;applicazione</translation>
3587+ </message>
3588+ <message>
3589+ <source>Partial write. Partition full?</source>
3590+ <translation>Scrittura parziale. Partizione piena?</translation>
3591+ </message>
3592+</context>
3593+<context>
3594+ <name>QtIOCompressor</name>
3595+ <message>
3596+ <source>Internal zlib error when compressing: </source>
3597+ <translation>Errore interno di zlib durante la compressione:</translation>
3598+ </message>
3599+ <message>
3600+ <source>Error writing to underlying device: </source>
3601+ <translation>Errore durante la scrittura nel dispositivo:</translation>
3602+ </message>
3603+ <message>
3604+ <source>Error opening underlying device: </source>
3605+ <translation>Errore durante l&apos;apertura dal dispositivo:</translation>
3606+ </message>
3607+ <message>
3608+ <source>Error reading data from underlying device: </source>
3609+ <translation>Errore durante la lettura dal dispositivo:</translation>
3610+ </message>
3611+ <message>
3612+ <source>Internal zlib error when decompressing: </source>
3613+ <translation>Errore interno di zlib durante la decompressione:</translation>
3614+ </message>
3615+</context>
3616+<context>
3617+ <name>QtIOCompressor::open</name>
3618+ <message>
3619+ <source>The gzip format not supported in this version of zlib.</source>
3620+ <translation>Formato gzip non supportato da questa versione di zlib.</translation>
3621+ </message>
3622+ <message>
3623+ <source>Internal zlib error: </source>
3624+ <translation>Errore interno di zlib:</translation>
3625+ </message>
3626+</context>
3627+<context>
3628+ <name>SearchWidget</name>
3629+ <message>
3630+ <source>Find:</source>
3631+ <translation>Trovare:</translation>
3632+ </message>
3633+ <message>
3634+ <source>Case sensitive</source>
3635+ <translation>Case sensitive</translation>
3636+ </message>
3637+ <message>
3638+ <source>Current group</source>
3639+ <translation>Gruppo corrente</translation>
3640+ </message>
3641+ <message>
3642+ <source>Root group</source>
3643+ <translation>Gruppo radice</translation>
3644+ </message>
3645+</context>
3646+<context>
3647+ <name>SettingsWidget</name>
3648+ <message>
3649+ <source>Application Settings</source>
3650+ <translation>Impostazioni applicazione</translation>
3651+ </message>
3652+ <message>
3653+ <source>General</source>
3654+ <translation>Generale</translation>
3655+ </message>
3656+ <message>
3657+ <source>Security</source>
3658+ <translation>Sicurezza</translation>
3659+ </message>
3660+</context>
3661+<context>
3662+ <name>SettingsWidgetGeneral</name>
3663+ <message>
3664+ <source>Remember last databases</source>
3665+ <translation>Ricordare ultimo database</translation>
3666+ </message>
3667+ <message>
3668+ <source>Open previous databases on startup</source>
3669+ <translation>Aprire precedente database all&apos;avvio</translation>
3670+ </message>
3671+ <message>
3672+ <source>Mark as modified on expanded state changes</source>
3673+ <translation>Marcare come modificata quando la voce viene espansa</translation>
3674+ </message>
3675+ <message>
3676+ <source>Automatically save on exit</source>
3677+ <translation>Salvare automaticamente all&apos;uscita</translation>
3678+ </message>
3679+ <message>
3680+ <source>Automatically save after every change</source>
3681+ <translation>Salvare automaticamente dopo ogni modifica</translation>
3682+ </message>
3683+ <message>
3684+ <source>Minimize when copying to clipboard</source>
3685+ <translation>Minimizzare quando si copia negli appunti</translation>
3686+ </message>
3687+ <message>
3688+ <source>Use group icon on entry creation</source>
3689+ <translation>Usare l&apos;icona del gruppo alla creazione di una voce</translation>
3690+ </message>
3691+ <message>
3692+ <source>Global Auto-Type shortcut</source>
3693+ <translation>Scorciatoia Auto-Type globale</translation>
3694+ </message>
3695+ <message>
3696+ <source>Use entry title to match windows for global auto-type</source>
3697+ <translation>Utilizzare il titolo della voce per abbinare la finestra per auto-type globale</translation>
3698+ </message>
3699+</context>
3700+<context>
3701+ <name>SettingsWidgetSecurity</name>
3702+ <message>
3703+ <source>Clear clipboard after</source>
3704+ <translation>Pulire appunti dopo</translation>
3705+ </message>
3706+ <message>
3707+ <source> sec</source>
3708+ <translation>sec</translation>
3709+ </message>
3710+ <message>
3711+ <source>Lock databases after inactivity of</source>
3712+ <translation>Bloccare database dopo un&apos;inattività di</translation>
3713+ </message>
3714+ <message>
3715+ <source>Show passwords in cleartext by default</source>
3716+ <translation>Mostrare la password in chiaro in maniera predefinita</translation>
3717+ </message>
3718+ <message>
3719+ <source>Always ask before performing auto-type</source>
3720+ <translation>Chiedere sempre prima di eseguire auto-type</translation>
3721+ </message>
3722+</context>
3723+<context>
3724+ <name>UnlockDatabaseWidget</name>
3725+ <message>
3726+ <source>Unlock database</source>
3727+ <translation>Sbloccare database</translation>
3728+ </message>
3729+ <message>
3730+ <source>Error</source>
3731+ <translation>Errore</translation>
3732+ </message>
3733+ <message>
3734+ <source>Wrong key.</source>
3735+ <translation>Password errata.</translation>
3736+ </message>
3737+</context>
3738+<context>
3739+ <name>WelcomeWidget</name>
3740+ <message>
3741+ <source>Welcome!</source>
3742+ <translation>Benvenuto/a!</translation>
3743+ </message>
3744+</context>
3745+<context>
3746+ <name>main</name>
3747+ <message>
3748+ <source>KeePassX - cross-platform password manager</source>
3749+ <translation>KeePassX - gestore di password cross-platform</translation>
3750+ </message>
3751+ <message>
3752+ <source>filename of the password database to open (*.kdbx)</source>
3753+ <translation>nome del file del database da aprire (*.kdbx)</translation>
3754+ </message>
3755+ <message>
3756+ <source>path to a custom config file</source>
3757+ <translation>percorso ad un file di configurazione personalizzato</translation>
3758+ </message>
3759+ <message>
3760+ <source>password of the database (DANGEROUS!)</source>
3761+ <translation>password del database (PERICOLOSO!)</translation>
3762+ </message>
3763+ <message>
3764+ <source>key file of the database</source>
3765+ <translation>file chiave del database</translation>
3766+ </message>
3767+</context>
3768+</TS>
3769\ No newline at end of file
3770diff --git a/share/translations/keepassx_nl_NL.ts b/share/translations/keepassx_nl_NL.ts
3771new file mode 100644
3772index 0000000..aa6320e
3773--- /dev/null
3774+++ b/share/translations/keepassx_nl_NL.ts
3775@@ -0,0 +1,1178 @@
3776+<?xml version="1.0" ?><!DOCTYPE TS><TS language="nl_NL" version="2.0">
3777+<context>
3778+ <name>AboutDialog</name>
3779+ <message>
3780+ <source>About KeePassX</source>
3781+ <translation>Over KeePassX</translation>
3782+ </message>
3783+ <message>
3784+ <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
3785+ <translation>KeePassX wordt verspreid onder de bepalingen van de GNU General Public License (GPL) versie 2 of (als u wenst) versie 3.</translation>
3786+ </message>
3787+</context>
3788+<context>
3789+ <name>AutoType</name>
3790+ <message>
3791+ <source>Auto-Type - KeePassX</source>
3792+ <translation>Auto-typen - KeePassX</translation>
3793+ </message>
3794+ <message>
3795+ <source>Couldn&apos;t find an entry that matches the window title.</source>
3796+ <translation>Kon geen element vinden dat overeenkomt met de venstertitel.</translation>
3797+ </message>
3798+</context>
3799+<context>
3800+ <name>AutoTypeAssociationsModel</name>
3801+ <message>
3802+ <source>Window</source>
3803+ <translation>Venster</translation>
3804+ </message>
3805+ <message>
3806+ <source>Sequence</source>
3807+ <translation>Volgorde</translation>
3808+ </message>
3809+ <message>
3810+ <source>Default sequence</source>
3811+ <translation>Standaardvolgorde</translation>
3812+ </message>
3813+</context>
3814+<context>
3815+ <name>AutoTypeSelectDialog</name>
3816+ <message>
3817+ <source>Auto-Type - KeePassX</source>
3818+ <translation>Auto-typen - KeePassX</translation>
3819+ </message>
3820+ <message>
3821+ <source>Select entry to Auto-Type:</source>
3822+ <translation>Kies element om automatisch te typen:</translation>
3823+ </message>
3824+</context>
3825+<context>
3826+ <name>ChangeMasterKeyWidget</name>
3827+ <message>
3828+ <source>Password</source>
3829+ <translation>Wachtwoord</translation>
3830+ </message>
3831+ <message>
3832+ <source>Enter password:</source>
3833+ <translation>Geef wachtwoord:</translation>
3834+ </message>
3835+ <message>
3836+ <source>Repeat password:</source>
3837+ <translation>Herhaal wachtwoord:</translation>
3838+ </message>
3839+ <message>
3840+ <source>Key file</source>
3841+ <translation>Sleutelbestand</translation>
3842+ </message>
3843+ <message>
3844+ <source>Browse</source>
3845+ <translation>Bladeren</translation>
3846+ </message>
3847+ <message>
3848+ <source>Create</source>
3849+ <translation>Aanmaken</translation>
3850+ </message>
3851+ <message>
3852+ <source>Key files</source>
3853+ <translation>Sleutelbestanden</translation>
3854+ </message>
3855+ <message>
3856+ <source>All files</source>
3857+ <translation>Alle bestanden</translation>
3858+ </message>
3859+ <message>
3860+ <source>Create Key File...</source>
3861+ <translation>Genereer sleutelbestand...</translation>
3862+ </message>
3863+ <message>
3864+ <source>Error</source>
3865+ <translation>Fout</translation>
3866+ </message>
3867+ <message>
3868+ <source>Unable to create Key File : </source>
3869+ <translation>Niet mogelijk om sleutelbestand aan te maken:</translation>
3870+ </message>
3871+ <message>
3872+ <source>Select a key file</source>
3873+ <translation>Kies een sleutelbestand</translation>
3874+ </message>
3875+ <message>
3876+ <source>Question</source>
3877+ <translation>Vraag</translation>
3878+ </message>
3879+ <message>
3880+ <source>Do you really want to use an empty string as password?</source>
3881+ <translation>Weet u zeker dat u een leeg veld als wachtwoord wilt gebruiken?</translation>
3882+ </message>
3883+ <message>
3884+ <source>Different passwords supplied.</source>
3885+ <translation>Verschillende wachtwoorden opgegeven.</translation>
3886+ </message>
3887+</context>
3888+<context>
3889+ <name>DatabaseOpenWidget</name>
3890+ <message>
3891+ <source>Enter master key</source>
3892+ <translation>Geef hoofdsleutel</translation>
3893+ </message>
3894+ <message>
3895+ <source>Key File:</source>
3896+ <translation>Sleutelbestand:</translation>
3897+ </message>
3898+ <message>
3899+ <source>Password:</source>
3900+ <translation>Wachtwoord:</translation>
3901+ </message>
3902+ <message>
3903+ <source>Browse</source>
3904+ <translation>Bladeren</translation>
3905+ </message>
3906+ <message>
3907+ <source>Error</source>
3908+ <translation>Fout</translation>
3909+ </message>
3910+ <message>
3911+ <source>Unable to open the database.</source>
3912+ <translation>Niet mogelijk om de database te openen.</translation>
3913+ </message>
3914+ <message>
3915+ <source>Can&apos;t open key file</source>
3916+ <translation>Niet mogelijk om het sleutelbestand te openen</translation>
3917+ </message>
3918+ <message>
3919+ <source>All files</source>
3920+ <translation>Alle bestanden</translation>
3921+ </message>
3922+ <message>
3923+ <source>Key files</source>
3924+ <translation>Sleutelbestanden</translation>
3925+ </message>
3926+ <message>
3927+ <source>Select key file</source>
3928+ <translation>Kies sleutelbestand</translation>
3929+ </message>
3930+</context>
3931+<context>
3932+ <name>DatabaseSettingsWidget</name>
3933+ <message>
3934+ <source>Database name:</source>
3935+ <translation>Naam van de database:</translation>
3936+ </message>
3937+ <message>
3938+ <source>Database description:</source>
3939+ <translation>Beschrijving van de database:</translation>
3940+ </message>
3941+ <message>
3942+ <source>Transform rounds:</source>
3943+ <translation>Transformatierondes:</translation>
3944+ </message>
3945+ <message>
3946+ <source>Default username:</source>
3947+ <translation>Standaard gebruikersnaam:</translation>
3948+ </message>
3949+ <message>
3950+ <source>Use recycle bin:</source>
3951+ <translation>Gebruik prullenbak:</translation>
3952+ </message>
3953+ <message>
3954+ <source> MiB</source>
3955+ <translation>MiB</translation>
3956+ </message>
3957+ <message>
3958+ <source>Benchmark</source>
3959+ <translation>Test</translation>
3960+ </message>
3961+ <message>
3962+ <source>Max. history items:</source>
3963+ <translation>Max. items in geschiedenis:</translation>
3964+ </message>
3965+ <message>
3966+ <source>Max. history size:</source>
3967+ <translation>Max. grootte geschiedenis:</translation>
3968+ </message>
3969+</context>
3970+<context>
3971+ <name>DatabaseTabWidget</name>
3972+ <message>
3973+ <source>Root</source>
3974+ <translation>Alles</translation>
3975+ </message>
3976+ <message>
3977+ <source>KeePass 2 Database</source>
3978+ <translation>KeePass 2 Database</translation>
3979+ </message>
3980+ <message>
3981+ <source>All files</source>
3982+ <translation>Alle bestanden</translation>
3983+ </message>
3984+ <message>
3985+ <source>Open database</source>
3986+ <translation>Open database</translation>
3987+ </message>
3988+ <message>
3989+ <source>Warning</source>
3990+ <translation>Waarschuwing</translation>
3991+ </message>
3992+ <message>
3993+ <source>File not found!</source>
3994+ <translation>Bestand niet gevonden!</translation>
3995+ </message>
3996+ <message>
3997+ <source>Open KeePass 1 database</source>
3998+ <translation>Open KeePass 1 database</translation>
3999+ </message>
4000+ <message>
4001+ <source>KeePass 1 database</source>
4002+ <translation>KeePass 1 database</translation>
4003+ </message>
4004+ <message>
4005+ <source>All files (*)</source>
4006+ <translation>Alle bestanden (*)</translation>
4007+ </message>
4008+ <message>
4009+ <source>Close?</source>
4010+ <translation>Sluiten?</translation>
4011+ </message>
4012+ <message>
4013+ <source>&quot;%1&quot; is in edit mode.
4014+Close anyway?</source>
4015+ <translation>&quot;%1&quot; is in bewerkmodus.
4016+Toch sluiten?</translation>
4017+ </message>
4018+ <message>
4019+ <source>Save changes?</source>
4020+ <translation>Wijzigingen opslaan?</translation>
4021+ </message>
4022+ <message>
4023+ <source>&quot;%1&quot; was modified.
4024+Save changes?</source>
4025+ <translation>&quot;%1&quot; is gewijzigd.
4026+Opslaan?</translation>
4027+ </message>
4028+ <message>
4029+ <source>Error</source>
4030+ <translation>Fout</translation>
4031+ </message>
4032+ <message>
4033+ <source>Writing the database failed.</source>
4034+ <translation>Opslaan van de database is mislukt.</translation>
4035+ </message>
4036+ <message>
4037+ <source>Save database as</source>
4038+ <translation>Database opslaan als</translation>
4039+ </message>
4040+ <message>
4041+ <source>New database</source>
4042+ <translation>Nieuwe database</translation>
4043+ </message>
4044+ <message>
4045+ <source>locked</source>
4046+ <translation>vergrendeld</translation>
4047+ </message>
4048+</context>
4049+<context>
4050+ <name>DatabaseWidget</name>
4051+ <message>
4052+ <source>Change master key</source>
4053+ <translation>Wijzig hoofdsleutel</translation>
4054+ </message>
4055+ <message>
4056+ <source>Delete entry?</source>
4057+ <translation>Element verwijderen?</translation>
4058+ </message>
4059+ <message>
4060+ <source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
4061+ <translation>Weet u zeker dat u het element &quot;%1&quot; wilt verwijderen?</translation>
4062+ </message>
4063+ <message>
4064+ <source>Delete entries?</source>
4065+ <translation>Elementen wissen?</translation>
4066+ </message>
4067+ <message>
4068+ <source>Do you really want to delete %1 entries for good?</source>
4069+ <translation>Weet u zeker dat u %1 elementen wilt wissen?</translation>
4070+ </message>
4071+ <message>
4072+ <source>Move entries to recycle bin?</source>
4073+ <translation>Elementen naar de prullenbak verplaatsen?</translation>
4074+ </message>
4075+ <message numerus="yes">
4076+ <source>Do you really want to move %n entry(s) to the recycle bin?</source>
4077+ <translation><numerusform>Weet u zeker dat u %n element naar de prullenbak wilt verplaatsen?</numerusform><numerusform>Weet u zeker dat u %n elementen naar de prullenbak wilt verplaatsen?</numerusform></translation>
4078+ </message>
4079+ <message>
4080+ <source>Delete group?</source>
4081+ <translation>Groep verwijderen?</translation>
4082+ </message>
4083+ <message>
4084+ <source>Do you really want to delete the group &quot;%1&quot; for good?</source>
4085+ <translation>Weet u zeker dat u de groep &quot;%1&quot; wilt verwijderen?</translation>
4086+ </message>
4087+ <message>
4088+ <source>Current group</source>
4089+ <translation>Huidige groep</translation>
4090+ </message>
4091+</context>
4092+<context>
4093+ <name>EditEntryWidget</name>
4094+ <message>
4095+ <source>Entry</source>
4096+ <translation>Element</translation>
4097+ </message>
4098+ <message>
4099+ <source>Advanced</source>
4100+ <translation>Geavanceerd</translation>
4101+ </message>
4102+ <message>
4103+ <source>Icon</source>
4104+ <translation>Icoon</translation>
4105+ </message>
4106+ <message>
4107+ <source>Auto-Type</source>
4108+ <translation>Auto-typen - KeePassX</translation>
4109+ </message>
4110+ <message>
4111+ <source>Properties</source>
4112+ <translation>Eigenschappen</translation>
4113+ </message>
4114+ <message>
4115+ <source>History</source>
4116+ <translation>Geschiedenis</translation>
4117+ </message>
4118+ <message>
4119+ <source>Entry history</source>
4120+ <translation>Geschiedenis van element</translation>
4121+ </message>
4122+ <message>
4123+ <source>Add entry</source>
4124+ <translation>Element toevoegen</translation>
4125+ </message>
4126+ <message>
4127+ <source>Edit entry</source>
4128+ <translation>Element wijzigen</translation>
4129+ </message>
4130+ <message>
4131+ <source>Error</source>
4132+ <translation>Fout</translation>
4133+ </message>
4134+ <message>
4135+ <source>Different passwords supplied.</source>
4136+ <translation>Verschillende wachtwoorden opgegeven.</translation>
4137+ </message>
4138+ <message>
4139+ <source>New attribute</source>
4140+ <translation>Nieuwe eigenschap</translation>
4141+ </message>
4142+ <message>
4143+ <source>Select file</source>
4144+ <translation>Kies bestand</translation>
4145+ </message>
4146+ <message>
4147+ <source>Unable to open file</source>
4148+ <translation>Niet mogelijk om bestand te openen</translation>
4149+ </message>
4150+ <message>
4151+ <source>Save attachment</source>
4152+ <translation>Bijlage opslaan</translation>
4153+ </message>
4154+ <message>
4155+ <source>Unable to save the attachment:
4156+</source>
4157+ <translation>Niet mogelijk om de bijlage op te slaan:
4158+</translation>
4159+ </message>
4160+ <message>
4161+ <source>Tomorrow</source>
4162+ <translation>Morgen</translation>
4163+ </message>
4164+ <message numerus="yes">
4165+ <source>%n week(s)</source>
4166+ <translation><numerusform>%n week</numerusform><numerusform>%n weken</numerusform></translation>
4167+ </message>
4168+ <message numerus="yes">
4169+ <source>%n month(s)</source>
4170+ <translation><numerusform>%n maand</numerusform><numerusform>%n maanden</numerusform></translation>
4171+ </message>
4172+ <message>
4173+ <source>1 year</source>
4174+ <translation>1 jaar</translation>
4175+ </message>
4176+</context>
4177+<context>
4178+ <name>EditEntryWidgetAdvanced</name>
4179+ <message>
4180+ <source>Additional attributes</source>
4181+ <translation>Extra eigenschappen</translation>
4182+ </message>
4183+ <message>
4184+ <source>Add</source>
4185+ <translation>Toevoegen</translation>
4186+ </message>
4187+ <message>
4188+ <source>Edit</source>
4189+ <translation>Wijzigen</translation>
4190+ </message>
4191+ <message>
4192+ <source>Remove</source>
4193+ <translation>Verwijderen</translation>
4194+ </message>
4195+ <message>
4196+ <source>Attachments</source>
4197+ <translation>Bijlagen</translation>
4198+ </message>
4199+ <message>
4200+ <source>Save</source>
4201+ <translation>Opslaan</translation>
4202+ </message>
4203+</context>
4204+<context>
4205+ <name>EditEntryWidgetAutoType</name>
4206+ <message>
4207+ <source>Enable Auto-Type for this entry</source>
4208+ <translation>Auto-typen inschakelen voor dit element</translation>
4209+ </message>
4210+ <message>
4211+ <source>Inherit default Auto-Type sequence from the group</source>
4212+ <translation>Erf standaard auto-typevolgorde van de groep</translation>
4213+ </message>
4214+ <message>
4215+ <source>Use custom Auto-Type sequence:</source>
4216+ <translation>Gebruik aangepaste auto-typevolgorde:</translation>
4217+ </message>
4218+ <message>
4219+ <source>+</source>
4220+ <translation>+</translation>
4221+ </message>
4222+ <message>
4223+ <source>-</source>
4224+ <translation>-</translation>
4225+ </message>
4226+ <message>
4227+ <source>Window title:</source>
4228+ <translation>Venstertitel:</translation>
4229+ </message>
4230+ <message>
4231+ <source>Use default sequence</source>
4232+ <translation>Gebruik standaardvolgorde</translation>
4233+ </message>
4234+ <message>
4235+ <source>Set custom sequence:</source>
4236+ <translation>Aangepaste volgorde:</translation>
4237+ </message>
4238+</context>
4239+<context>
4240+ <name>EditEntryWidgetHistory</name>
4241+ <message>
4242+ <source>Show</source>
4243+ <translation>Tonen</translation>
4244+ </message>
4245+ <message>
4246+ <source>Restore</source>
4247+ <translation>Herstellen</translation>
4248+ </message>
4249+ <message>
4250+ <source>Delete</source>
4251+ <translation>Verwijderen</translation>
4252+ </message>
4253+ <message>
4254+ <source>Delete all</source>
4255+ <translation>Alles verwijderen</translation>
4256+ </message>
4257+</context>
4258+<context>
4259+ <name>EditEntryWidgetMain</name>
4260+ <message>
4261+ <source>Title:</source>
4262+ <translation>Titel:</translation>
4263+ </message>
4264+ <message>
4265+ <source>Username:</source>
4266+ <translation>Gebruikersnaam:</translation>
4267+ </message>
4268+ <message>
4269+ <source>Password:</source>
4270+ <translation>Wachtwoord:</translation>
4271+ </message>
4272+ <message>
4273+ <source>Repeat:</source>
4274+ <translation>Herhalen:</translation>
4275+ </message>
4276+ <message>
4277+ <source>Gen.</source>
4278+ <translation>Gen.</translation>
4279+ </message>
4280+ <message>
4281+ <source>URL:</source>
4282+ <translation>URL:</translation>
4283+ </message>
4284+ <message>
4285+ <source>Expires</source>
4286+ <translation>Verloopt</translation>
4287+ </message>
4288+ <message>
4289+ <source>Presets</source>
4290+ <translation>Ingebouwd</translation>
4291+ </message>
4292+ <message>
4293+ <source>Notes:</source>
4294+ <translation>Opmerkingen:</translation>
4295+ </message>
4296+</context>
4297+<context>
4298+ <name>EditGroupWidget</name>
4299+ <message>
4300+ <source>Group</source>
4301+ <translation>Groep</translation>
4302+ </message>
4303+ <message>
4304+ <source>Icon</source>
4305+ <translation>Icoon</translation>
4306+ </message>
4307+ <message>
4308+ <source>Properties</source>
4309+ <translation>Eigenschappen</translation>
4310+ </message>
4311+ <message>
4312+ <source>Add group</source>
4313+ <translation>Groep toevoegen</translation>
4314+ </message>
4315+ <message>
4316+ <source>Edit group</source>
4317+ <translation>Groep wijzigen</translation>
4318+ </message>
4319+ <message>
4320+ <source>Enable</source>
4321+ <translation>Inschakelen</translation>
4322+ </message>
4323+ <message>
4324+ <source>Disable</source>
4325+ <translation>Uitschakelen</translation>
4326+ </message>
4327+ <message>
4328+ <source>Inherit from parent group (%1)</source>
4329+ <translation>Erf van bovenliggende groep (%1)</translation>
4330+ </message>
4331+</context>
4332+<context>
4333+ <name>EditGroupWidgetMain</name>
4334+ <message>
4335+ <source>Name</source>
4336+ <translation>Naam</translation>
4337+ </message>
4338+ <message>
4339+ <source>Notes</source>
4340+ <translation>Opmerkingen</translation>
4341+ </message>
4342+ <message>
4343+ <source>Expires</source>
4344+ <translation>Verloopt</translation>
4345+ </message>
4346+ <message>
4347+ <source>Search</source>
4348+ <translation>Zoeken</translation>
4349+ </message>
4350+ <message>
4351+ <source>Auto-type</source>
4352+ <translation>Auto-typen</translation>
4353+ </message>
4354+</context>
4355+<context>
4356+ <name>EditWidgetIcons</name>
4357+ <message>
4358+ <source>Use default icon</source>
4359+ <translation>Gebruik standaardicoon</translation>
4360+ </message>
4361+ <message>
4362+ <source>Use custom icon</source>
4363+ <translation>Gebruik aangepast icoon</translation>
4364+ </message>
4365+ <message>
4366+ <source>Add custom icon</source>
4367+ <translation>Voeg icoon toe</translation>
4368+ </message>
4369+ <message>
4370+ <source>Delete custom icon</source>
4371+ <translation>Verwijder icoon</translation>
4372+ </message>
4373+ <message>
4374+ <source>Images</source>
4375+ <translation>Afbeeldingen</translation>
4376+ </message>
4377+ <message>
4378+ <source>All files</source>
4379+ <translation>Alle bestanden</translation>
4380+ </message>
4381+ <message>
4382+ <source>Select Image</source>
4383+ <translation>Kies afbeelding</translation>
4384+ </message>
4385+ <message>
4386+ <source>Can&apos;t delete icon!</source>
4387+ <translation>Kan icoon niet verwijderen!</translation>
4388+ </message>
4389+ <message numerus="yes">
4390+ <source>Can&apos;t delete icon. Still used by %n item(s).</source>
4391+ <translation><numerusform>Kan icoon niet verwijderen. Het wordt nog gebruikt door %n element.</numerusform><numerusform>Kan icoon niet verwijderen. Het wordt nog gebruikt door %n elementen.</numerusform></translation>
4392+ </message>
4393+</context>
4394+<context>
4395+ <name>EditWidgetProperties</name>
4396+ <message>
4397+ <source>Created:</source>
4398+ <translation>Aangemaakt:</translation>
4399+ </message>
4400+ <message>
4401+ <source>Modified:</source>
4402+ <translation>Gewijzigd:</translation>
4403+ </message>
4404+ <message>
4405+ <source>Accessed:</source>
4406+ <translation>Gelezen:</translation>
4407+ </message>
4408+ <message>
4409+ <source>Uuid:</source>
4410+ <translation>Uuid:</translation>
4411+ </message>
4412+</context>
4413+<context>
4414+ <name>EntryAttributesModel</name>
4415+ <message>
4416+ <source>Name</source>
4417+ <translation>Naam</translation>
4418+ </message>
4419+</context>
4420+<context>
4421+ <name>EntryHistoryModel</name>
4422+ <message>
4423+ <source>Last modified</source>
4424+ <translation>Laatst gewijzigd</translation>
4425+ </message>
4426+ <message>
4427+ <source>Title</source>
4428+ <translation>Titel</translation>
4429+ </message>
4430+ <message>
4431+ <source>Username</source>
4432+ <translation>Gebruikersnaam</translation>
4433+ </message>
4434+ <message>
4435+ <source>URL</source>
4436+ <translation>URL</translation>
4437+ </message>
4438+</context>
4439+<context>
4440+ <name>EntryModel</name>
4441+ <message>
4442+ <source>Group</source>
4443+ <translation>Groep</translation>
4444+ </message>
4445+ <message>
4446+ <source>Title</source>
4447+ <translation>Titel</translation>
4448+ </message>
4449+ <message>
4450+ <source>Username</source>
4451+ <translation>Gebruikersnaam</translation>
4452+ </message>
4453+ <message>
4454+ <source>URL</source>
4455+ <translation>URL</translation>
4456+ </message>
4457+</context>
4458+<context>
4459+ <name>Group</name>
4460+ <message>
4461+ <source>Recycle Bin</source>
4462+ <translation>Prullenbak</translation>
4463+ </message>
4464+</context>
4465+<context>
4466+ <name>KeePass1OpenWidget</name>
4467+ <message>
4468+ <source>Import KeePass1 database</source>
4469+ <translation>Importeer Keepass 1-database</translation>
4470+ </message>
4471+ <message>
4472+ <source>Error</source>
4473+ <translation>Fout</translation>
4474+ </message>
4475+ <message>
4476+ <source>Unable to open the database.</source>
4477+ <translation>Niet mogelijk om de database te openen.</translation>
4478+ </message>
4479+</context>
4480+<context>
4481+ <name>KeePass1Reader</name>
4482+ <message>
4483+ <source>Unable to read keyfile.</source>
4484+ <translation>Niet mogelijk om sleutelbestand te lezen</translation>
4485+ </message>
4486+ <message>
4487+ <source>Not a KeePass database.</source>
4488+ <translation>Geen Keepass-database</translation>
4489+ </message>
4490+ <message>
4491+ <source>Unsupported encryption algorithm.</source>
4492+ <translation>Niet-ondersteund encryptie-algoritme</translation>
4493+ </message>
4494+ <message>
4495+ <source>Unsupported KeePass database version.</source>
4496+ <translation>Niet-ondersteunde versie van Keepass-database</translation>
4497+ </message>
4498+ <message>
4499+ <source>Root</source>
4500+ <translation>Alles</translation>
4501+ </message>
4502+</context>
4503+<context>
4504+ <name>KeePass2Reader</name>
4505+ <message>
4506+ <source>Not a KeePass database.</source>
4507+ <translation>Geen Keepass-database.</translation>
4508+ </message>
4509+ <message>
4510+ <source>Unsupported KeePass database version.</source>
4511+ <translation>Niet-ondersteunde versie van Keepass-database.</translation>
4512+ </message>
4513+ <message>
4514+ <source>Wrong key or database file is corrupt.</source>
4515+ <translation>Verkeerde sleutel of corrupte database.</translation>
4516+ </message>
4517+</context>
4518+<context>
4519+ <name>MainWindow</name>
4520+ <message>
4521+ <source>Database</source>
4522+ <translation>Database</translation>
4523+ </message>
4524+ <message>
4525+ <source>Recent databases</source>
4526+ <translation>Recente databases</translation>
4527+ </message>
4528+ <message>
4529+ <source>Help</source>
4530+ <translation>Help</translation>
4531+ </message>
4532+ <message>
4533+ <source>Entries</source>
4534+ <translation>Elementen</translation>
4535+ </message>
4536+ <message>
4537+ <source>Copy attribute to clipboard</source>
4538+ <translation>Kopieer eigenschap naar klembord</translation>
4539+ </message>
4540+ <message>
4541+ <source>Groups</source>
4542+ <translation>Groepen</translation>
4543+ </message>
4544+ <message>
4545+ <source>Extras</source>
4546+ <translation>Extra&apos;s</translation>
4547+ </message>
4548+ <message>
4549+ <source>View</source>
4550+ <translation>Beeld</translation>
4551+ </message>
4552+ <message>
4553+ <source>Quit</source>
4554+ <translation>Afsluiten</translation>
4555+ </message>
4556+ <message>
4557+ <source>About</source>
4558+ <translation>Over</translation>
4559+ </message>
4560+ <message>
4561+ <source>Open database</source>
4562+ <translation>Open database</translation>
4563+ </message>
4564+ <message>
4565+ <source>Save database</source>
4566+ <translation>Sla database op</translation>
4567+ </message>
4568+ <message>
4569+ <source>Close database</source>
4570+ <translation>Sluit database</translation>
4571+ </message>
4572+ <message>
4573+ <source>New database</source>
4574+ <translation>Nieuwe database</translation>
4575+ </message>
4576+ <message>
4577+ <source>Add new entry</source>
4578+ <translation>Voeg element toe</translation>
4579+ </message>
4580+ <message>
4581+ <source>View/Edit entry</source>
4582+ <translation>Bekijk/bewerk element</translation>
4583+ </message>
4584+ <message>
4585+ <source>Delete entry</source>
4586+ <translation>Verwijder element</translation>
4587+ </message>
4588+ <message>
4589+ <source>Add new group</source>
4590+ <translation>Voeg groep toe</translation>
4591+ </message>
4592+ <message>
4593+ <source>Edit group</source>
4594+ <translation>Bewerk groep</translation>
4595+ </message>
4596+ <message>
4597+ <source>Delete group</source>
4598+ <translation>Verwijder groep</translation>
4599+ </message>
4600+ <message>
4601+ <source>Save database as</source>
4602+ <translation>Database opslaan als</translation>
4603+ </message>
4604+ <message>
4605+ <source>Change master key</source>
4606+ <translation>Hoofdsleutel wijzigen</translation>
4607+ </message>
4608+ <message>
4609+ <source>Database settings</source>
4610+ <translation>Database-instellingen</translation>
4611+ </message>
4612+ <message>
4613+ <source>Import KeePass 1 database</source>
4614+ <translation>Importeer Keepass 1-database</translation>
4615+ </message>
4616+ <message>
4617+ <source>Clone entry</source>
4618+ <translation>Element klonen</translation>
4619+ </message>
4620+ <message>
4621+ <source>Find</source>
4622+ <translation>Vind</translation>
4623+ </message>
4624+ <message>
4625+ <source>Username</source>
4626+ <translation>Gebruikersnaam</translation>
4627+ </message>
4628+ <message>
4629+ <source>Copy username to clipboard</source>
4630+ <translation>Kopieer gebruikersnaam naar klembord</translation>
4631+ </message>
4632+ <message>
4633+ <source>Password</source>
4634+ <translation>Wachtwoord</translation>
4635+ </message>
4636+ <message>
4637+ <source>Copy password to clipboard</source>
4638+ <translation>Kopieer wachtwoord naar klembord</translation>
4639+ </message>
4640+ <message>
4641+ <source>Settings</source>
4642+ <translation>Instellingen</translation>
4643+ </message>
4644+ <message>
4645+ <source>Perform Auto-Type</source>
4646+ <translation>Voer auto-typen uit</translation>
4647+ </message>
4648+ <message>
4649+ <source>Open URL</source>
4650+ <translation>Open URL</translation>
4651+ </message>
4652+ <message>
4653+ <source>Lock databases</source>
4654+ <translation>Vergrendel databases</translation>
4655+ </message>
4656+ <message>
4657+ <source>Title</source>
4658+ <translation>Titel</translation>
4659+ </message>
4660+ <message>
4661+ <source>URL</source>
4662+ <translation>URL</translation>
4663+ </message>
4664+ <message>
4665+ <source>Notes</source>
4666+ <translation>Opmerkingen</translation>
4667+ </message>
4668+ <message>
4669+ <source>Show toolbar</source>
4670+ <translation>Werkbalk weergeven</translation>
4671+ </message>
4672+ <message>
4673+ <source>read-only</source>
4674+ <translation>alleen-lezen</translation>
4675+ </message>
4676+</context>
4677+<context>
4678+ <name>PasswordGeneratorWidget</name>
4679+ <message>
4680+ <source>Password:</source>
4681+ <translation>Wachtwoord:</translation>
4682+ </message>
4683+ <message>
4684+ <source>Length:</source>
4685+ <translation>Lengte:</translation>
4686+ </message>
4687+ <message>
4688+ <source>Character Types</source>
4689+ <translation>Tekens</translation>
4690+ </message>
4691+ <message>
4692+ <source>Upper Case Letters</source>
4693+ <translation>Hoofdletters</translation>
4694+ </message>
4695+ <message>
4696+ <source>Lower Case Letters</source>
4697+ <translation>Kleine letters</translation>
4698+ </message>
4699+ <message>
4700+ <source>Numbers</source>
4701+ <translation>Cijfers</translation>
4702+ </message>
4703+ <message>
4704+ <source>Special Characters</source>
4705+ <translation>Speciale tekens</translation>
4706+ </message>
4707+ <message>
4708+ <source>Exclude look-alike characters</source>
4709+ <translation>Geen op elkaar lijkende tekens</translation>
4710+ </message>
4711+ <message>
4712+ <source>Ensure that the password contains characters from every group</source>
4713+ <translation>Zorg dat het wachtwoord tekens uit iedere groep bevat</translation>
4714+ </message>
4715+ <message>
4716+ <source>Accept</source>
4717+ <translation>Accepteren</translation>
4718+ </message>
4719+</context>
4720+<context>
4721+ <name>QCommandLineParser</name>
4722+ <message>
4723+ <source>Displays version information.</source>
4724+ <translation>Toont versie-informatie.</translation>
4725+ </message>
4726+ <message>
4727+ <source>Displays this help.</source>
4728+ <translation>Toont deze helptekst.</translation>
4729+ </message>
4730+ <message>
4731+ <source>Unknown option &apos;%1&apos;.</source>
4732+ <translation>Onbekende optie &apos;%1&apos;.</translation>
4733+ </message>
4734+ <message>
4735+ <source>Unknown options: %1.</source>
4736+ <translation>Onbekende opties: %1.</translation>
4737+ </message>
4738+ <message>
4739+ <source>Missing value after &apos;%1&apos;.</source>
4740+ <translation>Ontbrekende waarde na &apos;%1&apos;.</translation>
4741+ </message>
4742+ <message>
4743+ <source>Unexpected value after &apos;%1&apos;.</source>
4744+ <translation>Onverwachte waarde na &apos;%1&apos;.</translation>
4745+ </message>
4746+ <message>
4747+ <source>[options]</source>
4748+ <translation>[opties]</translation>
4749+ </message>
4750+ <message>
4751+ <source>Usage: %1</source>
4752+ <translation>Gebruik: %1</translation>
4753+ </message>
4754+ <message>
4755+ <source>Options:</source>
4756+ <translation>Opties:</translation>
4757+ </message>
4758+ <message>
4759+ <source>Arguments:</source>
4760+ <translation>Argumenten:</translation>
4761+ </message>
4762+</context>
4763+<context>
4764+ <name>QSaveFile</name>
4765+ <message>
4766+ <source>Existing file %1 is not writable</source>
4767+ <translation>Bestaand bestand %1 is niet schrijfbaar</translation>
4768+ </message>
4769+ <message>
4770+ <source>Writing canceled by application</source>
4771+ <translation>Schrijven afgebroken door programma</translation>
4772+ </message>
4773+ <message>
4774+ <source>Partial write. Partition full?</source>
4775+ <translation>Slechts deels geschreven. Is de schijf vol?</translation>
4776+ </message>
4777+</context>
4778+<context>
4779+ <name>QtIOCompressor</name>
4780+ <message>
4781+ <source>Internal zlib error when compressing: </source>
4782+ <translation>Interne fout in zlib bij inpakken:</translation>
4783+ </message>
4784+ <message>
4785+ <source>Error writing to underlying device: </source>
4786+ <translation>Fout bij schrijven naar onderliggend apparaat:</translation>
4787+ </message>
4788+ <message>
4789+ <source>Error opening underlying device: </source>
4790+ <translation>Fout bij openen van onderliggend apparaat:</translation>
4791+ </message>
4792+ <message>
4793+ <source>Error reading data from underlying device: </source>
4794+ <translation>Fout bij lezen van gegevens van onderliggend apparaat:</translation>
4795+ </message>
4796+ <message>
4797+ <source>Internal zlib error when decompressing: </source>
4798+ <translation>Interne fout in zlib bij uitpakken:</translation>
4799+ </message>
4800+</context>
4801+<context>
4802+ <name>QtIOCompressor::open</name>
4803+ <message>
4804+ <source>The gzip format not supported in this version of zlib.</source>
4805+ <translation>Gzip wordt niet ondersteund in deze versie van zlib.</translation>
4806+ </message>
4807+ <message>
4808+ <source>Internal zlib error: </source>
4809+ <translation>Interne fout in zlib:</translation>
4810+ </message>
4811+</context>
4812+<context>
4813+ <name>SearchWidget</name>
4814+ <message>
4815+ <source>Find:</source>
4816+ <translation>Vind:</translation>
4817+ </message>
4818+ <message>
4819+ <source>Case sensitive</source>
4820+ <translation>Hoofdlettergevoelig</translation>
4821+ </message>
4822+ <message>
4823+ <source>Current group</source>
4824+ <translation>Huidige groep</translation>
4825+ </message>
4826+ <message>
4827+ <source>Root group</source>
4828+ <translation>Hoofdgroep</translation>
4829+ </message>
4830+</context>
4831+<context>
4832+ <name>SettingsWidget</name>
4833+ <message>
4834+ <source>Application Settings</source>
4835+ <translation>Programma-instellingen</translation>
4836+ </message>
4837+ <message>
4838+ <source>General</source>
4839+ <translation>Algemeen</translation>
4840+ </message>
4841+ <message>
4842+ <source>Security</source>
4843+ <translation>Beveiliging</translation>
4844+ </message>
4845+</context>
4846+<context>
4847+ <name>SettingsWidgetGeneral</name>
4848+ <message>
4849+ <source>Remember last databases</source>
4850+ <translation>Onthoud laatste databases</translation>
4851+ </message>
4852+ <message>
4853+ <source>Open previous databases on startup</source>
4854+ <translation>Open vorige databases bij starten</translation>
4855+ </message>
4856+ <message>
4857+ <source>Mark as modified on expanded state changes</source>
4858+ <translation>Markeer database als gewijzigd bij wijzigen van de status</translation>
4859+ </message>
4860+ <message>
4861+ <source>Automatically save on exit</source>
4862+ <translation>Automatisch opslaan bij afsluiten</translation>
4863+ </message>
4864+ <message>
4865+ <source>Automatically save after every change</source>
4866+ <translation>Automatisch opslaan na iedere wijziging</translation>
4867+ </message>
4868+ <message>
4869+ <source>Minimize when copying to clipboard</source>
4870+ <translation>Minimaliseer bij kopieeren naar klembord</translation>
4871+ </message>
4872+ <message>
4873+ <source>Use group icon on entry creation</source>
4874+ <translation>Gebruik icoon van de groep voor nieuwe elementen</translation>
4875+ </message>
4876+ <message>
4877+ <source>Global Auto-Type shortcut</source>
4878+ <translation>Globale sneltoets voor auto-typen</translation>
4879+ </message>
4880+ <message>
4881+ <source>Use entry title to match windows for global auto-type</source>
4882+ <translation>Gebruik naam van element als vensternaam voor auto-typen</translation>
4883+ </message>
4884+</context>
4885+<context>
4886+ <name>SettingsWidgetSecurity</name>
4887+ <message>
4888+ <source>Clear clipboard after</source>
4889+ <translation>Leeg klembord na</translation>
4890+ </message>
4891+ <message>
4892+ <source> sec</source>
4893+ <translation>sec</translation>
4894+ </message>
4895+ <message>
4896+ <source>Lock databases after inactivity of</source>
4897+ <translation>Vergrendel databases na inactiviteit van</translation>
4898+ </message>
4899+ <message>
4900+ <source>Show passwords in cleartext by default</source>
4901+ <translation>Laat wachtwoorden standaard zien</translation>
4902+ </message>
4903+ <message>
4904+ <source>Always ask before performing auto-type</source>
4905+ <translation>Altijd vragen alvorens auto-type uit te voeren</translation>
4906+ </message>
4907+</context>
4908+<context>
4909+ <name>UnlockDatabaseWidget</name>
4910+ <message>
4911+ <source>Unlock database</source>
4912+ <translation>Database ontgrendelen</translation>
4913+ </message>
4914+ <message>
4915+ <source>Error</source>
4916+ <translation>Fout</translation>
4917+ </message>
4918+ <message>
4919+ <source>Wrong key.</source>
4920+ <translation>Verkeerd wachtwoord</translation>
4921+ </message>
4922+</context>
4923+<context>
4924+ <name>WelcomeWidget</name>
4925+ <message>
4926+ <source>Welcome!</source>
4927+ <translation>Welkom!</translation>
4928+ </message>
4929+</context>
4930+<context>
4931+ <name>main</name>
4932+ <message>
4933+ <source>KeePassX - cross-platform password manager</source>
4934+ <translation>KeepassX - multi-platform wachtwoordbeheerder</translation>
4935+ </message>
4936+ <message>
4937+ <source>filename of the password database to open (*.kdbx)</source>
4938+ <translation>bestandsnaam van de te openen wachtwoorddatabase (*.kdbx)</translation>
4939+ </message>
4940+ <message>
4941+ <source>path to a custom config file</source>
4942+ <translation>pad naar een configuratiebestand</translation>
4943+ </message>
4944+ <message>
4945+ <source>password of the database (DANGEROUS!)</source>
4946+ <translation>wachtwoord van de database (GEVAARLIJK!)</translation>
4947+ </message>
4948+ <message>
4949+ <source>key file of the database</source>
4950+ <translation>sleutelbestand van de database</translation>
4951+ </message>
4952+</context>
4953+</TS>
4954\ No newline at end of file
4955diff --git a/share/translations/keepassx_sv.ts b/share/translations/keepassx_sv.ts
4956new file mode 100644
4957index 0000000..2a3ba79
4958--- /dev/null
4959+++ b/share/translations/keepassx_sv.ts
4960@@ -0,0 +1,1178 @@
4961+<?xml version="1.0" ?><!DOCTYPE TS><TS language="sv" version="2.0">
4962+<context>
4963+ <name>AboutDialog</name>
4964+ <message>
4965+ <source>About KeePassX</source>
4966+ <translation>Om KeePassX</translation>
4967+ </message>
4968+ <message>
4969+ <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
4970+ <translation>Keepassx distribueras enligt villkoren i GNU General Public License (GPL) version 2 eller (om du vill) version 3.</translation>
4971+ </message>
4972+</context>
4973+<context>
4974+ <name>AutoType</name>
4975+ <message>
4976+ <source>Auto-Type - KeePassX</source>
4977+ <translation>Auto-skriv - KeePassX</translation>
4978+ </message>
4979+ <message>
4980+ <source>Couldn&apos;t find an entry that matches the window title.</source>
4981+ <translation>Kunde inte hitta en post som matchar fönstertiteln.</translation>
4982+ </message>
4983+</context>
4984+<context>
4985+ <name>AutoTypeAssociationsModel</name>
4986+ <message>
4987+ <source>Window</source>
4988+ <translation>Fönster</translation>
4989+ </message>
4990+ <message>
4991+ <source>Sequence</source>
4992+ <translation>Sekvens</translation>
4993+ </message>
4994+ <message>
4995+ <source>Default sequence</source>
4996+ <translation>Standard sekvens</translation>
4997+ </message>
4998+</context>
4999+<context>
5000+ <name>AutoTypeSelectDialog</name>
5001+ <message>
5002+ <source>Auto-Type - KeePassX</source>
5003+ <translation>Auto-skriv - KeePassX</translation>
5004+ </message>
5005+ <message>
5006+ <source>Select entry to Auto-Type:</source>
5007+ <translation>Välj post att auto-skriva</translation>
5008+ </message>
5009+</context>
5010+<context>
5011+ <name>ChangeMasterKeyWidget</name>
5012+ <message>
5013+ <source>Password</source>
5014+ <translation>Lösenord</translation>
5015+ </message>
5016+ <message>
5017+ <source>Enter password:</source>
5018+ <translation>Ange lösenord:</translation>
5019+ </message>
5020+ <message>
5021+ <source>Repeat password:</source>
5022+ <translation>Repetera lösenord:</translation>
5023+ </message>
5024+ <message>
5025+ <source>Key file</source>
5026+ <translation>Nyckel-fil</translation>
5027+ </message>
5028+ <message>
5029+ <source>Browse</source>
5030+ <translation>Bläddra</translation>
5031+ </message>
5032+ <message>
5033+ <source>Create</source>
5034+ <translation>Skapa</translation>
5035+ </message>
5036+ <message>
5037+ <source>Key files</source>
5038+ <translation>Nyckel-filer</translation>
5039+ </message>
5040+ <message>
5041+ <source>All files</source>
5042+ <translation>Alla filer</translation>
5043+ </message>
5044+ <message>
5045+ <source>Create Key File...</source>
5046+ <translation>Skapa nyckel-fil...</translation>
5047+ </message>
5048+ <message>
5049+ <source>Error</source>
5050+ <translation>Fel</translation>
5051+ </message>
5052+ <message>
5053+ <source>Unable to create Key File : </source>
5054+ <translation>Kunde inte skapa nyckel-fil</translation>
5055+ </message>
5056+ <message>
5057+ <source>Select a key file</source>
5058+ <translation>Välj nyckel-fil</translation>
5059+ </message>
5060+ <message>
5061+ <source>Question</source>
5062+ <translation>Fråga</translation>
5063+ </message>
5064+ <message>
5065+ <source>Do you really want to use an empty string as password?</source>
5066+ <translation>Vill du verkligen vill använda en tom sträng som lösenord?</translation>
5067+ </message>
5068+ <message>
5069+ <source>Different passwords supplied.</source>
5070+ <translation>Olika lösenord angivna</translation>
5071+ </message>
5072+</context>
5073+<context>
5074+ <name>DatabaseOpenWidget</name>
5075+ <message>
5076+ <source>Enter master key</source>
5077+ <translation>Ange huvud lösenord</translation>
5078+ </message>
5079+ <message>
5080+ <source>Key File:</source>
5081+ <translation>Nyckel-fil:</translation>
5082+ </message>
5083+ <message>
5084+ <source>Password:</source>
5085+ <translation>Lösenord:</translation>
5086+ </message>
5087+ <message>
5088+ <source>Browse</source>
5089+ <translation>Bläddra</translation>
5090+ </message>
5091+ <message>
5092+ <source>Error</source>
5093+ <translation>Fel</translation>
5094+ </message>
5095+ <message>
5096+ <source>Unable to open the database.</source>
5097+ <translation>Kunde inte öppna databas.</translation>
5098+ </message>
5099+ <message>
5100+ <source>Can&apos;t open key file</source>
5101+ <translation>Kan inte öppna nyckel-fil</translation>
5102+ </message>
5103+ <message>
5104+ <source>All files</source>
5105+ <translation>Alla filer</translation>
5106+ </message>
5107+ <message>
5108+ <source>Key files</source>
5109+ <translation>Nyckel-filer</translation>
5110+ </message>
5111+ <message>
5112+ <source>Select key file</source>
5113+ <translation>Välj nyckel-fil</translation>
5114+ </message>
5115+</context>
5116+<context>
5117+ <name>DatabaseSettingsWidget</name>
5118+ <message>
5119+ <source>Database name:</source>
5120+ <translation>Databasnamn:</translation>
5121+ </message>
5122+ <message>
5123+ <source>Database description:</source>
5124+ <translation>Databasbeskrivning:</translation>
5125+ </message>
5126+ <message>
5127+ <source>Transform rounds:</source>
5128+ <translation>Transformerings varv:</translation>
5129+ </message>
5130+ <message>
5131+ <source>Default username:</source>
5132+ <translation>Standard användarnamn:</translation>
5133+ </message>
5134+ <message>
5135+ <source>Use recycle bin:</source>
5136+ <translation>Använd papperskorg:</translation>
5137+ </message>
5138+ <message>
5139+ <source> MiB</source>
5140+ <translation>MiB</translation>
5141+ </message>
5142+ <message>
5143+ <source>Benchmark</source>
5144+ <translation>Benchmark</translation>
5145+ </message>
5146+ <message>
5147+ <source>Max. history items:</source>
5148+ <translation>Maxantal historik poster:</translation>
5149+ </message>
5150+ <message>
5151+ <source>Max. history size:</source>
5152+ <translation>Maximal historik storlek:</translation>
5153+ </message>
5154+</context>
5155+<context>
5156+ <name>DatabaseTabWidget</name>
5157+ <message>
5158+ <source>Root</source>
5159+ <translation>Root</translation>
5160+ </message>
5161+ <message>
5162+ <source>KeePass 2 Database</source>
5163+ <translation>KeePass 2 Databas</translation>
5164+ </message>
5165+ <message>
5166+ <source>All files</source>
5167+ <translation>Alla filer</translation>
5168+ </message>
5169+ <message>
5170+ <source>Open database</source>
5171+ <translation>Öppna databas</translation>
5172+ </message>
5173+ <message>
5174+ <source>Warning</source>
5175+ <translation>Varning</translation>
5176+ </message>
5177+ <message>
5178+ <source>File not found!</source>
5179+ <translation>Filen kunde inte hittas!</translation>
5180+ </message>
5181+ <message>
5182+ <source>Open KeePass 1 database</source>
5183+ <translation>Öppna KeePass 1 databas</translation>
5184+ </message>
5185+ <message>
5186+ <source>KeePass 1 database</source>
5187+ <translation>KeePass 1 databas</translation>
5188+ </message>
5189+ <message>
5190+ <source>All files (*)</source>
5191+ <translation>Alla filer (*)</translation>
5192+ </message>
5193+ <message>
5194+ <source>Close?</source>
5195+ <translation>Stäng?</translation>
5196+ </message>
5197+ <message>
5198+ <source>&quot;%1&quot; is in edit mode.
5199+Close anyway?</source>
5200+ <translation>&quot;%1&quot; är i redigerar-läge.
5201+Stäng ändå?</translation>
5202+ </message>
5203+ <message>
5204+ <source>Save changes?</source>
5205+ <translation>Spara ändringar?</translation>
5206+ </message>
5207+ <message>
5208+ <source>&quot;%1&quot; was modified.
5209+Save changes?</source>
5210+ <translation>&quot;%1&quot; har ändrats.
5211+Spara ändringarna?</translation>
5212+ </message>
5213+ <message>
5214+ <source>Error</source>
5215+ <translation>Fel</translation>
5216+ </message>
5217+ <message>
5218+ <source>Writing the database failed.</source>
5219+ <translation>Kunde inte skriva till databasen.</translation>
5220+ </message>
5221+ <message>
5222+ <source>Save database as</source>
5223+ <translation>Spara databas som</translation>
5224+ </message>
5225+ <message>
5226+ <source>New database</source>
5227+ <translation>Ny databas</translation>
5228+ </message>
5229+ <message>
5230+ <source>locked</source>
5231+ <translation>låst</translation>
5232+ </message>
5233+</context>
5234+<context>
5235+ <name>DatabaseWidget</name>
5236+ <message>
5237+ <source>Change master key</source>
5238+ <translation>Ändra huvud lösenord</translation>
5239+ </message>
5240+ <message>
5241+ <source>Delete entry?</source>
5242+ <translation>Ta bort post?</translation>
5243+ </message>
5244+ <message>
5245+ <source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
5246+ <translation>Vill du verkligen ta bort &quot;%1&quot; för gott?</translation>
5247+ </message>
5248+ <message>
5249+ <source>Delete entries?</source>
5250+ <translation>Ta bort poster?</translation>
5251+ </message>
5252+ <message>
5253+ <source>Do you really want to delete %1 entries for good?</source>
5254+ <translation>Vill du verkligen ta bort %1 poser för gott?</translation>
5255+ </message>
5256+ <message>
5257+ <source>Move entries to recycle bin?</source>
5258+ <translation>Lägg poster i papperskorgen?</translation>
5259+ </message>
5260+ <message numerus="yes">
5261+ <source>Do you really want to move %n entry(s) to the recycle bin?</source>
5262+ <translation><numerusform>Vill du verkligen flytta %n post till papperskorgen?</numerusform><numerusform>Vill du verkligen flytta %n poster till papperskorgen?</numerusform></translation>
5263+ </message>
5264+ <message>
5265+ <source>Delete group?</source>
5266+ <translation>Ta bort grupp?</translation>
5267+ </message>
5268+ <message>
5269+ <source>Do you really want to delete the group &quot;%1&quot; for good?</source>
5270+ <translation>Vill du verkligen ta bort gruppen &quot;%1&quot; för gott?</translation>
5271+ </message>
5272+ <message>
5273+ <source>Current group</source>
5274+ <translation>Nuvarande grupp</translation>
5275+ </message>
5276+</context>
5277+<context>
5278+ <name>EditEntryWidget</name>
5279+ <message>
5280+ <source>Entry</source>
5281+ <translation>Post</translation>
5282+ </message>
5283+ <message>
5284+ <source>Advanced</source>
5285+ <translation>Avancerat</translation>
5286+ </message>
5287+ <message>
5288+ <source>Icon</source>
5289+ <translation>Ikon</translation>
5290+ </message>
5291+ <message>
5292+ <source>Auto-Type</source>
5293+ <translation>Auto-skriv</translation>
5294+ </message>
5295+ <message>
5296+ <source>Properties</source>
5297+ <translation>Egenskaper</translation>
5298+ </message>
5299+ <message>
5300+ <source>History</source>
5301+ <translation>Historik</translation>
5302+ </message>
5303+ <message>
5304+ <source>Entry history</source>
5305+ <translation>Posthistork</translation>
5306+ </message>
5307+ <message>
5308+ <source>Add entry</source>
5309+ <translation>Lägg till post</translation>
5310+ </message>
5311+ <message>
5312+ <source>Edit entry</source>
5313+ <translation>Ändra post</translation>
5314+ </message>
5315+ <message>
5316+ <source>Error</source>
5317+ <translation>Fel</translation>
5318+ </message>
5319+ <message>
5320+ <source>Different passwords supplied.</source>
5321+ <translation>Olika lösenord angivna</translation>
5322+ </message>
5323+ <message>
5324+ <source>New attribute</source>
5325+ <translation>Nytt attribut</translation>
5326+ </message>
5327+ <message>
5328+ <source>Select file</source>
5329+ <translation>Välj fil</translation>
5330+ </message>
5331+ <message>
5332+ <source>Unable to open file</source>
5333+ <translation>Kunde inte öppna filen.</translation>
5334+ </message>
5335+ <message>
5336+ <source>Save attachment</source>
5337+ <translation>Spara bifogad fil</translation>
5338+ </message>
5339+ <message>
5340+ <source>Unable to save the attachment:
5341+</source>
5342+ <translation>Kunde inte spara bifogad fil:
5343+</translation>
5344+ </message>
5345+ <message>
5346+ <source>Tomorrow</source>
5347+ <translation>Imorgon</translation>
5348+ </message>
5349+ <message numerus="yes">
5350+ <source>%n week(s)</source>
5351+ <translation><numerusform>%n vecka</numerusform><numerusform>%n veckor</numerusform></translation>
5352+ </message>
5353+ <message numerus="yes">
5354+ <source>%n month(s)</source>
5355+ <translation><numerusform>%n månad</numerusform><numerusform>%n månader</numerusform></translation>
5356+ </message>
5357+ <message>
5358+ <source>1 year</source>
5359+ <translation>1 år</translation>
5360+ </message>
5361+</context>
5362+<context>
5363+ <name>EditEntryWidgetAdvanced</name>
5364+ <message>
5365+ <source>Additional attributes</source>
5366+ <translation>Ytterligare attribut</translation>
5367+ </message>
5368+ <message>
5369+ <source>Add</source>
5370+ <translation>Lägg till</translation>
5371+ </message>
5372+ <message>
5373+ <source>Edit</source>
5374+ <translation>Ändra</translation>
5375+ </message>
5376+ <message>
5377+ <source>Remove</source>
5378+ <translation>Ta bort</translation>
5379+ </message>
5380+ <message>
5381+ <source>Attachments</source>
5382+ <translation>Bilagor</translation>
5383+ </message>
5384+ <message>
5385+ <source>Save</source>
5386+ <translation>Spara</translation>
5387+ </message>
5388+</context>
5389+<context>
5390+ <name>EditEntryWidgetAutoType</name>
5391+ <message>
5392+ <source>Enable Auto-Type for this entry</source>
5393+ <translation>Slå på auto-skriv för denna post</translation>
5394+ </message>
5395+ <message>
5396+ <source>Inherit default Auto-Type sequence from the group</source>
5397+ <translation>Ärv standard auto-skriv sekvens för grupp</translation>
5398+ </message>
5399+ <message>
5400+ <source>Use custom Auto-Type sequence:</source>
5401+ <translation>Använd egen auto-skriv sekvens:</translation>
5402+ </message>
5403+ <message>
5404+ <source>+</source>
5405+ <translation>+</translation>
5406+ </message>
5407+ <message>
5408+ <source>-</source>
5409+ <translation>-</translation>
5410+ </message>
5411+ <message>
5412+ <source>Window title:</source>
5413+ <translation>Fönster titel:</translation>
5414+ </message>
5415+ <message>
5416+ <source>Use default sequence</source>
5417+ <translation>Använd standard sekvens</translation>
5418+ </message>
5419+ <message>
5420+ <source>Set custom sequence:</source>
5421+ <translation>Egen sekvens:</translation>
5422+ </message>
5423+</context>
5424+<context>
5425+ <name>EditEntryWidgetHistory</name>
5426+ <message>
5427+ <source>Show</source>
5428+ <translation>Visa</translation>
5429+ </message>
5430+ <message>
5431+ <source>Restore</source>
5432+ <translation>Återställ</translation>
5433+ </message>
5434+ <message>
5435+ <source>Delete</source>
5436+ <translation>Ta bort</translation>
5437+ </message>
5438+ <message>
5439+ <source>Delete all</source>
5440+ <translation>Ta bort alla</translation>
5441+ </message>
5442+</context>
5443+<context>
5444+ <name>EditEntryWidgetMain</name>
5445+ <message>
5446+ <source>Title:</source>
5447+ <translation>Titel:</translation>
5448+ </message>
5449+ <message>
5450+ <source>Username:</source>
5451+ <translation>Användarnamn:</translation>
5452+ </message>
5453+ <message>
5454+ <source>Password:</source>
5455+ <translation>Lösenord:</translation>
5456+ </message>
5457+ <message>
5458+ <source>Repeat:</source>
5459+ <translation>Repetera:</translation>
5460+ </message>
5461+ <message>
5462+ <source>Gen.</source>
5463+ <translation>Gen.</translation>
5464+ </message>
5465+ <message>
5466+ <source>URL:</source>
5467+ <translation>URL:</translation>
5468+ </message>
5469+ <message>
5470+ <source>Expires</source>
5471+ <translation>Går ut</translation>
5472+ </message>
5473+ <message>
5474+ <source>Presets</source>
5475+ <translation>Förinställningar</translation>
5476+ </message>
5477+ <message>
5478+ <source>Notes:</source>
5479+ <translation>Anteckningar:</translation>
5480+ </message>
5481+</context>
5482+<context>
5483+ <name>EditGroupWidget</name>
5484+ <message>
5485+ <source>Group</source>
5486+ <translation>Grupp</translation>
5487+ </message>
5488+ <message>
5489+ <source>Icon</source>
5490+ <translation>Ikon</translation>
5491+ </message>
5492+ <message>
5493+ <source>Properties</source>
5494+ <translation>Egenskaper</translation>
5495+ </message>
5496+ <message>
5497+ <source>Add group</source>
5498+ <translation>Lägg till grupp</translation>
5499+ </message>
5500+ <message>
5501+ <source>Edit group</source>
5502+ <translation>Ändra grupp</translation>
5503+ </message>
5504+ <message>
5505+ <source>Enable</source>
5506+ <translation>Slå på</translation>
5507+ </message>
5508+ <message>
5509+ <source>Disable</source>
5510+ <translation>Stäng av</translation>
5511+ </message>
5512+ <message>
5513+ <source>Inherit from parent group (%1)</source>
5514+ <translation>Ärv från förälder grupp (%1)</translation>
5515+ </message>
5516+</context>
5517+<context>
5518+ <name>EditGroupWidgetMain</name>
5519+ <message>
5520+ <source>Name</source>
5521+ <translation>Namn</translation>
5522+ </message>
5523+ <message>
5524+ <source>Notes</source>
5525+ <translation>Anteckningar</translation>
5526+ </message>
5527+ <message>
5528+ <source>Expires</source>
5529+ <translation>Går ut</translation>
5530+ </message>
5531+ <message>
5532+ <source>Search</source>
5533+ <translation>Sök</translation>
5534+ </message>
5535+ <message>
5536+ <source>Auto-type</source>
5537+ <translation>Auto-skriv</translation>
5538+ </message>
5539+</context>
5540+<context>
5541+ <name>EditWidgetIcons</name>
5542+ <message>
5543+ <source>Use default icon</source>
5544+ <translation>Använd standard ikon</translation>
5545+ </message>
5546+ <message>
5547+ <source>Use custom icon</source>
5548+ <translation>Använd egen ikon</translation>
5549+ </message>
5550+ <message>
5551+ <source>Add custom icon</source>
5552+ <translation>Lägg till egen ikon</translation>
5553+ </message>
5554+ <message>
5555+ <source>Delete custom icon</source>
5556+ <translation>Ta bort egen ikon</translation>
5557+ </message>
5558+ <message>
5559+ <source>Images</source>
5560+ <translation>Bilder</translation>
5561+ </message>
5562+ <message>
5563+ <source>All files</source>
5564+ <translation>Alla filer</translation>
5565+ </message>
5566+ <message>
5567+ <source>Select Image</source>
5568+ <translation>Välj bild</translation>
5569+ </message>
5570+ <message>
5571+ <source>Can&apos;t delete icon!</source>
5572+ <translation>Kan inte ta bort ikon!</translation>
5573+ </message>
5574+ <message numerus="yes">
5575+ <source>Can&apos;t delete icon. Still used by %n item(s).</source>
5576+ <translation><numerusform>Kan inte ta bort ikonen. Den används fortfarande av %n post</numerusform><numerusform>Kan inte ta bort ikonen. Den används fortfarande av %n poster</numerusform></translation>
5577+ </message>
5578+</context>
5579+<context>
5580+ <name>EditWidgetProperties</name>
5581+ <message>
5582+ <source>Created:</source>
5583+ <translation>Skapad:</translation>
5584+ </message>
5585+ <message>
5586+ <source>Modified:</source>
5587+ <translation>Ändrad:</translation>
5588+ </message>
5589+ <message>
5590+ <source>Accessed:</source>
5591+ <translation>Läst:</translation>
5592+ </message>
5593+ <message>
5594+ <source>Uuid:</source>
5595+ <translation>UUID:</translation>
5596+ </message>
5597+</context>
5598+<context>
5599+ <name>EntryAttributesModel</name>
5600+ <message>
5601+ <source>Name</source>
5602+ <translation>Namn</translation>
5603+ </message>
5604+</context>
5605+<context>
5606+ <name>EntryHistoryModel</name>
5607+ <message>
5608+ <source>Last modified</source>
5609+ <translation>Senast ändrad</translation>
5610+ </message>
5611+ <message>
5612+ <source>Title</source>
5613+ <translation>Titel</translation>
5614+ </message>
5615+ <message>
5616+ <source>Username</source>
5617+ <translation>Användarnamn</translation>
5618+ </message>
5619+ <message>
5620+ <source>URL</source>
5621+ <translation>URL</translation>
5622+ </message>
5623+</context>
5624+<context>
5625+ <name>EntryModel</name>
5626+ <message>
5627+ <source>Group</source>
5628+ <translation>Grupp</translation>
5629+ </message>
5630+ <message>
5631+ <source>Title</source>
5632+ <translation>Titel</translation>
5633+ </message>
5634+ <message>
5635+ <source>Username</source>
5636+ <translation>Användarnamn</translation>
5637+ </message>
5638+ <message>
5639+ <source>URL</source>
5640+ <translation>URL</translation>
5641+ </message>
5642+</context>
5643+<context>
5644+ <name>Group</name>
5645+ <message>
5646+ <source>Recycle Bin</source>
5647+ <translation>Papperskorg</translation>
5648+ </message>
5649+</context>
5650+<context>
5651+ <name>KeePass1OpenWidget</name>
5652+ <message>
5653+ <source>Import KeePass1 database</source>
5654+ <translation>Importera KeePass1 databas</translation>
5655+ </message>
5656+ <message>
5657+ <source>Error</source>
5658+ <translation>Fel</translation>
5659+ </message>
5660+ <message>
5661+ <source>Unable to open the database.</source>
5662+ <translation>Kunde inte öppna databas.</translation>
5663+ </message>
5664+</context>
5665+<context>
5666+ <name>KeePass1Reader</name>
5667+ <message>
5668+ <source>Unable to read keyfile.</source>
5669+ <translation>Kunde inte läsa nyckel-filen.</translation>
5670+ </message>
5671+ <message>
5672+ <source>Not a KeePass database.</source>
5673+ <translation>Inte en KeePass databas</translation>
5674+ </message>
5675+ <message>
5676+ <source>Unsupported encryption algorithm.</source>
5677+ <translation>Krypteringsalgoritnmen stöds ej</translation>
5678+ </message>
5679+ <message>
5680+ <source>Unsupported KeePass database version.</source>
5681+ <translation>KeePass databas versionen stöds ej.</translation>
5682+ </message>
5683+ <message>
5684+ <source>Root</source>
5685+ <translation>Root</translation>
5686+ </message>
5687+</context>
5688+<context>
5689+ <name>KeePass2Reader</name>
5690+ <message>
5691+ <source>Not a KeePass database.</source>
5692+ <translation>Inte en KeePass databas.</translation>
5693+ </message>
5694+ <message>
5695+ <source>Unsupported KeePass database version.</source>
5696+ <translation>KeePass databas versionen stöds ej.</translation>
5697+ </message>
5698+ <message>
5699+ <source>Wrong key or database file is corrupt.</source>
5700+ <translation>Fel lösenord eller korrupt databas-fil</translation>
5701+ </message>
5702+</context>
5703+<context>
5704+ <name>MainWindow</name>
5705+ <message>
5706+ <source>Database</source>
5707+ <translation>Databas</translation>
5708+ </message>
5709+ <message>
5710+ <source>Recent databases</source>
5711+ <translation>Senast använda databser</translation>
5712+ </message>
5713+ <message>
5714+ <source>Help</source>
5715+ <translation>Hjälp</translation>
5716+ </message>
5717+ <message>
5718+ <source>Entries</source>
5719+ <translation>Poster</translation>
5720+ </message>
5721+ <message>
5722+ <source>Copy attribute to clipboard</source>
5723+ <translation>Kopiera attribut</translation>
5724+ </message>
5725+ <message>
5726+ <source>Groups</source>
5727+ <translation>Grupper</translation>
5728+ </message>
5729+ <message>
5730+ <source>Extras</source>
5731+ <translation>Extra</translation>
5732+ </message>
5733+ <message>
5734+ <source>View</source>
5735+ <translation>Vy</translation>
5736+ </message>
5737+ <message>
5738+ <source>Quit</source>
5739+ <translation>Avsluta</translation>
5740+ </message>
5741+ <message>
5742+ <source>About</source>
5743+ <translation>Om</translation>
5744+ </message>
5745+ <message>
5746+ <source>Open database</source>
5747+ <translation>Öppna databas</translation>
5748+ </message>
5749+ <message>
5750+ <source>Save database</source>
5751+ <translation>Spara databas</translation>
5752+ </message>
5753+ <message>
5754+ <source>Close database</source>
5755+ <translation>Stäng databas</translation>
5756+ </message>
5757+ <message>
5758+ <source>New database</source>
5759+ <translation>Ny databas</translation>
5760+ </message>
5761+ <message>
5762+ <source>Add new entry</source>
5763+ <translation>Lägg till ny post</translation>
5764+ </message>
5765+ <message>
5766+ <source>View/Edit entry</source>
5767+ <translation>Visa/ändra post</translation>
5768+ </message>
5769+ <message>
5770+ <source>Delete entry</source>
5771+ <translation>Ta bort post</translation>
5772+ </message>
5773+ <message>
5774+ <source>Add new group</source>
5775+ <translation>Lägg till ny grupp</translation>
5776+ </message>
5777+ <message>
5778+ <source>Edit group</source>
5779+ <translation>Ändra grupp</translation>
5780+ </message>
5781+ <message>
5782+ <source>Delete group</source>
5783+ <translation>Ta bort grupp</translation>
5784+ </message>
5785+ <message>
5786+ <source>Save database as</source>
5787+ <translation>Spara databas som</translation>
5788+ </message>
5789+ <message>
5790+ <source>Change master key</source>
5791+ <translation>Ändra huvud lösenord</translation>
5792+ </message>
5793+ <message>
5794+ <source>Database settings</source>
5795+ <translation>Databasinställningar</translation>
5796+ </message>
5797+ <message>
5798+ <source>Import KeePass 1 database</source>
5799+ <translation>Importera KeePass1 databas</translation>
5800+ </message>
5801+ <message>
5802+ <source>Clone entry</source>
5803+ <translation>Klona post</translation>
5804+ </message>
5805+ <message>
5806+ <source>Find</source>
5807+ <translation>Sök</translation>
5808+ </message>
5809+ <message>
5810+ <source>Username</source>
5811+ <translation>Användarnamn</translation>
5812+ </message>
5813+ <message>
5814+ <source>Copy username to clipboard</source>
5815+ <translation>Kopiera användarnamn</translation>
5816+ </message>
5817+ <message>
5818+ <source>Password</source>
5819+ <translation>Lösenord</translation>
5820+ </message>
5821+ <message>
5822+ <source>Copy password to clipboard</source>
5823+ <translation>Kopiera lösenord</translation>
5824+ </message>
5825+ <message>
5826+ <source>Settings</source>
5827+ <translation>Inställningar</translation>
5828+ </message>
5829+ <message>
5830+ <source>Perform Auto-Type</source>
5831+ <translation>Utför auto-skriv</translation>
5832+ </message>
5833+ <message>
5834+ <source>Open URL</source>
5835+ <translation>Öppna URL</translation>
5836+ </message>
5837+ <message>
5838+ <source>Lock databases</source>
5839+ <translation>Lås databaser</translation>
5840+ </message>
5841+ <message>
5842+ <source>Title</source>
5843+ <translation>Titel</translation>
5844+ </message>
5845+ <message>
5846+ <source>URL</source>
5847+ <translation>URL</translation>
5848+ </message>
5849+ <message>
5850+ <source>Notes</source>
5851+ <translation>Anteckningar</translation>
5852+ </message>
5853+ <message>
5854+ <source>Show toolbar</source>
5855+ <translation>Visa verktygsfält</translation>
5856+ </message>
5857+ <message>
5858+ <source>read-only</source>
5859+ <translation>läs bara</translation>
5860+ </message>
5861+</context>
5862+<context>
5863+ <name>PasswordGeneratorWidget</name>
5864+ <message>
5865+ <source>Password:</source>
5866+ <translation>Lösenord:</translation>
5867+ </message>
5868+ <message>
5869+ <source>Length:</source>
5870+ <translation>Längd:</translation>
5871+ </message>
5872+ <message>
5873+ <source>Character Types</source>
5874+ <translation>Teckentyper</translation>
5875+ </message>
5876+ <message>
5877+ <source>Upper Case Letters</source>
5878+ <translation>Versaler</translation>
5879+ </message>
5880+ <message>
5881+ <source>Lower Case Letters</source>
5882+ <translation>Gemener</translation>
5883+ </message>
5884+ <message>
5885+ <source>Numbers</source>
5886+ <translation>Siffror</translation>
5887+ </message>
5888+ <message>
5889+ <source>Special Characters</source>
5890+ <translation>Specialtecken</translation>
5891+ </message>
5892+ <message>
5893+ <source>Exclude look-alike characters</source>
5894+ <translation>Uteslut liknande tecken</translation>
5895+ </message>
5896+ <message>
5897+ <source>Ensure that the password contains characters from every group</source>
5898+ <translation>Säkerställ att lösenordet innehåller tecken från varje grupp</translation>
5899+ </message>
5900+ <message>
5901+ <source>Accept</source>
5902+ <translation>Acceptera</translation>
5903+ </message>
5904+</context>
5905+<context>
5906+ <name>QCommandLineParser</name>
5907+ <message>
5908+ <source>Displays version information.</source>
5909+ <translation>Visar versionsinformation.</translation>
5910+ </message>
5911+ <message>
5912+ <source>Displays this help.</source>
5913+ <translation>Visa denna hjälp.</translation>
5914+ </message>
5915+ <message>
5916+ <source>Unknown option &apos;%1&apos;.</source>
5917+ <translation>Okänt alternativ: &apos;%1&apos;</translation>
5918+ </message>
5919+ <message>
5920+ <source>Unknown options: %1.</source>
5921+ <translation>Okända alternativ: &apos;%1&apos;</translation>
5922+ </message>
5923+ <message>
5924+ <source>Missing value after &apos;%1&apos;.</source>
5925+ <translation>Saknar värde efter &apos;%1&apos;</translation>
5926+ </message>
5927+ <message>
5928+ <source>Unexpected value after &apos;%1&apos;.</source>
5929+ <translation>Oväntat värde efter &apos;%1&apos;</translation>
5930+ </message>
5931+ <message>
5932+ <source>[options]</source>
5933+ <translation>[alternativ]</translation>
5934+ </message>
5935+ <message>
5936+ <source>Usage: %1</source>
5937+ <translation>Användning: %1</translation>
5938+ </message>
5939+ <message>
5940+ <source>Options:</source>
5941+ <translation>Alternativ:</translation>
5942+ </message>
5943+ <message>
5944+ <source>Arguments:</source>
5945+ <translation>Argument:</translation>
5946+ </message>
5947+</context>
5948+<context>
5949+ <name>QSaveFile</name>
5950+ <message>
5951+ <source>Existing file %1 is not writable</source>
5952+ <translation>Den existerande filen %1 är inte skrivbar</translation>
5953+ </message>
5954+ <message>
5955+ <source>Writing canceled by application</source>
5956+ <translation>Skrivning avbruten av applikation</translation>
5957+ </message>
5958+ <message>
5959+ <source>Partial write. Partition full?</source>
5960+ <translation>Delvis skrivet. Är partitionen full?</translation>
5961+ </message>
5962+</context>
5963+<context>
5964+ <name>QtIOCompressor</name>
5965+ <message>
5966+ <source>Internal zlib error when compressing: </source>
5967+ <translation>Internt zlib fel vid komprimering:</translation>
5968+ </message>
5969+ <message>
5970+ <source>Error writing to underlying device: </source>
5971+ <translation>Fel vid skrivning till underliggande enhet:</translation>
5972+ </message>
5973+ <message>
5974+ <source>Error opening underlying device: </source>
5975+ <translation>Fel vid öppning av underliggande enhet:</translation>
5976+ </message>
5977+ <message>
5978+ <source>Error reading data from underlying device: </source>
5979+ <translation>Fel vid läsning från underliggande enhet:</translation>
5980+ </message>
5981+ <message>
5982+ <source>Internal zlib error when decompressing: </source>
5983+ <translation>Internt zlib fel vid extrahering:</translation>
5984+ </message>
5985+</context>
5986+<context>
5987+ <name>QtIOCompressor::open</name>
5988+ <message>
5989+ <source>The gzip format not supported in this version of zlib.</source>
5990+ <translation>Gzip formatet stöds inte av denna version av zlib.</translation>
5991+ </message>
5992+ <message>
5993+ <source>Internal zlib error: </source>
5994+ <translation>Internt zlib fel:</translation>
5995+ </message>
5996+</context>
5997+<context>
5998+ <name>SearchWidget</name>
5999+ <message>
6000+ <source>Find:</source>
6001+ <translation>Sök:</translation>
6002+ </message>
6003+ <message>
6004+ <source>Case sensitive</source>
6005+ <translation>Skiftlägeskänslig</translation>
6006+ </message>
6007+ <message>
6008+ <source>Current group</source>
6009+ <translation>Nuvarande grupp</translation>
6010+ </message>
6011+ <message>
6012+ <source>Root group</source>
6013+ <translation>Root grupp</translation>
6014+ </message>
6015+</context>
6016+<context>
6017+ <name>SettingsWidget</name>
6018+ <message>
6019+ <source>Application Settings</source>
6020+ <translation>Applikationsinställningar</translation>
6021+ </message>
6022+ <message>
6023+ <source>General</source>
6024+ <translation>Allmän</translation>
6025+ </message>
6026+ <message>
6027+ <source>Security</source>
6028+ <translation>Säkerhet</translation>
6029+ </message>
6030+</context>
6031+<context>
6032+ <name>SettingsWidgetGeneral</name>
6033+ <message>
6034+ <source>Remember last databases</source>
6035+ <translation>Komihåg senaste databasen</translation>
6036+ </message>
6037+ <message>
6038+ <source>Open previous databases on startup</source>
6039+ <translation>Öppna senaste databasen är programmet startar</translation>
6040+ </message>
6041+ <message>
6042+ <source>Mark as modified on expanded state changes</source>
6043+ <translation>Markera som ändrad när utökat läge ändras</translation>
6044+ </message>
6045+ <message>
6046+ <source>Automatically save on exit</source>
6047+ <translation>Spara automatiskt är applikationen anslutas</translation>
6048+ </message>
6049+ <message>
6050+ <source>Automatically save after every change</source>
6051+ <translation>Spara automatiskt efter varje ändring</translation>
6052+ </message>
6053+ <message>
6054+ <source>Minimize when copying to clipboard</source>
6055+ <translation>Minimera vid kopiering</translation>
6056+ </message>
6057+ <message>
6058+ <source>Use group icon on entry creation</source>
6059+ <translation>Använd gruppens ikon för nya poster</translation>
6060+ </message>
6061+ <message>
6062+ <source>Global Auto-Type shortcut</source>
6063+ <translation>Globalt auto-skriv kortkommando</translation>
6064+ </message>
6065+ <message>
6066+ <source>Use entry title to match windows for global auto-type</source>
6067+ <translation>Använda postens titel till matchning med fönster för globalt auto-skriv</translation>
6068+ </message>
6069+</context>
6070+<context>
6071+ <name>SettingsWidgetSecurity</name>
6072+ <message>
6073+ <source>Clear clipboard after</source>
6074+ <translation>Rensa urklipp efter</translation>
6075+ </message>
6076+ <message>
6077+ <source> sec</source>
6078+ <translation>sek</translation>
6079+ </message>
6080+ <message>
6081+ <source>Lock databases after inactivity of</source>
6082+ <translation>Lås databaser efter inaktivitet i</translation>
6083+ </message>
6084+ <message>
6085+ <source>Show passwords in cleartext by default</source>
6086+ <translation>Visa lösenord i klartext som standard</translation>
6087+ </message>
6088+ <message>
6089+ <source>Always ask before performing auto-type</source>
6090+ <translation>Fråga alltid innan auto-skriv utförs</translation>
6091+ </message>
6092+</context>
6093+<context>
6094+ <name>UnlockDatabaseWidget</name>
6095+ <message>
6096+ <source>Unlock database</source>
6097+ <translation>Lås upp databas</translation>
6098+ </message>
6099+ <message>
6100+ <source>Error</source>
6101+ <translation>Fel</translation>
6102+ </message>
6103+ <message>
6104+ <source>Wrong key.</source>
6105+ <translation>Fel lösenord</translation>
6106+ </message>
6107+</context>
6108+<context>
6109+ <name>WelcomeWidget</name>
6110+ <message>
6111+ <source>Welcome!</source>
6112+ <translation>Välkommen!</translation>
6113+ </message>
6114+</context>
6115+<context>
6116+ <name>main</name>
6117+ <message>
6118+ <source>KeePassX - cross-platform password manager</source>
6119+ <translation>KeePassX - plattformsoberoende lösenordshanterare</translation>
6120+ </message>
6121+ <message>
6122+ <source>filename of the password database to open (*.kdbx)</source>
6123+ <translation>namn på databas fil att öppna (*.kdbx)</translation>
6124+ </message>
6125+ <message>
6126+ <source>path to a custom config file</source>
6127+ <translation>Sökväg till egen konfigurations-fil</translation>
6128+ </message>
6129+ <message>
6130+ <source>password of the database (DANGEROUS!)</source>
6131+ <translation>lösenord för databasen (FARLIGT!)</translation>
6132+ </message>
6133+ <message>
6134+ <source>key file of the database</source>
6135+ <translation>nyckel-fil för databas</translation>
6136+ </message>
6137+</context>
6138+</TS>
6139\ No newline at end of file
6140diff --git a/share/translations/update.sh b/share/translations/update.sh
6141new file mode 100755
6142index 0000000..6828dc8
6143--- /dev/null
6144+++ b/share/translations/update.sh
6145@@ -0,0 +1,8 @@
6146+#!/bin/sh
6147+
6148+BASEDIR=$(dirname $0)
6149+
6150+cd $BASEDIR/../..
6151+
6152+lupdate -no-ui-lines -disable-heuristic similartext -locations none -no-obsolete src -ts share/translations/keepassx_en.ts
6153+lupdate -no-ui-lines -disable-heuristic similartext -locations none -pluralonly src -ts share/translations/keepassx_en_plurals.ts
6154diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
6155index d57153e..7ffc168 100644
6156--- a/src/CMakeLists.txt
6157+++ b/src/CMakeLists.txt
6158@@ -35,6 +35,7 @@ set(keepassx_SOURCES
6159 core/Entry.cpp
6160 core/EntryAttachments.cpp
6161 core/EntryAttributes.cpp
6162+ core/EntrySearcher.cpp
6163 core/FilePath.cpp
6164 core/Global.h
6165 core/Group.cpp
6166@@ -47,7 +48,9 @@ set(keepassx_SOURCES
6167 core/SignalMultiplexer.cpp
6168 core/TimeDelta.cpp
6169 core/TimeInfo.cpp
6170+ core/ToDbExporter.cpp
6171 core/Tools.cpp
6172+ core/Translator.cpp
6173 core/Uuid.cpp
6174 core/qcommandlineoption.cpp
6175 core/qcommandlineparser.cpp
6176@@ -73,6 +76,7 @@ set(keepassx_SOURCES
6177 gui/DatabaseSettingsWidget.cpp
6178 gui/DatabaseTabWidget.cpp
6179 gui/DatabaseWidget.cpp
6180+ gui/DatabaseWidgetStateSync.cpp
6181 gui/DialogyWidget.cpp
6182 gui/DragTabBar.cpp
6183 gui/EditWidget.cpp
6184@@ -154,6 +158,7 @@ set(keepassx_MOC
6185 gui/DatabaseSettingsWidget.h
6186 gui/DatabaseTabWidget.h
6187 gui/DatabaseWidget.h
6188+ gui/DatabaseWidgetStateSync.h
6189 gui/DialogyWidget.h
6190 gui/DragTabBar.h
6191 gui/EditWidget.h
6192diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp
6193index 5c28b4d..aac0c0c 100644
6194--- a/src/autotype/AutoType.cpp
6195+++ b/src/autotype/AutoType.cpp
6196@@ -23,12 +23,14 @@
6197 #include "autotype/AutoTypePlatformPlugin.h"
6198 #include "autotype/AutoTypeSelectDialog.h"
6199 #include "autotype/WildcardMatcher.h"
6200+#include "core/Config.h"
6201 #include "core/Database.h"
6202 #include "core/Entry.h"
6203 #include "core/FilePath.h"
6204 #include "core/Group.h"
6205 #include "core/ListDeleter.h"
6206 #include "core/Tools.h"
6207+#include "gui/MessageBox.h"
6208
6209 AutoType* AutoType::m_instance = Q_NULLPTR;
6210
6211@@ -188,8 +190,12 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList)
6212
6213 if (entryList.isEmpty()) {
6214 m_inAutoType = false;
6215+ QString message = tr("Couldn't find an entry that matches the window title:");
6216+ message.append("\n\n");
6217+ message.append(windowTitle);
6218+ MessageBox::information(Q_NULLPTR, tr("Auto-Type - KeePassX"), message);
6219 }
6220- else if (entryList.size() == 1) {
6221+ else if ((entryList.size() == 1) && !config()->get("security/autotypeask").toBool()) {
6222 m_inAutoType = false;
6223 performAutoType(entryList.first(), Q_NULLPTR, sequenceHash[entryList.first()]);
6224 }
6225@@ -499,6 +505,12 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl
6226 }
6227 }
6228
6229+ if (!match && config()->get("AutoTypeEntryTitleMatch").toBool() && !entry->title().isEmpty()
6230+ && windowTitle.contains(entry->title(), Qt::CaseInsensitive)) {
6231+ sequence = entry->defaultAutoTypeSequence();
6232+ match = true;
6233+ }
6234+
6235 if (!match) {
6236 return QString();
6237 }
6238diff --git a/src/autotype/x11/AutoTypeX11.cpp b/src/autotype/x11/AutoTypeX11.cpp
6239index 06a1e32..843fbfa 100644
6240--- a/src/autotype/x11/AutoTypeX11.cpp
6241+++ b/src/autotype/x11/AutoTypeX11.cpp
6242@@ -209,23 +209,26 @@ QString AutoTypePlatformX11::windowTitle(Window window, bool useBlacklist)
6243 unsigned long after;
6244 unsigned char* data = Q_NULLPTR;
6245
6246+ // the window manager spec says we should read _NET_WM_NAME first, then fall back to WM_NAME
6247+
6248 int retVal = XGetWindowProperty(m_dpy, window, m_atomNetWmName, 0, 1000, false, m_atomUtf8String,
6249 &type, &format, &nitems, &after, &data);
6250
6251- if (retVal != 0 && data) {
6252+ if ((retVal == 0) && data) {
6253 title = QString::fromUtf8(reinterpret_cast<char*>(data));
6254 }
6255 else {
6256 XTextProperty textProp;
6257 retVal = XGetTextProperty(m_dpy, window, &textProp, m_atomWmName);
6258- if (retVal != 0 && textProp.value) {
6259+ if ((retVal != 0) && textProp.value) {
6260 char** textList = Q_NULLPTR;
6261 int count;
6262
6263 if (textProp.encoding == m_atomUtf8String) {
6264 title = QString::fromUtf8(reinterpret_cast<char*>(textProp.value));
6265 }
6266- else if (XmbTextPropertyToTextList(m_dpy, &textProp, &textList, &count) == 0 && textList && count > 0) {
6267+ else if ((XmbTextPropertyToTextList(m_dpy, &textProp, &textList, &count) == 0)
6268+ && textList && (count > 0)) {
6269 title = QString::fromLocal8Bit(textList[0]);
6270 }
6271 else if (textProp.encoding == m_atomString) {
6272diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake
6273index 9a3f495..805700a 100644
6274--- a/src/config-keepassx.h.cmake
6275+++ b/src/config-keepassx.h.cmake
6276@@ -6,6 +6,7 @@
6277 #define KEEPASSX_VERSION "${KEEPASSX_VERSION}"
6278
6279 #define KEEPASSX_SOURCE_DIR "${CMAKE_SOURCE_DIR}"
6280+#define KEEPASSX_BINARY_DIR "${CMAKE_BINARY_DIR}"
6281
6282 #define KEEPASSX_PLUGIN_DIR "${PLUGIN_INSTALL_DIR}"
6283
6284diff --git a/src/core/Config.cpp b/src/core/Config.cpp
6285index 3cb7634..03b5129 100644
6286--- a/src/core/Config.cpp
6287+++ b/src/core/Config.cpp
6288@@ -71,7 +71,8 @@ Config::Config(QObject* parent)
6289 userPath += "/keepassx/";
6290 #else
6291 userPath = QDir::fromNativeSeparators(QDesktopServices::storageLocation(QDesktopServices::DataLocation));
6292- // storageLocation() appends the application name ("/keepassx/") to the end
6293+ // storageLocation() appends the application name ("/keepassx") to the end
6294+ userPath += "/";
6295 #endif
6296
6297 userPath += "keepassx2.ini";
6298@@ -94,11 +95,17 @@ void Config::init(const QString& fileName)
6299 m_defaults.insert("AutoSaveOnExit", false);
6300 m_defaults.insert("ShowToolbar", true);
6301 m_defaults.insert("MinimizeOnCopy", false);
6302+ m_defaults.insert("UseGroupIconOnEntryCreation", false);
6303+ m_defaults.insert("AutoTypeEntryTitleMatch", true);
6304 m_defaults.insert("security/clearclipboard", true);
6305 m_defaults.insert("security/clearclipboardtimeout", 10);
6306 m_defaults.insert("security/lockdatabaseidle", false);
6307 m_defaults.insert("security/lockdatabaseidlesec", 10);
6308 m_defaults.insert("security/passwordscleartext", false);
6309+ m_defaults.insert("security/autotypeask", true);
6310+ m_defaults.insert("GUI/Language", "system");
6311+ m_defaults.insert("GUI/ShowTrayIcon", false);
6312+ m_defaults.insert("GUI/MinimizeToTray", false);
6313 }
6314
6315 Config* Config::instance()
6316@@ -110,7 +117,7 @@ Config* Config::instance()
6317 return m_instance;
6318 }
6319
6320-void Config::createConfigFromFile(QString file)
6321+void Config::createConfigFromFile(const QString& file)
6322 {
6323 Q_ASSERT(!m_instance);
6324 m_instance = new Config(file, qApp);
6325diff --git a/src/core/Config.h b/src/core/Config.h
6326index ee30826..ca0f74c 100644
6327--- a/src/core/Config.h
6328+++ b/src/core/Config.h
6329@@ -36,7 +36,7 @@ public:
6330 void set(const QString& key, const QVariant& value);
6331
6332 static Config* instance();
6333- static void createConfigFromFile(QString file);
6334+ static void createConfigFromFile(const QString& file);
6335 static void createTempFileInstance();
6336
6337 private:
6338diff --git a/src/core/Database.cpp b/src/core/Database.cpp
6339index 0394051..4c888ea 100644
6340--- a/src/core/Database.cpp
6341+++ b/src/core/Database.cpp
6342@@ -37,7 +37,7 @@ Database::Database()
6343 {
6344 m_data.cipher = KeePass2::CIPHER_AES;
6345 m_data.compressionAlgo = CompressionGZip;
6346- m_data.transformRounds = 50000;
6347+ m_data.transformRounds = 100000;
6348 m_data.hasKey = false;
6349
6350 setRootGroup(new Group());
6351diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp
6352index 55f5432..4f97791 100644
6353--- a/src/core/Entry.cpp
6354+++ b/src/core/Entry.cpp
6355@@ -579,25 +579,6 @@ const Database* Entry::database() const
6356 }
6357 }
6358
6359-bool Entry::match(const QString& searchTerm, Qt::CaseSensitivity caseSensitivity)
6360-{
6361- QStringList wordList = searchTerm.split(QRegExp("\\s"), QString::SkipEmptyParts);
6362- Q_FOREACH (const QString& word, wordList) {
6363- if (!wordMatch(word, caseSensitivity)) {
6364- return false;
6365- }
6366- }
6367- return true;
6368-}
6369-
6370-bool Entry::wordMatch(const QString& word, Qt::CaseSensitivity caseSensitivity)
6371-{
6372- return title().contains(word, caseSensitivity) ||
6373- username().contains(word, caseSensitivity) ||
6374- url().contains(word, caseSensitivity) ||
6375- notes().contains(word, caseSensitivity);
6376-}
6377-
6378 QString Entry::resolvePlaceholders(const QString& str) const
6379 {
6380 QString result = str;
6381diff --git a/src/core/Entry.h b/src/core/Entry.h
6382index c2c2938..ae07ed4 100644
6383--- a/src/core/Entry.h
6384+++ b/src/core/Entry.h
6385@@ -141,7 +141,6 @@ public:
6386 void setGroup(Group* group);
6387
6388 void setUpdateTimeinfo(bool value);
6389- bool match(const QString& searchTerm, Qt::CaseSensitivity caseSensitivity);
6390
6391 Q_SIGNALS:
6392 /**
6393@@ -157,7 +156,6 @@ private Q_SLOTS:
6394 void updateModifiedSinceBegin();
6395
6396 private:
6397- bool wordMatch(const QString& word, Qt::CaseSensitivity caseSensitivity);
6398 const Database* database() const;
6399 template <class T> bool set(T& property, const T& value);
6400
6401diff --git a/src/core/EntrySearcher.cpp b/src/core/EntrySearcher.cpp
6402new file mode 100644
6403index 0000000..82a553e
6404--- /dev/null
6405+++ b/src/core/EntrySearcher.cpp
6406@@ -0,0 +1,65 @@
6407+/*
6408+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
6409+ *
6410+ * This program is free software: you can redistribute it and/or modify
6411+ * it under the terms of the GNU General Public License as published by
6412+ * the Free Software Foundation, either version 2 or (at your option)
6413+ * version 3 of the License.
6414+ *
6415+ * This program is distributed in the hope that it will be useful,
6416+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6417+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6418+ * GNU General Public License for more details.
6419+ *
6420+ * You should have received a copy of the GNU General Public License
6421+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
6422+ */
6423+
6424+#include "EntrySearcher.h"
6425+
6426+#include "core/Group.h"
6427+
6428+QList<Entry*> EntrySearcher::search(const QString &searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity)
6429+{
6430+ if (!group->resolveSearchingEnabled()) {
6431+ return QList<Entry*>();
6432+ }
6433+
6434+ return searchEntries(searchTerm, group, caseSensitivity);
6435+}
6436+
6437+QList<Entry*> EntrySearcher::searchEntries(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity)
6438+{
6439+ QList<Entry*> searchResult;
6440+
6441+ Q_FOREACH (Entry* entry, group->entries()) {
6442+ searchResult.append(matchEntry(searchTerm, entry, caseSensitivity));
6443+ }
6444+ Q_FOREACH (Group* childGroup, group->children()) {
6445+ if (childGroup->searchingEnabled() != Group::Disable) {
6446+ searchResult.append(searchEntries(searchTerm, childGroup, caseSensitivity));
6447+ }
6448+ }
6449+
6450+ return searchResult;
6451+}
6452+
6453+QList<Entry*> EntrySearcher::matchEntry(const QString& searchTerm, Entry* entry, Qt::CaseSensitivity caseSensitivity)
6454+{
6455+ QStringList wordList = searchTerm.split(QRegExp("\\s"), QString::SkipEmptyParts);
6456+ Q_FOREACH (const QString& word, wordList) {
6457+ if (!wordMatch(word, entry, caseSensitivity)) {
6458+ return QList<Entry*>();
6459+ }
6460+ }
6461+
6462+ return QList<Entry*>() << entry;
6463+}
6464+
6465+bool EntrySearcher::wordMatch(const QString& word, Entry* entry, Qt::CaseSensitivity caseSensitivity)
6466+{
6467+ return entry->title().contains(word, caseSensitivity) ||
6468+ entry->username().contains(word, caseSensitivity) ||
6469+ entry->url().contains(word, caseSensitivity) ||
6470+ entry->notes().contains(word, caseSensitivity);
6471+}
6472diff --git a/src/core/EntrySearcher.h b/src/core/EntrySearcher.h
6473new file mode 100644
6474index 0000000..246538c
6475--- /dev/null
6476+++ b/src/core/EntrySearcher.h
6477@@ -0,0 +1,37 @@
6478+/*
6479+ * Copyright (C) 2014 Florian Geyer <debfx@fobos.de>
6480+ *
6481+ * This program is free software: you can redistribute it and/or modify
6482+ * it under the terms of the GNU General Public License as published by
6483+ * the Free Software Foundation, either version 2 or (at your option)
6484+ * version 3 of the License.
6485+ *
6486+ * This program is distributed in the hope that it will be useful,
6487+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6488+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6489+ * GNU General Public License for more details.
6490+ *
6491+ * You should have received a copy of the GNU General Public License
6492+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
6493+ */
6494+
6495+#ifndef KEEPASSX_ENTRYSEARCHER_H
6496+#define KEEPASSX_ENTRYSEARCHER_H
6497+
6498+#include <QString>
6499+
6500+
6501+class Group;
6502+class Entry;
6503+
6504+class EntrySearcher
6505+{
6506+public:
6507+ QList<Entry*> search(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity);
6508+private:
6509+ QList<Entry*> searchEntries(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity);
6510+ QList<Entry*> matchEntry(const QString& searchTerm, Entry* entry, Qt::CaseSensitivity caseSensitivity);
6511+ bool wordMatch(const QString &word, Entry *entry, Qt::CaseSensitivity caseSensitivity);
6512+};
6513+
6514+#endif // KEEPASSX_ENTRYSEARCHER_H
6515diff --git a/src/core/Exporter.h b/src/core/Exporter.h
6516new file mode 100644
6517index 0000000..dedb1c8
6518--- /dev/null
6519+++ b/src/core/Exporter.h
6520@@ -0,0 +1,14 @@
6521+#ifndef KEEPASSX_EXPORTER_H
6522+#define KEEPASSX_EXPORTER_H
6523+
6524+class Database;
6525+class Group;
6526+
6527+class Exporter
6528+{
6529+public:
6530+ virtual Database* exportGroup(Group* group) = 0;
6531+ virtual ~Exporter() {}
6532+};
6533+
6534+#endif // KEEPASSX_EXPORTER_H
6535diff --git a/src/core/Group.cpp b/src/core/Group.cpp
6536index ada9e97..517f8cb 100644
6537--- a/src/core/Group.cpp
6538+++ b/src/core/Group.cpp
6539@@ -500,22 +500,6 @@ void Group::copyDataFrom(const Group* other)
6540 m_lastTopVisibleEntry = other->m_lastTopVisibleEntry;
6541 }
6542
6543-Database* Group::exportToDb()
6544-{
6545- Q_ASSERT(database());
6546-
6547- Database* db = new Database();
6548- Group* clonedGroup = clone(Entry::CloneNewUuid | Entry::CloneIncludeHistory);
6549- clonedGroup->setParent(db->rootGroup());
6550-
6551- QSet<Uuid> customIcons = customIconsRecursive();
6552- db->metadata()->copyCustomIcons(customIcons, database()->metadata());
6553-
6554- db->copyAttributesFrom(database());
6555-
6556- return db;
6557-}
6558-
6559 void Group::addEntry(Entry* entry)
6560 {
6561 Q_ASSERT(entry);
6562@@ -612,37 +596,35 @@ void Group::recCreateDelObjects()
6563 }
6564 }
6565
6566-QList<Entry*> Group::search(const QString& searchTerm, Qt::CaseSensitivity caseSensitivity,
6567- bool resolveInherit)
6568+bool Group::resolveSearchingEnabled() const
6569 {
6570- QList<Entry*> searchResult;
6571- if (includeInSearch(resolveInherit)) {
6572- Q_FOREACH (Entry* entry, m_entries) {
6573- if (entry->match(searchTerm, caseSensitivity)) {
6574- searchResult.append(entry);
6575- }
6576+ switch (m_data.searchingEnabled) {
6577+ case Inherit:
6578+ if (!m_parent) {
6579+ return true;
6580 }
6581- Q_FOREACH (Group* group, m_children) {
6582- searchResult.append(group->search(searchTerm, caseSensitivity, false));
6583+ else {
6584+ return m_parent->resolveSearchingEnabled();
6585 }
6586+ case Enable:
6587+ return true;
6588+ case Disable:
6589+ return false;
6590+ default:
6591+ Q_ASSERT(false);
6592+ return false;
6593 }
6594- return searchResult;
6595 }
6596
6597-bool Group::includeInSearch(bool resolveInherit)
6598+bool Group::resolveAutoTypeEnabled() const
6599 {
6600- switch (m_data.searchingEnabled) {
6601+ switch (m_data.autoTypeEnabled) {
6602 case Inherit:
6603 if (!m_parent) {
6604 return true;
6605 }
6606 else {
6607- if (resolveInherit) {
6608- return m_parent->includeInSearch(true);
6609- }
6610- else {
6611- return true;
6612- }
6613+ return m_parent->resolveAutoTypeEnabled();
6614 }
6615 case Enable:
6616 return true;
6617diff --git a/src/core/Group.h b/src/core/Group.h
6618index 558bebc..7391f88 100644
6619--- a/src/core/Group.h
6620+++ b/src/core/Group.h
6621@@ -65,6 +65,8 @@ public:
6622 QString defaultAutoTypeSequence() const;
6623 Group::TriState autoTypeEnabled() const;
6624 Group::TriState searchingEnabled() const;
6625+ bool resolveSearchingEnabled() const;
6626+ bool resolveAutoTypeEnabled() const;
6627 Entry* lastTopVisibleEntry() const;
6628 bool isExpired() const;
6629
6630@@ -109,10 +111,6 @@ public:
6631 */
6632 Group* clone(Entry::CloneFlags entryFlags = Entry::CloneNewUuid | Entry::CloneResetTimeInfo) const;
6633 void copyDataFrom(const Group* other);
6634- Database* exportToDb();
6635-
6636- QList<Entry*> search(const QString& searchTerm, Qt::CaseSensitivity caseSensitivity,
6637- bool resolveInherit = true);
6638
6639 Q_SIGNALS:
6640 void dataChanged(Group* group);
6641@@ -147,7 +145,6 @@ private:
6642 void cleanupParent();
6643 void recCreateDelObjects();
6644 void updateTimeinfo();
6645- bool includeInSearch(bool resolveInherit);
6646
6647 QPointer<Database> m_db;
6648 Uuid m_uuid;
6649diff --git a/src/core/ToDbExporter.cpp b/src/core/ToDbExporter.cpp
6650new file mode 100644
6651index 0000000..1f76fb7
6652--- /dev/null
6653+++ b/src/core/ToDbExporter.cpp
6654@@ -0,0 +1,39 @@
6655+/*
6656+ * Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
6657+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
6658+ *
6659+ * This program is free software: you can redistribute it and/or modify
6660+ * it under the terms of the GNU General Public License as published by
6661+ * the Free Software Foundation, either version 2 or (at your option)
6662+ * version 3 of the License.
6663+ *
6664+ * This program is distributed in the hope that it will be useful,
6665+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6666+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6667+ * GNU General Public License for more details.
6668+ *
6669+ * You should have received a copy of the GNU General Public License
6670+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
6671+ */
6672+
6673+#include "ToDbExporter.h"
6674+#include "core/Database.h"
6675+#include "core/Group.h"
6676+#include "core/Metadata.h"
6677+
6678+Database* ToDbExporter::exportGroup(Group* group)
6679+{
6680+ Database* oldDb = group->database();
6681+ Q_ASSERT(oldDb);
6682+
6683+ Database* db = new Database();
6684+ Group* clonedGroup = group->clone(Entry::CloneNewUuid | Entry::CloneIncludeHistory);
6685+ clonedGroup->setParent(db->rootGroup());
6686+
6687+ QSet<Uuid> customIcons = group->customIconsRecursive();
6688+ db->metadata()->copyCustomIcons(customIcons, oldDb->metadata());
6689+
6690+ db->copyAttributesFrom(oldDb);
6691+
6692+ return db;
6693+}
6694diff --git a/src/core/ToDbExporter.h b/src/core/ToDbExporter.h
6695new file mode 100644
6696index 0000000..58c5efe
6697--- /dev/null
6698+++ b/src/core/ToDbExporter.h
6699@@ -0,0 +1,33 @@
6700+/*
6701+ * Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
6702+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
6703+ *
6704+ * This program is free software: you can redistribute it and/or modify
6705+ * it under the terms of the GNU General Public License as published by
6706+ * the Free Software Foundation, either version 2 or (at your option)
6707+ * version 3 of the License.
6708+ *
6709+ * This program is distributed in the hope that it will be useful,
6710+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6711+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6712+ * GNU General Public License for more details.
6713+ *
6714+ * You should have received a copy of the GNU General Public License
6715+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
6716+ */
6717+
6718+#ifndef KEEPASSX_TODBEXPORTER_H
6719+#define KEEPASSX_TODBEXPORTER_H
6720+
6721+#include "core/Exporter.h"
6722+
6723+class Database;
6724+class Group;
6725+
6726+class ToDbExporter : Exporter
6727+{
6728+public:
6729+ Database* exportGroup(Group* group);
6730+};
6731+
6732+#endif // KEEPASSX_TODBEXPORTER_H
6733diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp
6734new file mode 100644
6735index 0000000..bc4d2b6
6736--- /dev/null
6737+++ b/src/core/Translator.cpp
6738@@ -0,0 +1,120 @@
6739+/*
6740+ * Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
6741+ *
6742+ * This program is free software: you can redistribute it and/or modify
6743+ * it under the terms of the GNU General Public License as published by
6744+ * the Free Software Foundation, either version 2 or (at your option)
6745+ * version 3 of the License.
6746+ *
6747+ * This program is distributed in the hope that it will be useful,
6748+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6749+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6750+ * GNU General Public License for more details.
6751+ *
6752+ * You should have received a copy of the GNU General Public License
6753+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
6754+ */
6755+
6756+#include "Translator.h"
6757+
6758+#include <QCoreApplication>
6759+#include <QDir>
6760+#include <QLibraryInfo>
6761+#include <QLocale>
6762+#include <QRegExp>
6763+#include <QTranslator>
6764+
6765+#include "config-keepassx.h"
6766+#include "core/Config.h"
6767+#include "core/FilePath.h"
6768+
6769+void Translator::installTranslator()
6770+{
6771+ QString language = config()->get("GUI/Language").toString();
6772+ if (language == "system" || language.isEmpty()) {
6773+ language = QLocale::system().name();
6774+ }
6775+
6776+ if (!installTranslator(language)) {
6777+ // English fallback still needs translations for plurals
6778+ if (!installTranslator("en_plurals")) {
6779+ qWarning("Couldn't load translations.");
6780+ }
6781+ }
6782+
6783+ installQtTranslator(language);
6784+
6785+ availableLanguages();
6786+}
6787+
6788+QList<QPair<QString, QString> > Translator::availableLanguages()
6789+{
6790+ QStringList paths;
6791+#ifdef QT_DEBUG
6792+ paths.append(QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR));
6793+#endif
6794+ paths.append(filePath()->dataPath("translations"));
6795+
6796+ QList<QPair<QString, QString> > languages;
6797+ languages.append(QPair<QString, QString>("system", "System default"));
6798+
6799+ QRegExp regExp("keepassx_([a-zA-Z_]+)\\.qm", Qt::CaseInsensitive, QRegExp::RegExp2);
6800+ Q_FOREACH (const QString& path, paths) {
6801+ Q_FOREACH (const QString& filename, QDir(path).entryList()) {
6802+ if (regExp.exactMatch(filename)) {
6803+ QString langcode = regExp.cap(1);
6804+ if (langcode == "en_plurals") {
6805+ langcode = "en";
6806+ }
6807+
6808+ languages.append(QPair<QString, QString>(langcode,
6809+ QLocale::languageToString(QLocale(langcode).language())));
6810+ }
6811+ }
6812+ }
6813+
6814+ return languages;
6815+}
6816+
6817+bool Translator::installTranslator(const QString& language)
6818+{
6819+ QStringList paths;
6820+#ifdef QT_DEBUG
6821+ paths.append(QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR));
6822+#endif
6823+ paths.append(filePath()->dataPath("translations"));
6824+
6825+ Q_FOREACH (const QString& path, paths) {
6826+ if (installTranslator(language, path)) {
6827+ return true;
6828+ }
6829+ }
6830+
6831+ return false;
6832+}
6833+
6834+bool Translator::installTranslator(const QString& language, const QString& path)
6835+{
6836+ QTranslator* translator = new QTranslator(qApp);
6837+ if (translator->load(QString("keepassx_").append(language), path)) {
6838+ QCoreApplication::installTranslator(translator);
6839+ return true;
6840+ }
6841+ else {
6842+ delete translator;
6843+ return false;
6844+ }
6845+}
6846+
6847+bool Translator::installQtTranslator(const QString& language)
6848+{
6849+ QTranslator* qtTranslator = new QTranslator(qApp);
6850+ if (qtTranslator->load(QString("%1/qt_%2").arg(QLibraryInfo::location(QLibraryInfo::TranslationsPath), language))) {
6851+ QCoreApplication::installTranslator(qtTranslator);
6852+ return true;
6853+ }
6854+ else {
6855+ delete qtTranslator;
6856+ return false;
6857+ }
6858+}
6859diff --git a/src/core/Translator.h b/src/core/Translator.h
6860new file mode 100644
6861index 0000000..4bc4fca
6862--- /dev/null
6863+++ b/src/core/Translator.h
6864@@ -0,0 +1,36 @@
6865+/*
6866+ * Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
6867+ *
6868+ * This program is free software: you can redistribute it and/or modify
6869+ * it under the terms of the GNU General Public License as published by
6870+ * the Free Software Foundation, either version 2 or (at your option)
6871+ * version 3 of the License.
6872+ *
6873+ * This program is distributed in the hope that it will be useful,
6874+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6875+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6876+ * GNU General Public License for more details.
6877+ *
6878+ * You should have received a copy of the GNU General Public License
6879+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
6880+ */
6881+
6882+#ifndef KEEPASSX_TRANSLATOR_H
6883+#define KEEPASSX_TRANSLATOR_H
6884+
6885+#include <QPair>
6886+#include <QString>
6887+
6888+class Translator
6889+{
6890+public:
6891+ static void installTranslator();
6892+ static QList<QPair<QString, QString> > availableLanguages();
6893+
6894+private:
6895+ static bool installTranslator(const QString& language);
6896+ static bool installTranslator(const QString& language, const QString& path);
6897+ static bool installQtTranslator(const QString& language);
6898+};
6899+
6900+#endif // KEEPASSX_TRANSLATOR_H
6901diff --git a/src/crypto/Crypto.cpp b/src/crypto/Crypto.cpp
6902index 1e28002..13c3c20 100644
6903--- a/src/crypto/Crypto.cpp
6904+++ b/src/crypto/Crypto.cpp
6905@@ -21,7 +21,12 @@
6906
6907 #include <gcrypt.h>
6908
6909+#include "config-keepassx.h"
6910+#include "crypto/CryptoHash.h"
6911+#include "crypto/SymmetricCipher.h"
6912+
6913 bool Crypto::m_initalized(false);
6914+QString Crypto::m_errorStr;
6915
6916 #if !defined(GCRYPT_VERSION_NUMBER) || (GCRYPT_VERSION_NUMBER < 0x010600)
6917 static int gcry_qt_mutex_init(void** p_sys)
6918@@ -64,11 +69,11 @@ Crypto::Crypto()
6919 {
6920 }
6921
6922-void Crypto::init()
6923+bool Crypto::init()
6924 {
6925 if (m_initalized) {
6926 qWarning("Crypto::init: already initalized");
6927- return;
6928+ return true;
6929 }
6930
6931 // libgcrypt >= 1.6 doesn't allow custom thread callbacks anymore.
6932@@ -78,7 +83,19 @@ void Crypto::init()
6933 gcry_check_version(0);
6934 gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
6935
6936+ if (!checkAlgorithms()) {
6937+ return false;
6938+ }
6939+
6940+ // has to be set before testing Crypto classes
6941 m_initalized = true;
6942+
6943+ if (!selfTest()) {
6944+ m_initalized = false;
6945+ return false;
6946+ }
6947+
6948+ return true;
6949 }
6950
6951 bool Crypto::initalized()
6952@@ -86,7 +103,89 @@ bool Crypto::initalized()
6953 return m_initalized;
6954 }
6955
6956-bool Crypto::selfTest()
6957+QString Crypto::errorString()
6958+{
6959+ return m_errorStr;
6960+}
6961+
6962+bool Crypto::backendSelfTest()
6963 {
6964 return (gcry_control(GCRYCTL_SELFTEST) == 0);
6965 }
6966+
6967+bool Crypto::checkAlgorithms()
6968+{
6969+ if (gcry_cipher_algo_info(GCRY_CIPHER_AES256, GCRYCTL_TEST_ALGO, Q_NULLPTR, Q_NULLPTR) != 0) {
6970+ m_errorStr = "GCRY_CIPHER_AES256 not found.";
6971+ qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr));
6972+ return false;
6973+ }
6974+ if (gcry_cipher_algo_info(GCRY_CIPHER_TWOFISH, GCRYCTL_TEST_ALGO, Q_NULLPTR, Q_NULLPTR) != 0) {
6975+ m_errorStr = "GCRY_CIPHER_TWOFISH not found.";
6976+ qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr));
6977+ return false;
6978+ }
6979+#ifdef GCRYPT_HAS_SALSA20
6980+ if (gcry_cipher_algo_info(GCRY_CIPHER_SALSA20, GCRYCTL_TEST_ALGO, Q_NULLPTR, Q_NULLPTR) != 0) {
6981+ m_errorStr = "GCRY_CIPHER_SALSA20 not found.";
6982+ qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr));
6983+ return false;
6984+ }
6985+#endif
6986+ if (gcry_md_test_algo(GCRY_MD_SHA256) != 0) {
6987+ m_errorStr = "GCRY_MD_SHA256 not found.";
6988+ qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr));
6989+ return false;
6990+ }
6991+
6992+ return true;
6993+}
6994+
6995+bool Crypto::selfTest()
6996+{
6997+ QByteArray sha256Test = CryptoHash::hash("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
6998+ CryptoHash::Sha256);
6999+
7000+ if (sha256Test != QByteArray::fromHex("248D6A61D20638B8E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1")) {
7001+ m_errorStr = "SHA-256 mismatch.";
7002+ qWarning("Crypto::selfTest: %s", qPrintable(m_errorStr));
7003+ return false;
7004+ }
7005+
7006+ QByteArray key = QByteArray::fromHex("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4");
7007+ QByteArray iv = QByteArray::fromHex("000102030405060708090a0b0c0d0e0f");
7008+ QByteArray plainText = QByteArray::fromHex("6bc1bee22e409f96e93d7e117393172a");
7009+ plainText.append(QByteArray::fromHex("ae2d8a571e03ac9c9eb76fac45af8e51"));
7010+ QByteArray cipherText = QByteArray::fromHex("f58c4c04d6e5f1ba779eabfb5f7bfbd6");
7011+ cipherText.append(QByteArray::fromHex("9cfc4e967edb808d679f777bc6702c7d"));
7012+
7013+ SymmetricCipher aes256Encrypt(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Encrypt, key, iv);
7014+ if (aes256Encrypt.process(plainText) != cipherText) {
7015+ m_errorStr = "AES-256 encryption mismatch.";
7016+ qWarning("Crypto::selfTest: %s", qPrintable(m_errorStr));
7017+ return false;
7018+ }
7019+
7020+ SymmetricCipher aes256Descrypt(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt, key, iv);
7021+ if (aes256Descrypt.process(cipherText) != plainText) {
7022+ m_errorStr = "AES-256 decryption mismatch.";
7023+ qWarning("Crypto::selfTest: %s", qPrintable(m_errorStr));
7024+ return false;
7025+ }
7026+
7027+ QByteArray salsa20Key = QByteArray::fromHex("F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112");
7028+ QByteArray salsa20iv = QByteArray::fromHex("0000000000000000");
7029+ QByteArray salsa20Plain = QByteArray::fromHex("00000000000000000000000000000000");
7030+ QByteArray salsa20Cipher = QByteArray::fromHex("B4C0AFA503BE7FC29A62058166D56F8F");
7031+
7032+ SymmetricCipher salsa20Stream(SymmetricCipher::Salsa20, SymmetricCipher::Stream,
7033+ SymmetricCipher::Encrypt, salsa20Key, salsa20iv);
7034+
7035+ if (salsa20Stream.process(salsa20Plain) != salsa20Cipher) {
7036+ m_errorStr = "Salsa20 stream cipher mismatch.";
7037+ qWarning("Crypto::selfTest: %s", qPrintable(m_errorStr));
7038+ return false;
7039+ }
7040+
7041+ return true;
7042+}
7043diff --git a/src/crypto/Crypto.h b/src/crypto/Crypto.h
7044index 63f1177..9926f14 100644
7045--- a/src/crypto/Crypto.h
7046+++ b/src/crypto/Crypto.h
7047@@ -18,18 +18,25 @@
7048 #ifndef KEEPASSX_CRYPTO_H
7049 #define KEEPASSX_CRYPTO_H
7050
7051+#include <QString>
7052+
7053 #include "core/Global.h"
7054
7055 class Crypto
7056 {
7057 public:
7058- static void init();
7059+ static bool init();
7060 static bool initalized();
7061- static bool selfTest();
7062+ static bool backendSelfTest();
7063+ static QString errorString();
7064
7065 private:
7066 Crypto();
7067+ static bool checkAlgorithms();
7068+ static bool selfTest();
7069+
7070 static bool m_initalized;
7071+ static QString m_errorStr;
7072 };
7073
7074 #endif // KEEPASSX_CRYPTO_H
7075diff --git a/src/gui/Clipboard.cpp b/src/gui/Clipboard.cpp
7076index eb77d2b..7d8f71f 100644
7077--- a/src/gui/Clipboard.cpp
7078+++ b/src/gui/Clipboard.cpp
7079@@ -51,6 +51,7 @@ void Clipboard::setText(const QString& text)
7080 if (config()->get("security/clearclipboard").toBool()) {
7081 int timeout = config()->get("security/clearclipboardtimeout").toInt();
7082 if (timeout > 0) {
7083+ m_lastCopied = text;
7084 m_timer->start(timeout * 1000);
7085 }
7086 }
7087@@ -65,8 +66,12 @@ void Clipboard::clearClipboard()
7088 return;
7089 }
7090
7091- clipboard->clear(QClipboard::Clipboard);
7092- if (clipboard->supportsSelection()) {
7093+ if (clipboard->text(QClipboard::Clipboard) == m_lastCopied) {
7094+ clipboard->clear(QClipboard::Clipboard);
7095+ }
7096+
7097+ if (clipboard->supportsSelection()
7098+ && (clipboard->text(QClipboard::Selection) == m_lastCopied)) {
7099 clipboard->clear(QClipboard::Selection);
7100 }
7101
7102@@ -74,6 +79,8 @@ void Clipboard::clearClipboard()
7103 QDBusMessage message = QDBusMessage::createMethodCall("org.kde.klipper", "/klipper", "", "clearClipboardHistory");
7104 QDBusConnection::sessionBus().send(message);
7105 #endif
7106+
7107+ m_lastCopied.clear();
7108 }
7109
7110 void Clipboard::cleanup()
7111diff --git a/src/gui/Clipboard.h b/src/gui/Clipboard.h
7112index bc2a19d..8b6ea69 100644
7113--- a/src/gui/Clipboard.h
7114+++ b/src/gui/Clipboard.h
7115@@ -43,6 +43,7 @@ private:
7116 static Clipboard* m_instance;
7117
7118 QTimer* m_timer;
7119+ QString m_lastCopied;
7120 };
7121
7122 inline Clipboard* clipboard() {
7123diff --git a/src/gui/DatabaseOpenWidget.cpp b/src/gui/DatabaseOpenWidget.cpp
7124index 9731925..37bbce7 100644
7125--- a/src/gui/DatabaseOpenWidget.cpp
7126+++ b/src/gui/DatabaseOpenWidget.cpp
7127@@ -117,8 +117,8 @@ void DatabaseOpenWidget::openDatabase()
7128 Q_EMIT editFinished(true);
7129 }
7130 else {
7131- MessageBox::warning(this, tr("Error"), tr("Unable to open the database.\n%1")
7132- .arg(reader.errorString()));
7133+ MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n")
7134+ .append(reader.errorString()));
7135 m_ui->editPassword->clear();
7136 }
7137 }
7138@@ -138,7 +138,7 @@ CompositeKey DatabaseOpenWidget::databaseKey()
7139 QString keyFilename = m_ui->comboKeyFile->currentText();
7140 QString errorMsg;
7141 if (!key.load(keyFilename, &errorMsg)) {
7142- MessageBox::warning(this, tr("Error"), tr("Can't open key file:\n%1").arg(errorMsg));
7143+ MessageBox::warning(this, tr("Error"), tr("Can't open key file").append(":\n").append(errorMsg));
7144 return CompositeKey();
7145 }
7146 masterKey.addKey(key);
7147diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp
7148index 8c2ba06..7f99846 100644
7149--- a/src/gui/DatabaseTabWidget.cpp
7150+++ b/src/gui/DatabaseTabWidget.cpp
7151@@ -27,6 +27,7 @@
7152 #include "core/Metadata.h"
7153 #include "core/qsavefile.h"
7154 #include "gui/DatabaseWidget.h"
7155+#include "gui/DatabaseWidgetStateSync.h"
7156 #include "gui/DragTabBar.h"
7157 #include "gui/FileDialog.h"
7158 #include "gui/MessageBox.h"
7159@@ -46,12 +47,15 @@ const int DatabaseTabWidget::LastDatabasesCount = 5;
7160
7161 DatabaseTabWidget::DatabaseTabWidget(QWidget* parent)
7162 : QTabWidget(parent)
7163+ , m_dbWidgetSateSync(new DatabaseWidgetStateSync(this))
7164 {
7165 DragTabBar* tabBar = new DragTabBar(this);
7166 tabBar->setDrawBase(false);
7167 setTabBar(tabBar);
7168
7169 connect(this, SIGNAL(tabCloseRequested(int)), SLOT(closeDatabase(int)));
7170+ connect(this, SIGNAL(currentChanged(int)), SLOT(emitActivateDatabaseChanged()));
7171+ connect(this, SIGNAL(activateDatabaseChanged(DatabaseWidget*)), m_dbWidgetSateSync, SLOT(setActive(DatabaseWidget*)));
7172 connect(autoType(), SIGNAL(globalShortcutTriggered()), SLOT(performGlobalAutoType()));
7173 }
7174
7175@@ -189,7 +193,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db)
7176 if (dbName.right(1) == "*") {
7177 dbName.chop(1);
7178 }
7179- if (dbStruct.dbWidget->currentMode() == DatabaseWidget::EditMode && db->hasKey()) {
7180+ if (dbStruct.dbWidget->isInEditMode() && db->hasKey()) {
7181 QMessageBox::StandardButton result =
7182 MessageBox::question(
7183 this, tr("Close?"),
7184@@ -503,7 +507,7 @@ DatabaseWidget* DatabaseTabWidget::currentDatabaseWidget()
7185 }
7186 }
7187
7188-bool DatabaseTabWidget::hasLockableDatabases()
7189+bool DatabaseTabWidget::hasLockableDatabases() const
7190 {
7191 QHashIterator<Database*, DatabaseManagerStruct> i(m_dbList);
7192 while (i.hasNext()) {
7193@@ -584,6 +588,11 @@ void DatabaseTabWidget::changeDatabase(Database* newDb)
7194 connectDatabase(newDb, oldDb);
7195 }
7196
7197+void DatabaseTabWidget::emitActivateDatabaseChanged()
7198+{
7199+ Q_EMIT activateDatabaseChanged(currentDatabaseWidget());
7200+}
7201+
7202 void DatabaseTabWidget::connectDatabase(Database* newDb, Database* oldDb)
7203 {
7204 if (oldDb) {
7205diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h
7206index 9261a06..25d34f3 100644
7207--- a/src/gui/DatabaseTabWidget.h
7208+++ b/src/gui/DatabaseTabWidget.h
7209@@ -25,6 +25,7 @@
7210 #include "gui/DatabaseWidget.h"
7211
7212 class DatabaseWidget;
7213+class DatabaseWidgetStateSync;
7214 class DatabaseOpenWidget;
7215 class QFile;
7216
7217@@ -53,7 +54,7 @@ public:
7218 void openDatabase(const QString& fileName, const QString& pw = QString(),
7219 const QString& keyFile = QString());
7220 DatabaseWidget* currentDatabaseWidget();
7221- bool hasLockableDatabases();
7222+ bool hasLockableDatabases() const;
7223
7224 static const int LastDatabasesCount;
7225
7226@@ -75,6 +76,7 @@ public Q_SLOTS:
7227 Q_SIGNALS:
7228 void tabNameChanged();
7229 void databaseWithFileClosed(QString filePath);
7230+ void activateDatabaseChanged(DatabaseWidget* dbWidget);
7231
7232 private Q_SLOTS:
7233 void updateTabName(Database* db);
7234@@ -83,6 +85,7 @@ private Q_SLOTS:
7235 void modified();
7236 void toggleTabbar();
7237 void changeDatabase(Database* newDb);
7238+ void emitActivateDatabaseChanged();
7239
7240 private:
7241 void saveDatabase(Database* db);
7242@@ -99,6 +102,7 @@ private:
7243
7244 KeePass2Writer m_writer;
7245 QHash<Database*, DatabaseManagerStruct> m_dbList;
7246+ DatabaseWidgetStateSync* m_dbWidgetSateSync;
7247 };
7248
7249 #endif // KEEPASSX_DATABASETABWIDGET_H
7250diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp
7251index 56ab8b6..cc9c5fd 100644
7252--- a/src/gui/DatabaseWidget.cpp
7253+++ b/src/gui/DatabaseWidget.cpp
7254@@ -28,7 +28,9 @@
7255
7256 #include "autotype/AutoType.h"
7257 #include "core/Config.h"
7258+#include "core/EntrySearcher.h"
7259 #include "core/FilePath.h"
7260+#include "core/Group.h"
7261 #include "core/Metadata.h"
7262 #include "core/Tools.h"
7263 #include "gui/ChangeMasterKeyWidget.h"
7264@@ -59,12 +61,13 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent)
7265
7266 m_mainWidget = new QWidget(this);
7267 QLayout* layout = new QHBoxLayout(m_mainWidget);
7268- QSplitter* splitter = new QSplitter(m_mainWidget);
7269+ m_splitter = new QSplitter(m_mainWidget);
7270+ m_splitter->setChildrenCollapsible(false);
7271
7272- QWidget* rightHandSideWidget = new QWidget(splitter);
7273+ QWidget* rightHandSideWidget = new QWidget(m_splitter);
7274 m_searchWidget->setParent(rightHandSideWidget);
7275
7276- m_groupView = new GroupView(db, splitter);
7277+ m_groupView = new GroupView(db, m_splitter);
7278 m_groupView->setObjectName("groupView");
7279 m_groupView->setContextMenuPolicy(Qt::CustomContextMenu);
7280 connect(m_groupView, SIGNAL(customContextMenuRequested(QPoint)),
7281@@ -77,14 +80,6 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent)
7282 connect(m_entryView, SIGNAL(customContextMenuRequested(QPoint)),
7283 SLOT(emitEntryContextMenuRequested(QPoint)));
7284
7285- QSizePolicy policy;
7286- policy = m_groupView->sizePolicy();
7287- policy.setHorizontalStretch(30);
7288- m_groupView->setSizePolicy(policy);
7289- policy = rightHandSideWidget->sizePolicy();
7290- policy.setHorizontalStretch(70);
7291- rightHandSideWidget->setSizePolicy(policy);
7292-
7293 QAction* closeAction = new QAction(m_searchWidget);
7294 QIcon closeIcon = filePath()->icon("actions", "dialog-close");
7295 closeAction->setIcon(closeIcon);
7296@@ -100,10 +95,17 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent)
7297
7298 rightHandSideWidget->setLayout(vLayout);
7299
7300- splitter->addWidget(m_groupView);
7301- splitter->addWidget(rightHandSideWidget);
7302+ setTabOrder(m_searchUi->searchRootRadioButton, m_entryView);
7303+ setTabOrder(m_entryView, m_groupView);
7304+ setTabOrder(m_groupView, m_searchWidget);
7305+
7306+ m_splitter->addWidget(m_groupView);
7307+ m_splitter->addWidget(rightHandSideWidget);
7308
7309- layout->addWidget(splitter);
7310+ m_splitter->setStretchFactor(0, 30);
7311+ m_splitter->setStretchFactor(1, 70);
7312+
7313+ layout->addWidget(m_splitter);
7314 m_mainWidget->setLayout(layout);
7315
7316 m_editEntryWidget = new EditEntryWidget();
7317@@ -135,6 +137,8 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent)
7318 addWidget(m_keepass1OpenWidget);
7319 addWidget(m_unlockDatabaseWidget);
7320
7321+ connect(m_splitter, SIGNAL(splitterMoved(int,int)), SIGNAL(splitterSizesChanged()));
7322+ connect(m_entryView->header(), SIGNAL(sectionResized(int,int,int)), SIGNAL(entryColumnSizesChanged()));
7323 connect(m_groupView, SIGNAL(groupChanged(Group*)), this, SLOT(clearLastGroup(Group*)));
7324 connect(m_groupView, SIGNAL(groupChanged(Group*)), SIGNAL(groupChanged()));
7325 connect(m_groupView, SIGNAL(groupChanged(Group*)), m_entryView, SLOT(setGroup(Group*)));
7326@@ -166,7 +170,7 @@ DatabaseWidget::~DatabaseWidget()
7327 {
7328 }
7329
7330-DatabaseWidget::Mode DatabaseWidget::currentMode()
7331+DatabaseWidget::Mode DatabaseWidget::currentMode() const
7332 {
7333 if (currentWidget() == Q_NULLPTR) {
7334 return DatabaseWidget::None;
7335@@ -182,19 +186,54 @@ DatabaseWidget::Mode DatabaseWidget::currentMode()
7336 }
7337 }
7338
7339-void DatabaseWidget::emitCurrentModeChanged()
7340+bool DatabaseWidget::isInEditMode() const
7341 {
7342- Q_EMIT currentModeChanged(currentMode());
7343+ if (currentMode() == DatabaseWidget::LockedMode) {
7344+ return m_widgetBeforeLock != Q_NULLPTR
7345+ && m_widgetBeforeLock != m_mainWidget
7346+ && m_widgetBeforeLock != m_unlockDatabaseWidget;
7347+ }
7348+ else {
7349+ return currentMode() == DatabaseWidget::EditMode;
7350+ }
7351 }
7352
7353-GroupView* DatabaseWidget::groupView()
7354+QList<int> DatabaseWidget::splitterSizes() const
7355 {
7356- return m_groupView;
7357+ return m_splitter->sizes();
7358 }
7359
7360-EntryView* DatabaseWidget::entryView()
7361+void DatabaseWidget::setSplitterSizes(const QList<int>& sizes)
7362 {
7363- return m_entryView;
7364+ m_splitter->setSizes(sizes);
7365+}
7366+
7367+QList<int> DatabaseWidget::entryHeaderViewSizes() const
7368+{
7369+ QList<int> sizes;
7370+
7371+ for (int i = 0; i < m_entryView->header()->count(); i++) {
7372+ sizes.append(m_entryView->header()->sectionSize(i));
7373+ }
7374+
7375+ return sizes;
7376+}
7377+
7378+void DatabaseWidget::setEntryViewHeaderSizes(const QList<int>& sizes)
7379+{
7380+ if (sizes.size() != m_entryView->header()->count()) {
7381+ Q_ASSERT(false);
7382+ return;
7383+ }
7384+
7385+ for (int i = 0; i < sizes.size(); i++) {
7386+ m_entryView->header()->resizeSection(i, sizes[i]);
7387+ }
7388+}
7389+
7390+void DatabaseWidget::emitCurrentModeChanged()
7391+{
7392+ Q_EMIT currentModeChanged(currentMode());
7393 }
7394
7395 Database* DatabaseWidget::database()
7396@@ -213,9 +252,28 @@ void DatabaseWidget::createEntry()
7397 m_newEntry->setUuid(Uuid::random());
7398 m_newEntry->setUsername(m_db->metadata()->defaultUserName());
7399 m_newParent = m_groupView->currentGroup();
7400+ setIconFromParent();
7401 switchToEntryEdit(m_newEntry, true);
7402 }
7403
7404+void DatabaseWidget::setIconFromParent()
7405+{
7406+ if (!config()->get("UseGroupIconOnEntryCreation").toBool()) {
7407+ return;
7408+ }
7409+
7410+ if (m_newParent->iconNumber() == Group::DefaultIconNumber && m_newParent->iconUuid().isNull()) {
7411+ return;
7412+ }
7413+
7414+ if (m_newParent->iconUuid().isNull()) {
7415+ m_newEntry->setIcon(m_newParent->iconNumber());
7416+ }
7417+ else {
7418+ m_newEntry->setIcon(m_newParent->iconUuid());
7419+ }
7420+}
7421+
7422 void DatabaseWidget::cloneEntry()
7423 {
7424 Entry* currentEntry = m_entryView->currentEntry();
7425@@ -274,8 +332,7 @@ void DatabaseWidget::deleteEntries()
7426 if (selected.size() > 1) {
7427 QMessageBox::StandardButton result = MessageBox::question(
7428 this, tr("Move entries to recycle bin?"),
7429- tr("Do you really want to move %1 entries to the recycle bin?")
7430- .arg(selected.size()),
7431+ tr("Do you really want to move %n entry(s) to the recycle bin?", 0, selected.size()),
7432 QMessageBox::Yes | QMessageBox::No);
7433 if (result == QMessageBox::No) {
7434 return;
7435@@ -407,7 +464,7 @@ void DatabaseWidget::createGroup()
7436 void DatabaseWidget::deleteGroup()
7437 {
7438 Group* currentGroup = m_groupView->currentGroup();
7439- if (!currentGroup || !canDeleteCurrentGoup()) {
7440+ if (!currentGroup || !canDeleteCurrentGroup()) {
7441 Q_ASSERT(false);
7442 return;
7443 }
7444@@ -575,7 +632,7 @@ void DatabaseWidget::unlockDatabase(bool accepted)
7445 Q_ASSERT(accepted);
7446 Q_UNUSED(accepted);
7447
7448- setCurrentWidget(widgetBeforeLock);
7449+ setCurrentWidget(m_widgetBeforeLock);
7450 Q_EMIT unlockedDatabase();
7451 }
7452
7453@@ -647,8 +704,16 @@ void DatabaseWidget::switchToImportKeepass1(const QString& fileName)
7454
7455 void DatabaseWidget::toggleSearch()
7456 {
7457- if (m_entryView->inEntryListMode()) {
7458- closeSearch();
7459+ if (isInSearchMode()) {
7460+ if (m_searchUi->searchEdit->hasFocus()) {
7461+ closeSearch();
7462+ }
7463+ else {
7464+ m_searchUi->searchEdit->selectAll();
7465+ m_searchUi->searchEdit->setFocus();
7466+ // make sure the search action is checked again
7467+ emitCurrentModeChanged();
7468+ }
7469 }
7470 else {
7471 showSearch();
7472@@ -658,11 +723,19 @@ void DatabaseWidget::toggleSearch()
7473 void DatabaseWidget::closeSearch()
7474 {
7475 Q_ASSERT(m_lastGroup);
7476+
7477+ Q_EMIT listModeAboutToActivate();
7478+
7479 m_groupView->setCurrentGroup(m_lastGroup);
7480+ m_searchTimer->stop();
7481+
7482+ Q_EMIT listModeActivated();
7483 }
7484
7485 void DatabaseWidget::showSearch()
7486 {
7487+ Q_EMIT searchModeAboutToActivate();
7488+
7489 m_searchUi->searchEdit->blockSignals(true);
7490 m_searchUi->searchEdit->clear();
7491 m_searchUi->searchEdit->blockSignals(false);
7492@@ -696,6 +769,8 @@ void DatabaseWidget::showSearch()
7493 m_searchWidget->show();
7494 search();
7495 m_searchUi->searchEdit->setFocus();
7496+
7497+ Q_EMIT searchModeActivated();
7498 }
7499
7500 void DatabaseWidget::search()
7501@@ -721,8 +796,8 @@ void DatabaseWidget::search()
7502 else {
7503 sensitivity = Qt::CaseInsensitive;
7504 }
7505- QList<Entry*> searchResult = searchGroup->search(m_searchUi->searchEdit->text(), sensitivity);
7506
7507+ QList<Entry*> searchResult = EntrySearcher().search(m_searchUi->searchEdit->text(), searchGroup, sensitivity);
7508
7509 m_entryView->setEntryList(searchResult);
7510 }
7511@@ -753,19 +828,19 @@ void DatabaseWidget::emitEntryContextMenuRequested(const QPoint& pos)
7512 Q_EMIT entryContextMenuRequested(m_entryView->viewport()->mapToGlobal(pos));
7513 }
7514
7515-bool DatabaseWidget::dbHasKey()
7516+bool DatabaseWidget::dbHasKey() const
7517 {
7518 return m_db->hasKey();
7519 }
7520
7521-bool DatabaseWidget::canDeleteCurrentGoup()
7522+bool DatabaseWidget::canDeleteCurrentGroup() const
7523 {
7524 bool isRootGroup = m_db->rootGroup() == m_groupView->currentGroup();
7525 bool isRecycleBin = m_db->metadata()->recycleBin() == m_groupView->currentGroup();
7526 return !isRootGroup && !isRecycleBin;
7527 }
7528
7529-bool DatabaseWidget::isInSearchMode()
7530+bool DatabaseWidget::isInSearchMode() const
7531 {
7532 return m_entryView->inEntryListMode();
7533 }
7534@@ -782,7 +857,7 @@ void DatabaseWidget::lock()
7535 {
7536 Q_ASSERT(currentMode() != DatabaseWidget::LockedMode);
7537
7538- widgetBeforeLock = currentWidget();
7539+ m_widgetBeforeLock = currentWidget();
7540 m_unlockDatabaseWidget->load(m_filename, m_db);
7541 setCurrentWidget(m_unlockDatabaseWidget);
7542 }
7543@@ -791,3 +866,23 @@ void DatabaseWidget::updateFilename(const QString& fileName)
7544 {
7545 m_filename = fileName;
7546 }
7547+
7548+int DatabaseWidget::numberOfSelectedEntries() const
7549+{
7550+ return m_entryView->numberOfSelectedEntries();
7551+}
7552+
7553+QStringList DatabaseWidget::customEntryAttributes() const
7554+{
7555+ Entry* entry = m_entryView->currentEntry();
7556+ if (!entry) {
7557+ return QStringList();
7558+ }
7559+
7560+ return entry->attributes()->customKeys();
7561+}
7562+
7563+bool DatabaseWidget::isGroupSelected() const
7564+{
7565+ return m_groupView->currentGroup() != Q_NULLPTR;
7566+}
7567diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h
7568index 240fe28..cbab175 100644
7569--- a/src/gui/DatabaseWidget.h
7570+++ b/src/gui/DatabaseWidget.h
7571@@ -38,6 +38,7 @@ class GroupView;
7572 class KeePass1OpenWidget;
7573 class QFile;
7574 class QMenu;
7575+class QSplitter;
7576 class UnlockDatabaseWidget;
7577
7578 namespace Ui {
7579@@ -59,18 +60,24 @@ public:
7580
7581 explicit DatabaseWidget(Database* db, QWidget* parent = Q_NULLPTR);
7582 ~DatabaseWidget();
7583- GroupView* groupView();
7584- EntryView* entryView();
7585 Database* database();
7586- bool dbHasKey();
7587- bool canDeleteCurrentGoup();
7588- bool isInSearchMode();
7589+ bool dbHasKey() const;
7590+ bool canDeleteCurrentGroup() const;
7591+ bool isInSearchMode() const;
7592 int addWidget(QWidget* w);
7593 void setCurrentIndex(int index);
7594 void setCurrentWidget(QWidget* widget);
7595- DatabaseWidget::Mode currentMode();
7596+ DatabaseWidget::Mode currentMode() const;
7597 void lock();
7598 void updateFilename(const QString& filename);
7599+ int numberOfSelectedEntries() const;
7600+ QStringList customEntryAttributes() const;
7601+ bool isGroupSelected() const;
7602+ bool isInEditMode() const;
7603+ QList<int> splitterSizes() const;
7604+ void setSplitterSizes(const QList<int>& sizes);
7605+ QList<int> entryHeaderViewSizes() const;
7606+ void setEntryViewHeaderSizes(const QList<int>& sizes);
7607
7608 Q_SIGNALS:
7609 void closeRequest();
7610@@ -81,6 +88,12 @@ Q_SIGNALS:
7611 void groupContextMenuRequested(const QPoint& globalPos);
7612 void entryContextMenuRequested(const QPoint& globalPos);
7613 void unlockedDatabase();
7614+ void listModeAboutToActivate();
7615+ void listModeActivated();
7616+ void searchModeAboutToActivate();
7617+ void searchModeActivated();
7618+ void splitterSizesChanged();
7619+ void entryColumnSizesChanged();
7620
7621 public Q_SLOTS:
7622 void createEntry();
7623@@ -105,8 +118,6 @@ public Q_SLOTS:
7624 void switchToOpenDatabase(const QString& fileName, const QString& password, const QString& keyFile);
7625 void switchToImportKeepass1(const QString& fileName);
7626 void toggleSearch();
7627- void emitGroupContextMenuRequested(const QPoint& pos);
7628- void emitEntryContextMenuRequested(const QPoint& pos);
7629
7630 private Q_SLOTS:
7631 void entryActivationSignalReceived(Entry* entry, EntryModel::ModelColumn column);
7632@@ -116,6 +127,8 @@ private Q_SLOTS:
7633 void switchToEntryEdit(Entry* entry);
7634 void switchToEntryEdit(Entry* entry, bool create);
7635 void switchToGroupEdit(Group* entry, bool create);
7636+ void emitGroupContextMenuRequested(const QPoint& pos);
7637+ void emitEntryContextMenuRequested(const QPoint& pos);
7638 void updateMasterKey(bool accepted);
7639 void openDatabase(bool accepted);
7640 void unlockDatabase(bool accepted);
7641@@ -129,6 +142,7 @@ private Q_SLOTS:
7642
7643 private:
7644 void setClipboardTextAndMinimize(const QString& text);
7645+ void setIconFromParent();
7646
7647 Database* m_db;
7648 const QScopedPointer<Ui::SearchWidget> m_searchUi;
7649@@ -142,6 +156,7 @@ private:
7650 DatabaseOpenWidget* m_databaseOpenWidget;
7651 KeePass1OpenWidget* m_keepass1OpenWidget;
7652 UnlockDatabaseWidget* m_unlockDatabaseWidget;
7653+ QSplitter* m_splitter;
7654 GroupView* m_groupView;
7655 EntryView* m_entryView;
7656 Group* m_newGroup;
7657@@ -149,7 +164,7 @@ private:
7658 Group* m_newParent;
7659 Group* m_lastGroup;
7660 QTimer* m_searchTimer;
7661- QWidget* widgetBeforeLock;
7662+ QWidget* m_widgetBeforeLock;
7663 QString m_filename;
7664 };
7665
7666diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp
7667new file mode 100644
7668index 0000000..66b8492
7669--- /dev/null
7670+++ b/src/gui/DatabaseWidgetStateSync.cpp
7671@@ -0,0 +1,154 @@
7672+/*
7673+ * Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
7674+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
7675+ *
7676+ * This program is free software: you can redistribute it and/or modify
7677+ * it under the terms of the GNU General Public License as published by
7678+ * the Free Software Foundation, either version 2 or (at your option)
7679+ * version 3 of the License.
7680+ *
7681+ * This program is distributed in the hope that it will be useful,
7682+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
7683+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7684+ * GNU General Public License for more details.
7685+ *
7686+ * You should have received a copy of the GNU General Public License
7687+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
7688+ */
7689+
7690+#include "DatabaseWidgetStateSync.h"
7691+
7692+#include "core/Config.h"
7693+
7694+DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent)
7695+ : QObject(parent)
7696+ , m_activeDbWidget(Q_NULLPTR)
7697+ , m_blockUpdates(false)
7698+{
7699+ m_splitterSizes = variantToIntList(config()->get("GUI/SplitterState"));
7700+ m_columnSizesList = variantToIntList(config()->get("GUI/EntryListColumnSizes"));
7701+ m_columnSizesSearch = variantToIntList(config()->get("GUI/EntrySearchColumnSizes"));
7702+}
7703+
7704+DatabaseWidgetStateSync::~DatabaseWidgetStateSync()
7705+{
7706+ config()->set("GUI/SplitterState", intListToVariant(m_splitterSizes));
7707+ config()->set("GUI/EntryListColumnSizes", intListToVariant(m_columnSizesList));
7708+ config()->set("GUI/EntrySearchColumnSizes", intListToVariant(m_columnSizesSearch));
7709+}
7710+
7711+void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget)
7712+{
7713+ if (m_activeDbWidget) {
7714+ disconnect(m_activeDbWidget, 0, this, 0);
7715+ }
7716+
7717+ m_activeDbWidget = dbWidget;
7718+
7719+ if (m_activeDbWidget) {
7720+ m_blockUpdates = true;
7721+
7722+ if (!m_splitterSizes.isEmpty()) {
7723+ m_activeDbWidget->setSplitterSizes(m_splitterSizes);
7724+ }
7725+
7726+ if (m_activeDbWidget->isGroupSelected()) {
7727+ restoreListView();
7728+ }
7729+ else {
7730+ restoreSearchView();
7731+ }
7732+
7733+ m_blockUpdates = false;
7734+
7735+ connect(m_activeDbWidget, SIGNAL(splitterSizesChanged()),
7736+ SLOT(updateSplitterSizes()));
7737+ connect(m_activeDbWidget, SIGNAL(entryColumnSizesChanged()),
7738+ SLOT(updateColumnSizes()));
7739+ connect(m_activeDbWidget, SIGNAL(listModeActivated()),
7740+ SLOT(restoreListView()));
7741+ connect(m_activeDbWidget, SIGNAL(searchModeActivated()),
7742+ SLOT(restoreSearchView()));
7743+ connect(m_activeDbWidget, SIGNAL(listModeAboutToActivate()),
7744+ SLOT(blockUpdates()));
7745+ connect(m_activeDbWidget, SIGNAL(searchModeAboutToActivate()),
7746+ SLOT(blockUpdates()));
7747+ }
7748+}
7749+
7750+void DatabaseWidgetStateSync::restoreListView()
7751+{
7752+ if (!m_columnSizesList.isEmpty()) {
7753+ m_activeDbWidget->setEntryViewHeaderSizes(m_columnSizesList);
7754+ }
7755+
7756+ m_blockUpdates = false;
7757+}
7758+
7759+void DatabaseWidgetStateSync::restoreSearchView()
7760+{
7761+ if (!m_columnSizesSearch.isEmpty()) {
7762+ m_activeDbWidget->setEntryViewHeaderSizes(m_columnSizesSearch);
7763+ }
7764+
7765+ m_blockUpdates = false;
7766+}
7767+
7768+void DatabaseWidgetStateSync::blockUpdates()
7769+{
7770+ m_blockUpdates = true;
7771+}
7772+
7773+void DatabaseWidgetStateSync::updateSplitterSizes()
7774+{
7775+ if (m_blockUpdates) {
7776+ return;
7777+ }
7778+
7779+ m_splitterSizes = m_activeDbWidget->splitterSizes();
7780+}
7781+
7782+void DatabaseWidgetStateSync::updateColumnSizes()
7783+{
7784+ if (m_blockUpdates) {
7785+ return;
7786+ }
7787+
7788+ if (m_activeDbWidget->isGroupSelected()) {
7789+ m_columnSizesList = m_activeDbWidget->entryHeaderViewSizes();
7790+ }
7791+ else {
7792+ m_columnSizesSearch = m_activeDbWidget->entryHeaderViewSizes();
7793+ }
7794+}
7795+
7796+QList<int> DatabaseWidgetStateSync::variantToIntList(const QVariant& variant)
7797+{
7798+ QVariantList list = variant.toList();
7799+ QList<int> result;
7800+
7801+ Q_FOREACH (const QVariant& var, list) {
7802+ bool ok;
7803+ int size = var.toInt(&ok);
7804+ if (ok) {
7805+ result.append(size);
7806+ }
7807+ else {
7808+ result.clear();
7809+ break;
7810+ }
7811+ }
7812+
7813+ return result;
7814+}
7815+
7816+QVariant DatabaseWidgetStateSync::intListToVariant(const QList<int>& list)
7817+{
7818+ QVariantList result;
7819+
7820+ Q_FOREACH (int value, list) {
7821+ result.append(value);
7822+ }
7823+
7824+ return result;
7825+}
7826diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h
7827new file mode 100644
7828index 0000000..f6a87cd
7829--- /dev/null
7830+++ b/src/gui/DatabaseWidgetStateSync.h
7831@@ -0,0 +1,54 @@
7832+/*
7833+ * Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
7834+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
7835+ *
7836+ * This program is free software: you can redistribute it and/or modify
7837+ * it under the terms of the GNU General Public License as published by
7838+ * the Free Software Foundation, either version 2 or (at your option)
7839+ * version 3 of the License.
7840+ *
7841+ * This program is distributed in the hope that it will be useful,
7842+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
7843+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7844+ * GNU General Public License for more details.
7845+ *
7846+ * You should have received a copy of the GNU General Public License
7847+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
7848+ */
7849+
7850+#ifndef KEEPASSX_HEADERVIEWSYNC_H
7851+#define KEEPASSX_HEADERVIEWSYNC_H
7852+
7853+#include "gui/DatabaseWidget.h"
7854+
7855+class DatabaseWidgetStateSync : public QObject
7856+{
7857+ Q_OBJECT
7858+
7859+public:
7860+ explicit DatabaseWidgetStateSync(QObject* parent = Q_NULLPTR);
7861+ ~DatabaseWidgetStateSync();
7862+
7863+public Q_SLOTS:
7864+ void setActive(DatabaseWidget* dbWidget);
7865+ void restoreListView();
7866+ void restoreSearchView();
7867+
7868+private Q_SLOTS:
7869+ void blockUpdates();
7870+ void updateSplitterSizes();
7871+ void updateColumnSizes();
7872+
7873+private:
7874+ static QList<int> variantToIntList(const QVariant& variant);
7875+ static QVariant intListToVariant(const QList<int>& list);
7876+
7877+ DatabaseWidget* m_activeDbWidget;
7878+
7879+ bool m_blockUpdates;
7880+ QList<int> m_splitterSizes;
7881+ QList<int> m_columnSizesList;
7882+ QList<int> m_columnSizesSearch;
7883+};
7884+
7885+#endif // KEEPASSX_HEADERVIEWSYNC_H
7886diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp
7887index 26314d3..9e85745 100644
7888--- a/src/gui/EditWidgetIcons.cpp
7889+++ b/src/gui/EditWidgetIcons.cpp
7890@@ -194,8 +194,7 @@ void EditWidgetIcons::removeCustomIcon()
7891 }
7892 else {
7893 MessageBox::information(this, tr("Can't delete icon!"),
7894- tr("Can't delete icon. Still used by %1 items.")
7895- .arg(iconUsedCount));
7896+ tr("Can't delete icon. Still used by %n item(s).", 0, iconUsedCount));
7897 }
7898 }
7899 }
7900diff --git a/src/gui/KeePass1OpenWidget.cpp b/src/gui/KeePass1OpenWidget.cpp
7901index 5f23d80..96ddf13 100644
7902--- a/src/gui/KeePass1OpenWidget.cpp
7903+++ b/src/gui/KeePass1OpenWidget.cpp
7904@@ -64,8 +64,8 @@ void KeePass1OpenWidget::openDatabase()
7905 Q_EMIT editFinished(true);
7906 }
7907 else {
7908- MessageBox::warning(this, tr("Error"), tr("Unable to open the database.\n%1")
7909- .arg(reader.errorString()));
7910+ MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n")
7911+ .append(reader.errorString()));
7912 m_ui->editPassword->clear();
7913 }
7914 }
7915diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp
7916index 36fb656..dd77989 100644
7917--- a/src/gui/MainWindow.cpp
7918+++ b/src/gui/MainWindow.cpp
7919@@ -23,24 +23,23 @@
7920
7921 #include "autotype/AutoType.h"
7922 #include "core/Config.h"
7923-#include "core/Database.h"
7924-#include "core/Entry.h"
7925 #include "core/FilePath.h"
7926 #include "core/InactivityTimer.h"
7927 #include "core/Metadata.h"
7928 #include "gui/AboutDialog.h"
7929 #include "gui/DatabaseWidget.h"
7930-#include "gui/entry/EntryView.h"
7931-#include "gui/group/GroupView.h"
7932
7933 const QString MainWindow::BaseWindowTitle = "KeePassX";
7934
7935 MainWindow::MainWindow()
7936 : m_ui(new Ui::MainWindow())
7937+ , m_trayIcon(Q_NULLPTR)
7938 {
7939 m_ui->setupUi(this);
7940
7941- restoreGeometry(config()->get("window/Geometry").toByteArray());
7942+ m_countDefaultAttributes = m_ui->menuEntryCopyAttribute->actions().size();
7943+
7944+ restoreGeometry(config()->get("GUI/MainWindowGeometry").toByteArray());
7945
7946 setWindowIcon(filePath()->applicationIcon());
7947 QAction* toggleViewAction = m_ui->toolBar->toggleViewAction();
7948@@ -203,6 +202,8 @@ MainWindow::MainWindow()
7949
7950 m_actionMultiplexer.connect(m_ui->actionSearch, SIGNAL(triggered()),
7951 SLOT(toggleSearch()));
7952+
7953+ updateTrayIcon();
7954 }
7955
7956 MainWindow::~MainWindow()
7957@@ -229,17 +230,16 @@ void MainWindow::updateCopyAttributesMenu()
7958 return;
7959 }
7960
7961- Entry* entry = dbWidget->entryView()->currentEntry();
7962- if (!entry || !dbWidget->entryView()->isSingleEntrySelected()) {
7963+ if (dbWidget->numberOfSelectedEntries() != 1) {
7964 return;
7965 }
7966
7967 QList<QAction*> actions = m_ui->menuEntryCopyAttribute->actions();
7968- for (int i = EntryAttributes::DefaultAttributes.size() + 1; i < actions.size(); i++) {
7969+ for (int i = m_countDefaultAttributes; i < actions.size(); i++) {
7970 delete actions[i];
7971 }
7972
7973- Q_FOREACH (const QString& key, entry->attributes()->customKeys()) {
7974+ Q_FOREACH (const QString& key, dbWidget->customEntryAttributes()) {
7975 QAction* action = m_ui->menuEntryCopyAttribute->addAction(key);
7976 m_copyAdditionalAttributeActions->addAction(action);
7977 }
7978@@ -276,9 +276,9 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
7979 switch (mode) {
7980 case DatabaseWidget::ViewMode: {
7981 bool inSearch = dbWidget->isInSearchMode();
7982- bool singleEntrySelected = dbWidget->entryView()->isSingleEntrySelected();
7983- bool entriesSelected = !dbWidget->entryView()->selectionModel()->selectedRows().isEmpty();
7984- bool groupSelected = dbWidget->groupView()->currentGroup();
7985+ bool singleEntrySelected = dbWidget->numberOfSelectedEntries() == 1;
7986+ bool entriesSelected = dbWidget->numberOfSelectedEntries() > 0;
7987+ bool groupSelected = dbWidget->isGroupSelected();
7988
7989 m_ui->actionEntryNew->setEnabled(!inSearch);
7990 m_ui->actionEntryClone->setEnabled(singleEntrySelected && !inSearch);
7991@@ -294,7 +294,7 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
7992 m_ui->actionEntryOpenUrl->setEnabled(singleEntrySelected);
7993 m_ui->actionGroupNew->setEnabled(groupSelected);
7994 m_ui->actionGroupEdit->setEnabled(groupSelected);
7995- m_ui->actionGroupDelete->setEnabled(groupSelected && dbWidget->canDeleteCurrentGoup());
7996+ m_ui->actionGroupDelete->setEnabled(groupSelected && dbWidget->canDeleteCurrentGroup());
7997 m_ui->actionSearch->setEnabled(true);
7998 // TODO: get checked state from db widget
7999 m_ui->actionSearch->setChecked(inSearch);
8000@@ -313,6 +313,11 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
8001 Q_FOREACH (QAction* action, m_ui->menuGroups->actions()) {
8002 action->setEnabled(false);
8003 }
8004+ m_ui->actionEntryCopyTitle->setEnabled(false);
8005+ m_ui->actionEntryCopyUsername->setEnabled(false);
8006+ m_ui->actionEntryCopyPassword->setEnabled(false);
8007+ m_ui->actionEntryCopyURL->setEnabled(false);
8008+ m_ui->actionEntryCopyNotes->setEnabled(false);
8009 m_ui->menuEntryCopyAttribute->setEnabled(false);
8010
8011 m_ui->actionSearch->setEnabled(false);
8012@@ -335,6 +340,11 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
8013 Q_FOREACH (QAction* action, m_ui->menuGroups->actions()) {
8014 action->setEnabled(false);
8015 }
8016+ m_ui->actionEntryCopyTitle->setEnabled(false);
8017+ m_ui->actionEntryCopyUsername->setEnabled(false);
8018+ m_ui->actionEntryCopyPassword->setEnabled(false);
8019+ m_ui->actionEntryCopyURL->setEnabled(false);
8020+ m_ui->actionEntryCopyNotes->setEnabled(false);
8021 m_ui->menuEntryCopyAttribute->setEnabled(false);
8022
8023 m_ui->actionSearch->setEnabled(false);
8024@@ -422,15 +432,29 @@ void MainWindow::closeEvent(QCloseEvent* event)
8025 saveWindowInformation();
8026
8027 event->accept();
8028+ QApplication::quit();
8029 }
8030 else {
8031 event->ignore();
8032 }
8033 }
8034
8035+void MainWindow::changeEvent(QEvent *event)
8036+{
8037+ if ((event->type() == QEvent::WindowStateChange) && isMinimized()
8038+ && isTrayIconEnabled() && config()->get("GUI/MinimizeToTray").toBool())
8039+ {
8040+ event->ignore();
8041+ hide();
8042+ }
8043+ else {
8044+ QMainWindow::changeEvent(event);
8045+ }
8046+}
8047+
8048 void MainWindow::saveWindowInformation()
8049 {
8050- config()->set("window/Geometry", saveGeometry());
8051+ config()->set("GUI/MainWindowGeometry", saveGeometry());
8052 }
8053
8054 bool MainWindow::saveLastDatabases()
8055@@ -460,6 +484,35 @@ bool MainWindow::saveLastDatabases()
8056 return accept;
8057 }
8058
8059+void MainWindow::updateTrayIcon()
8060+{
8061+ if (isTrayIconEnabled()) {
8062+ if (!m_trayIcon) {
8063+ m_trayIcon = new QSystemTrayIcon(filePath()->applicationIcon(), this);
8064+
8065+ QMenu* menu = new QMenu(this);
8066+
8067+ QAction* actionToggle = new QAction(tr("Toggle window"), menu);
8068+ menu->addAction(actionToggle);
8069+
8070+ menu->addAction(m_ui->actionQuit);
8071+
8072+ connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
8073+ SLOT(trayIconTriggered(QSystemTrayIcon::ActivationReason)));
8074+ connect(actionToggle, SIGNAL(triggered()), SLOT(toggleWindow()));
8075+
8076+ m_trayIcon->setContextMenu(menu);
8077+ m_trayIcon->show();
8078+ }
8079+ }
8080+ else {
8081+ if (m_trayIcon) {
8082+ delete m_trayIcon;
8083+ m_trayIcon = Q_NULLPTR;
8084+ }
8085+ }
8086+}
8087+
8088 void MainWindow::showEntryContextMenu(const QPoint& globalPos)
8089 {
8090 m_ui->menuEntries->popup(globalPos);
8091@@ -504,4 +557,31 @@ void MainWindow::applySettingsChanges()
8092 else {
8093 m_inactivityTimer->deactivate();
8094 }
8095+
8096+ updateTrayIcon();
8097+}
8098+
8099+void MainWindow::trayIconTriggered(QSystemTrayIcon::ActivationReason reason)
8100+{
8101+ if (reason == QSystemTrayIcon::Trigger) {
8102+ toggleWindow();
8103+ }
8104+}
8105+
8106+void MainWindow::toggleWindow()
8107+{
8108+ if (QApplication::activeWindow() == this) {
8109+ hide();
8110+ }
8111+ else {
8112+ show();
8113+ raise();
8114+ activateWindow();
8115+ }
8116+}
8117+
8118+bool MainWindow::isTrayIconEnabled() const
8119+{
8120+ return config()->get("GUI/ShowTrayIcon").toBool()
8121+ && QSystemTrayIcon::isSystemTrayAvailable();
8122 }
8123diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h
8124index 706fd2d..b966703 100644
8125--- a/src/gui/MainWindow.h
8126+++ b/src/gui/MainWindow.h
8127@@ -20,6 +20,7 @@
8128
8129 #include <QActionGroup>
8130 #include <QMainWindow>
8131+#include <QSystemTrayIcon>
8132
8133 #include "core/SignalMultiplexer.h"
8134 #include "gui/DatabaseWidget.h"
8135@@ -44,6 +45,7 @@ public Q_SLOTS:
8136
8137 protected:
8138 void closeEvent(QCloseEvent* event) Q_DECL_OVERRIDE;
8139+ void changeEvent(QEvent* event) Q_DECL_OVERRIDE;
8140
8141 private Q_SLOTS:
8142 void setMenuActionState(DatabaseWidget::Mode mode = DatabaseWidget::None);
8143@@ -61,6 +63,8 @@ private Q_SLOTS:
8144 void saveToolbarState(bool value);
8145 void rememberOpenDatabases(const QString& filePath);
8146 void applySettingsChanges();
8147+ void trayIconTriggered(QSystemTrayIcon::ActivationReason reason);
8148+ void toggleWindow();
8149
8150 private:
8151 static void setShortcut(QAction* action, QKeySequence::StandardKey standard, int fallback = 0);
8152@@ -69,6 +73,8 @@ private:
8153
8154 void saveWindowInformation();
8155 bool saveLastDatabases();
8156+ void updateTrayIcon();
8157+ bool isTrayIconEnabled() const;
8158
8159 const QScopedPointer<Ui::MainWindow> m_ui;
8160 SignalMultiplexer m_actionMultiplexer;
8161@@ -77,6 +83,8 @@ private:
8162 QActionGroup* m_copyAdditionalAttributeActions;
8163 QStringList m_openDatabases;
8164 InactivityTimer* m_inactivityTimer;
8165+ int m_countDefaultAttributes;
8166+ QSystemTrayIcon* m_trayIcon;
8167
8168 Q_DISABLE_COPY(MainWindow)
8169 };
8170diff --git a/src/gui/PasswordComboBox.cpp b/src/gui/PasswordComboBox.cpp
8171index af8e994..f11311a 100644
8172--- a/src/gui/PasswordComboBox.cpp
8173+++ b/src/gui/PasswordComboBox.cpp
8174@@ -45,7 +45,13 @@ void PasswordComboBox::setEcho(bool echo)
8175 // add fake item to show visual indication that a popup is available
8176 addItem("");
8177
8178- setStyleSheet("QComboBox { font-family: monospace; }");
8179+#ifdef Q_OS_MAC
8180+ // Qt on Mac OS doesn't seem to know the generic monospace family (tested with 4.8.6)
8181+ setStyleSheet("QComboBox { font-family: monospace,Menlo,Monaco; }");
8182+#else
8183+ setStyleSheet("QComboBox { font-family: monospace,Courier; }");
8184+#endif
8185+
8186 }
8187 else {
8188 // clear items so the combobox indicates that no popup menu is available
8189diff --git a/src/gui/PasswordEdit.cpp b/src/gui/PasswordEdit.cpp
8190index 8532696..b68eef6 100644
8191--- a/src/gui/PasswordEdit.cpp
8192+++ b/src/gui/PasswordEdit.cpp
8193@@ -56,7 +56,12 @@ void PasswordEdit::updateStylesheet()
8194 QString stylesheet("QLineEdit { ");
8195
8196 if (echoMode() == QLineEdit::Normal) {
8197+#ifdef Q_OS_MAC
8198+ // Qt on Mac OS doesn't seem to know the generic monospace family (tested with 4.8.6)
8199+ stylesheet.append("font-family: monospace,Menlo,Monaco; ");
8200+#else
8201 stylesheet.append("font-family: monospace; ");
8202+#endif
8203 }
8204
8205 if (m_basePasswordEdit && !passwordsEqual()) {
8206diff --git a/src/gui/PasswordGeneratorWidget.ui b/src/gui/PasswordGeneratorWidget.ui
8207index 342f191..5c75ef9 100644
8208--- a/src/gui/PasswordGeneratorWidget.ui
8209+++ b/src/gui/PasswordGeneratorWidget.ui
8210@@ -100,7 +100,7 @@
8211 <string>Upper Case Letters</string>
8212 </property>
8213 <property name="text">
8214- <string>A-Z</string>
8215+ <string notr="true">A-Z</string>
8216 </property>
8217 <property name="checkable">
8218 <bool>true</bool>
8219@@ -116,7 +116,7 @@
8220 <string>Lower Case Letters</string>
8221 </property>
8222 <property name="text">
8223- <string>a-z</string>
8224+ <string notr="true">a-z</string>
8225 </property>
8226 <property name="checkable">
8227 <bool>true</bool>
8228@@ -132,7 +132,7 @@
8229 <string>Numbers</string>
8230 </property>
8231 <property name="text">
8232- <string>0-9</string>
8233+ <string notr="true">0-9</string>
8234 </property>
8235 <property name="checkable">
8236 <bool>true</bool>
8237@@ -148,7 +148,7 @@
8238 <string>Special Characters</string>
8239 </property>
8240 <property name="text">
8241- <string>/*_&amp; ...</string>
8242+ <string notr="true">/*_&amp; ...</string>
8243 </property>
8244 <property name="checkable">
8245 <bool>true</bool>
8246diff --git a/src/gui/SearchWidget.ui b/src/gui/SearchWidget.ui
8247index c3d59b8..ce4845d 100644
8248--- a/src/gui/SearchWidget.ui
8249+++ b/src/gui/SearchWidget.ui
8250@@ -11,7 +11,16 @@
8251 </rect>
8252 </property>
8253 <layout class="QGridLayout" name="gridLayout">
8254- <property name="margin">
8255+ <property name="leftMargin">
8256+ <number>0</number>
8257+ </property>
8258+ <property name="topMargin">
8259+ <number>0</number>
8260+ </property>
8261+ <property name="rightMargin">
8262+ <number>0</number>
8263+ </property>
8264+ <property name="bottomMargin">
8265 <number>0</number>
8266 </property>
8267 <item row="0" column="1">
8268@@ -21,6 +30,9 @@
8269 <layout class="QHBoxLayout" name="horizontalLayout">
8270 <item>
8271 <widget class="QToolButton" name="closeSearchButton">
8272+ <property name="focusPolicy">
8273+ <enum>Qt::ClickFocus</enum>
8274+ </property>
8275 <property name="autoRaise">
8276 <bool>true</bool>
8277 </property>
8278@@ -38,7 +50,16 @@
8279 <item row="1" column="1">
8280 <widget class="QWidget" name="optionsWidget" native="true">
8281 <layout class="QHBoxLayout" name="horizontalLayout_2">
8282- <property name="margin">
8283+ <property name="leftMargin">
8284+ <number>0</number>
8285+ </property>
8286+ <property name="topMargin">
8287+ <number>0</number>
8288+ </property>
8289+ <property name="rightMargin">
8290+ <number>0</number>
8291+ </property>
8292+ <property name="bottomMargin">
8293 <number>0</number>
8294 </property>
8295 <item>
8296diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp
8297index d8516c6..a7863ea 100644
8298--- a/src/gui/SettingsWidget.cpp
8299+++ b/src/gui/SettingsWidget.cpp
8300@@ -21,6 +21,7 @@
8301
8302 #include "autotype/AutoType.h"
8303 #include "core/Config.h"
8304+#include "core/Translator.h"
8305
8306 SettingsWidget::SettingsWidget(QWidget* parent)
8307 : EditWidget(parent)
8308@@ -46,6 +47,8 @@ SettingsWidget::SettingsWidget(QWidget* parent)
8309
8310 connect(m_generalUi->autoSaveAfterEveryChangeCheckBox, SIGNAL(toggled(bool)),
8311 this, SLOT(enableAutoSaveOnExit(bool)));
8312+ connect(m_generalUi->systrayShowCheckBox, SIGNAL(toggled(bool)),
8313+ m_generalUi->systrayMinimizeToTrayCheckBox, SLOT(setEnabled(bool)));
8314
8315 connect(m_secUi->clearClipboardCheckBox, SIGNAL(toggled(bool)),
8316 m_secUi->clearClipboardSpinBox, SLOT(setEnabled(bool)));
8317@@ -66,6 +69,21 @@ void SettingsWidget::loadSettings()
8318 m_generalUi->autoSaveAfterEveryChangeCheckBox->setChecked(config()->get("AutoSaveAfterEveryChange").toBool());
8319 m_generalUi->autoSaveOnExitCheckBox->setChecked(config()->get("AutoSaveOnExit").toBool());
8320 m_generalUi->minimizeOnCopyCheckBox->setChecked(config()->get("MinimizeOnCopy").toBool());
8321+ m_generalUi->useGroupIconOnEntryCreationCheckBox->setChecked(config()->get("UseGroupIconOnEntryCreation").toBool());
8322+ m_generalUi->autoTypeEntryTitleMatchCheckBox->setChecked(config()->get("AutoTypeEntryTitleMatch").toBool());
8323+
8324+ m_generalUi->languageComboBox->clear();
8325+ QList<QPair<QString, QString> > languages = Translator::availableLanguages();
8326+ for (int i = 0; i < languages.size(); i++) {
8327+ m_generalUi->languageComboBox->addItem(languages[i].second, languages[i].first);
8328+ }
8329+ int defaultIndex = m_generalUi->languageComboBox->findData(config()->get("GUI/Language"));
8330+ if (defaultIndex > 0) {
8331+ m_generalUi->languageComboBox->setCurrentIndex(defaultIndex);
8332+ }
8333+
8334+ m_generalUi->systrayShowCheckBox->setChecked(config()->get("GUI/ShowTrayIcon").toBool());
8335+ m_generalUi->systrayMinimizeToTrayCheckBox->setChecked(config()->get("GUI/MinimizeToTray").toBool());
8336
8337 if (autoType()->isAvailable()) {
8338 m_globalAutoTypeKey = static_cast<Qt::Key>(config()->get("GlobalAutoTypeKey").toInt());
8339@@ -83,6 +101,8 @@ void SettingsWidget::loadSettings()
8340
8341 m_secUi->passwordCleartextCheckBox->setChecked(config()->get("security/passwordscleartext").toBool());
8342
8343+ m_secUi->autoTypeAskCheckBox->setChecked(config()->get("security/autotypeask").toBool());
8344+
8345 setCurrentRow(0);
8346 }
8347
8348@@ -97,6 +117,16 @@ void SettingsWidget::saveSettings()
8349 m_generalUi->autoSaveAfterEveryChangeCheckBox->isChecked());
8350 config()->set("AutoSaveOnExit", m_generalUi->autoSaveOnExitCheckBox->isChecked());
8351 config()->set("MinimizeOnCopy", m_generalUi->minimizeOnCopyCheckBox->isChecked());
8352+ config()->set("UseGroupIconOnEntryCreation",
8353+ m_generalUi->useGroupIconOnEntryCreationCheckBox->isChecked());
8354+ config()->set("AutoTypeEntryTitleMatch",
8355+ m_generalUi->autoTypeEntryTitleMatchCheckBox->isChecked());
8356+ int currentLangIndex = m_generalUi->languageComboBox->currentIndex();
8357+ config()->set("GUI/Language", m_generalUi->languageComboBox->itemData(currentLangIndex).toString());
8358+
8359+ config()->set("GUI/ShowTrayIcon", m_generalUi->systrayShowCheckBox->isChecked());
8360+ config()->set("GUI/MinimizeToTray", m_generalUi->systrayMinimizeToTrayCheckBox->isChecked());
8361+
8362 if (autoType()->isAvailable()) {
8363 config()->set("GlobalAutoTypeKey", m_generalUi->autoTypeShortcutWidget->key());
8364 config()->set("GlobalAutoTypeModifiers",
8365@@ -110,6 +140,8 @@ void SettingsWidget::saveSettings()
8366
8367 config()->set("security/passwordscleartext", m_secUi->passwordCleartextCheckBox->isChecked());
8368
8369+ config()->set("security/autotypeask", m_secUi->autoTypeAskCheckBox->isChecked());
8370+
8371 Q_EMIT editFinished(true);
8372 }
8373
8374diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui
8375index b723d18..cbad7e5 100644
8376--- a/src/gui/SettingsWidgetGeneral.ui
8377+++ b/src/gui/SettingsWidgetGeneral.ui
8378@@ -7,10 +7,13 @@
8379 <x>0</x>
8380 <y>0</y>
8381 <width>456</width>
8382- <height>185</height>
8383+ <height>340</height>
8384 </rect>
8385 </property>
8386 <layout class="QFormLayout" name="formLayout">
8387+ <property name="fieldGrowthPolicy">
8388+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
8389+ </property>
8390 <item row="0" column="0">
8391 <widget class="QCheckBox" name="rememberLastDatabasesCheckBox">
8392 <property name="text">
8393@@ -21,6 +24,13 @@
8394 </property>
8395 </widget>
8396 </item>
8397+ <item row="1" column="0">
8398+ <widget class="QCheckBox" name="openPreviousDatabasesOnStartupCheckBox">
8399+ <property name="text">
8400+ <string>Open previous databases on startup</string>
8401+ </property>
8402+ </widget>
8403+ </item>
8404 <item row="2" column="0">
8405 <widget class="QCheckBox" name="modifiedExpandedChangedCheckBox">
8406 <property name="text">
8407@@ -31,6 +41,13 @@
8408 </property>
8409 </widget>
8410 </item>
8411+ <item row="3" column="0">
8412+ <widget class="QCheckBox" name="autoSaveOnExitCheckBox">
8413+ <property name="text">
8414+ <string>Automatically save on exit</string>
8415+ </property>
8416+ </widget>
8417+ </item>
8418 <item row="4" column="0">
8419 <widget class="QCheckBox" name="autoSaveAfterEveryChangeCheckBox">
8420 <property name="text">
8421@@ -38,34 +55,61 @@
8422 </property>
8423 </widget>
8424 </item>
8425- <item row="3" column="0">
8426- <widget class="QCheckBox" name="autoSaveOnExitCheckBox">
8427+ <item row="5" column="0">
8428+ <widget class="QCheckBox" name="minimizeOnCopyCheckBox">
8429 <property name="text">
8430- <string>Automatically save on exit</string>
8431+ <string>Minimize when copying to clipboard</string>
8432 </property>
8433 </widget>
8434 </item>
8435 <item row="6" column="0">
8436+ <widget class="QCheckBox" name="useGroupIconOnEntryCreationCheckBox">
8437+ <property name="text">
8438+ <string>Use group icon on entry creation</string>
8439+ </property>
8440+ </widget>
8441+ </item>
8442+ <item row="7" column="0">
8443 <widget class="QLabel" name="autoTypeShortcutLabel">
8444 <property name="text">
8445 <string>Global Auto-Type shortcut</string>
8446 </property>
8447 </widget>
8448 </item>
8449- <item row="6" column="1">
8450+ <item row="7" column="1">
8451 <widget class="ShortcutWidget" name="autoTypeShortcutWidget"/>
8452 </item>
8453- <item row="1" column="0">
8454- <widget class="QCheckBox" name="openPreviousDatabasesOnStartupCheckBox">
8455+ <item row="8" column="0">
8456+ <widget class="QCheckBox" name="autoTypeEntryTitleMatchCheckBox">
8457 <property name="text">
8458- <string>Open previous databases on startup</string>
8459+ <string>Use entry title to match windows for global auto-type</string>
8460 </property>
8461 </widget>
8462 </item>
8463- <item row="5" column="0">
8464- <widget class="QCheckBox" name="minimizeOnCopyCheckBox">
8465+ <item row="9" column="0">
8466+ <widget class="QLabel" name="languageLabel">
8467 <property name="text">
8468- <string>Minimize when copying to clipboard</string>
8469+ <string>Language</string>
8470+ </property>
8471+ </widget>
8472+ </item>
8473+ <item row="9" column="1">
8474+ <widget class="QComboBox" name="languageComboBox"/>
8475+ </item>
8476+ <item row="10" column="0">
8477+ <widget class="QCheckBox" name="systrayShowCheckBox">
8478+ <property name="text">
8479+ <string>Show a system tray icon</string>
8480+ </property>
8481+ </widget>
8482+ </item>
8483+ <item row="11" column="0">
8484+ <widget class="QCheckBox" name="systrayMinimizeToTrayCheckBox">
8485+ <property name="enabled">
8486+ <bool>false</bool>
8487+ </property>
8488+ <property name="text">
8489+ <string>Hide window to system tray when minimized</string>
8490 </property>
8491 </widget>
8492 </item>
8493diff --git a/src/gui/SettingsWidgetSecurity.ui b/src/gui/SettingsWidgetSecurity.ui
8494index c2a6ccc..b52e862 100644
8495--- a/src/gui/SettingsWidgetSecurity.ui
8496+++ b/src/gui/SettingsWidgetSecurity.ui
8497@@ -64,6 +64,13 @@
8498 </property>
8499 </widget>
8500 </item>
8501+ <item row="3" column="0">
8502+ <widget class="QCheckBox" name="autoTypeAskCheckBox">
8503+ <property name="text">
8504+ <string>Always ask before performing auto-type</string>
8505+ </property>
8506+ </widget>
8507+ </item>
8508 </layout>
8509 </widget>
8510 <tabstops>
8511diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp
8512index 4a67433..465f5d4 100644
8513--- a/src/gui/entry/EditEntryWidget.cpp
8514+++ b/src/gui/entry/EditEntryWidget.cpp
8515@@ -590,14 +590,14 @@ void EditEntryWidget::insertAttachment()
8516 QFile file(filename);
8517 if (!file.open(QIODevice::ReadOnly)) {
8518 MessageBox::warning(this, tr("Error"),
8519- tr("Unable to open file:\n").append(file.errorString()));
8520+ tr("Unable to open file").append(":\n").append(file.errorString()));
8521 return;
8522 }
8523
8524 QByteArray data;
8525 if (!Tools::readAllFromDevice(&file, data)) {
8526 MessageBox::warning(this, tr("Error"),
8527- tr("Unable to open file:\n").append(file.errorString()));
8528+ tr("Unable to open file").append(":\n").append(file.errorString()));
8529 return;
8530 }
8531
8532@@ -783,13 +783,13 @@ QMenu* EditEntryWidget::createPresetsMenu()
8533 QMenu* expirePresetsMenu = new QMenu(this);
8534 expirePresetsMenu->addAction(tr("Tomorrow"))->setData(QVariant::fromValue(TimeDelta::fromDays(1)));
8535 expirePresetsMenu->addSeparator();
8536- expirePresetsMenu->addAction(tr("1 week"))->setData(QVariant::fromValue(TimeDelta::fromDays(7)));
8537- expirePresetsMenu->addAction(tr("2 weeks"))->setData(QVariant::fromValue(TimeDelta::fromDays(14)));
8538- expirePresetsMenu->addAction(tr("3 weeks"))->setData(QVariant::fromValue(TimeDelta::fromDays(21)));
8539+ expirePresetsMenu->addAction(tr("%n week(s)", 0, 1))->setData(QVariant::fromValue(TimeDelta::fromDays(7)));
8540+ expirePresetsMenu->addAction(tr("%n week(s)", 0, 2))->setData(QVariant::fromValue(TimeDelta::fromDays(14)));
8541+ expirePresetsMenu->addAction(tr("%n week(s)", 0, 3))->setData(QVariant::fromValue(TimeDelta::fromDays(21)));
8542 expirePresetsMenu->addSeparator();
8543- expirePresetsMenu->addAction(tr("1 month"))->setData(QVariant::fromValue(TimeDelta::fromMonths(1)));
8544- expirePresetsMenu->addAction(tr("3 months"))->setData(QVariant::fromValue(TimeDelta::fromMonths(3)));
8545- expirePresetsMenu->addAction(tr("6 months"))->setData(QVariant::fromValue(TimeDelta::fromMonths(6)));
8546+ expirePresetsMenu->addAction(tr("%n month(s)", 0, 1))->setData(QVariant::fromValue(TimeDelta::fromMonths(1)));
8547+ expirePresetsMenu->addAction(tr("%n month(s)", 0, 3))->setData(QVariant::fromValue(TimeDelta::fromMonths(3)));
8548+ expirePresetsMenu->addAction(tr("%n month(s)", 0, 6))->setData(QVariant::fromValue(TimeDelta::fromMonths(6)));
8549 expirePresetsMenu->addSeparator();
8550 expirePresetsMenu->addAction(tr("1 year"))->setData(QVariant::fromValue(TimeDelta::fromYears(1)));
8551 return expirePresetsMenu;
8552diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp
8553index f71f80b..cd2c6fb 100644
8554--- a/src/gui/entry/EntryView.cpp
8555+++ b/src/gui/entry/EntryView.cpp
8556@@ -17,6 +17,7 @@
8557
8558 #include "EntryView.h"
8559
8560+#include <QHeaderView>
8561 #include <QKeyEvent>
8562
8563 #include "gui/SortFilterHideProxyModel.h"
8564@@ -40,6 +41,7 @@ EntryView::EntryView(QWidget* parent)
8565 setDragEnabled(true);
8566 setSortingEnabled(true);
8567 setSelectionMode(QAbstractItemView::ExtendedSelection);
8568+ header()->setDefaultSectionSize(150);
8569
8570 // QAbstractItemView::startDrag() uses this property as the default drag action
8571 setDefaultDropAction(Qt::MoveAction);
8572@@ -62,13 +64,24 @@ void EntryView::keyPressEvent(QKeyEvent* event)
8573 void EntryView::setGroup(Group* group)
8574 {
8575 m_model->setGroup(group);
8576- Q_EMIT entrySelectionChanged();
8577+ setFirstEntryActive();
8578 }
8579
8580 void EntryView::setEntryList(const QList<Entry*>& entries)
8581 {
8582 m_model->setEntryList(entries);
8583- Q_EMIT entrySelectionChanged();
8584+ setFirstEntryActive();
8585+}
8586+
8587+void EntryView::setFirstEntryActive()
8588+{
8589+ if(m_model->rowCount() > 0) {
8590+ QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(0, 0));
8591+ setCurrentEntry(m_model->entryFromIndex(index));
8592+ }
8593+ else {
8594+ Q_EMIT entrySelectionChanged();
8595+ }
8596 }
8597
8598 bool EntryView::inEntryListMode()
8599@@ -100,9 +113,9 @@ Entry* EntryView::currentEntry()
8600 }
8601 }
8602
8603-bool EntryView::isSingleEntrySelected()
8604+int EntryView::numberOfSelectedEntries()
8605 {
8606- return (selectionModel()->selectedRows().size() == 1);
8607+ return selectionModel()->selectedRows().size();
8608 }
8609
8610 void EntryView::setCurrentEntry(Entry* entry)
8611diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h
8612index b5f056a..c11d041 100644
8613--- a/src/gui/entry/EntryView.h
8614+++ b/src/gui/entry/EntryView.h
8615@@ -37,11 +37,12 @@ public:
8616 explicit EntryView(QWidget* parent = Q_NULLPTR);
8617 void setModel(QAbstractItemModel* model) Q_DECL_OVERRIDE;
8618 Entry* currentEntry();
8619- bool isSingleEntrySelected();
8620 void setCurrentEntry(Entry* entry);
8621 Entry* entryFromIndex(const QModelIndex& index);
8622 void setEntryList(const QList<Entry*>& entries);
8623 bool inEntryListMode();
8624+ int numberOfSelectedEntries();
8625+ void setFirstEntryActive();
8626
8627 public Q_SLOTS:
8628 void setGroup(Group* group);
8629diff --git a/src/gui/group/EditGroupWidget.cpp b/src/gui/group/EditGroupWidget.cpp
8630index c24afb9..b26fe4c 100644
8631--- a/src/gui/group/EditGroupWidget.cpp
8632+++ b/src/gui/group/EditGroupWidget.cpp
8633@@ -37,9 +37,6 @@ EditGroupWidget::EditGroupWidget(QWidget* parent)
8634 add(tr("Icon"), m_editGroupWidgetIcons);
8635 add(tr("Properties"), m_editWidgetProperties);
8636
8637- addTriStateItems(m_mainUi->searchComboBox);
8638- addTriStateItems(m_mainUi->autotypeComboBox);
8639-
8640 connect(m_mainUi->expireCheck, SIGNAL(toggled(bool)), m_mainUi->expireDatePicker, SLOT(setEnabled(bool)));
8641
8642 connect(this, SIGNAL(accepted()), SLOT(save()));
8643@@ -62,6 +59,15 @@ void EditGroupWidget::loadGroup(Group* group, bool create, Database* database)
8644 setHeadline(tr("Edit group"));
8645 }
8646
8647+ if (m_group->parentGroup()) {
8648+ addTriStateItems(m_mainUi->searchComboBox, m_group->parentGroup()->resolveSearchingEnabled());
8649+ addTriStateItems(m_mainUi->autotypeComboBox, m_group->parentGroup()->resolveAutoTypeEnabled());
8650+ }
8651+ else {
8652+ addTriStateItems(m_mainUi->searchComboBox, true);
8653+ addTriStateItems(m_mainUi->autotypeComboBox, true);
8654+ }
8655+
8656 m_mainUi->editName->setText(m_group->name());
8657 m_mainUi->editNotes->setPlainText(m_group->notes());
8658 m_mainUi->expireCheck->setChecked(group->timeInfo().expires());
8659@@ -120,9 +126,18 @@ void EditGroupWidget::cancel()
8660 Q_EMIT editFinished(false);
8661 }
8662
8663-void EditGroupWidget::addTriStateItems(QComboBox* comboBox)
8664+void EditGroupWidget::addTriStateItems(QComboBox* comboBox, bool inheritDefault)
8665 {
8666- comboBox->addItem(tr("Inherit"));
8667+ QString inheritDefaultString;
8668+ if (inheritDefault) {
8669+ inheritDefaultString = tr("Enable");
8670+ }
8671+ else {
8672+ inheritDefaultString = tr("Disable");
8673+ }
8674+
8675+ comboBox->clear();
8676+ comboBox->addItem(tr("Inherit from parent group (%1)").arg(inheritDefaultString));
8677 comboBox->addItem(tr("Enable"));
8678 comboBox->addItem(tr("Disable"));
8679 }
8680diff --git a/src/gui/group/EditGroupWidget.h b/src/gui/group/EditGroupWidget.h
8681index de075be..971b6de 100644
8682--- a/src/gui/group/EditGroupWidget.h
8683+++ b/src/gui/group/EditGroupWidget.h
8684@@ -50,7 +50,7 @@ private Q_SLOTS:
8685 void cancel();
8686
8687 private:
8688- void addTriStateItems(QComboBox* comboBox);
8689+ void addTriStateItems(QComboBox* comboBox, bool inheritValue);
8690 int indexFromTriState(Group::TriState triState);
8691 Group::TriState triStateFromIndex(int index);
8692
8693diff --git a/src/gui/group/EditGroupWidgetMain.ui b/src/gui/group/EditGroupWidgetMain.ui
8694index c528c18..fdbf054 100644
8695--- a/src/gui/group/EditGroupWidgetMain.ui
8696+++ b/src/gui/group/EditGroupWidgetMain.ui
8697@@ -66,7 +66,7 @@
8698 <item row="4" column="0">
8699 <widget class="QLabel" name="autotypeLabel">
8700 <property name="text">
8701- <string>Autotype</string>
8702+ <string>Auto-type</string>
8703 </property>
8704 </widget>
8705 </item>
8706diff --git a/src/main.cpp b/src/main.cpp
8707index abe7ceb..2bdef5b 100644
8708--- a/src/main.cpp
8709+++ b/src/main.cpp
8710@@ -21,9 +21,11 @@
8711 #include "core/Config.h"
8712 #include "core/qcommandlineparser.h"
8713 #include "core/Tools.h"
8714+#include "core/Translator.h"
8715 #include "crypto/Crypto.h"
8716 #include "gui/Application.h"
8717 #include "gui/MainWindow.h"
8718+#include "gui/MessageBox.h"
8719
8720 int main(int argc, char** argv)
8721 {
8722@@ -37,7 +39,16 @@ int main(int argc, char** argv)
8723 // don't set organizationName as that changes the return value of
8724 // QDesktopServices::storageLocation(QDesktopServices::DataLocation)
8725
8726- Crypto::init();
8727+ QApplication::setQuitOnLastWindowClosed(false);
8728+
8729+ if (!Crypto::init()) {
8730+ QString error = QCoreApplication::translate("Main",
8731+ "Fatal error while testing the cryptographic functions.");
8732+ error.append("\n");
8733+ error.append(Crypto::errorString());
8734+ MessageBox::critical(Q_NULLPTR, QCoreApplication::translate("Main", "KeePassX - Error"), error);
8735+ return 1;
8736+ }
8737
8738 QCommandLineParser parser;
8739 parser.setApplicationDescription(QCoreApplication::translate("main", "KeePassX - cross-platform password manager"));
8740@@ -66,6 +77,8 @@ int main(int argc, char** argv)
8741 Config::createConfigFromFile(parser.value(configOption));
8742 }
8743
8744+ Translator::installTranslator();
8745+
8746 #ifdef Q_OS_MAC
8747 // Don't show menu icons on OSX
8748 QApplication::setAttribute(Qt::AA_DontShowIconsInMenus);
8749diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
8750index 8df0050..c094f82 100644
8751--- a/tests/CMakeLists.txt
8752+++ b/tests/CMakeLists.txt
8753@@ -13,7 +13,6 @@
8754 # You should have received a copy of the GNU General Public License
8755 # along with this program. If not, see <http://www.gnu.org/licenses/>.
8756
8757-set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
8758 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src)
8759
8760 add_definitions(-DQT_TEST_LIB)
8761@@ -165,6 +164,12 @@ add_unit_test(NAME testqcommandlineparser SOURCES TestQCommandLineParser.cpp MOC
8762 add_unit_test(NAME testrandom SOURCES TestRandom.cpp MOCS TestRandom.h
8763 LIBS ${TEST_LIBRARIES})
8764
8765+add_unit_test(NAME testentrysearcher SOURCES TestEntrySearcher.cpp MOCS TestEntrySearcher.h
8766+ LIBS ${TEST_LIBRARIES})
8767+
8768+add_unit_test(NAME testexporter SOURCES TestExporter.cpp MOCS TestExporter.h
8769+ LIBS ${TEST_LIBRARIES})
8770+
8771 if(WITH_GUI_TESTS)
8772 add_subdirectory(gui)
8773 endif(WITH_GUI_TESTS)
8774diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp
8775index 2fb5335..818f57c 100644
8776--- a/tests/TestAutoType.cpp
8777+++ b/tests/TestAutoType.cpp
8778@@ -21,6 +21,7 @@
8779 #include <QTest>
8780
8781 #include "tests.h"
8782+#include "core/Config.h"
8783 #include "core/FilePath.h"
8784 #include "core/Entry.h"
8785 #include "core/Group.h"
8786@@ -28,12 +29,17 @@
8787 #include "autotype/AutoType.h"
8788 #include "autotype/AutoTypePlatformPlugin.h"
8789 #include "autotype/test/AutoTypeTestInterface.h"
8790+#include "gui/MessageBox.h"
8791+
8792+QTEST_GUILESS_MAIN(TestAutoType)
8793
8794 void TestAutoType::initTestCase()
8795 {
8796- Crypto::init();
8797-
8798+ QVERIFY(Crypto::init());
8799+ Config::createTempFileInstance();
8800 AutoType::createTestInstance();
8801+ config()->set("AutoTypeEntryTitleMatch", false);
8802+ config()->set("security/autotypeask", false);
8803
8804 QPluginLoader loader(filePath()->pluginPath("keepassx-autotype-test"));
8805 loader.setLoadHints(QLibrary::ResolveAllSymbolsHint);
8806@@ -53,12 +59,24 @@ void TestAutoType::init()
8807 m_test->clearActions();
8808
8809 m_db = new Database();
8810+ m_dbList.clear();
8811+ m_dbList.append(m_db);
8812 m_group = new Group();
8813 m_db->setRootGroup(m_group);
8814- m_entry = new Entry();
8815- m_entry->setGroup(m_group);
8816- m_entry->setUsername("myuser");
8817- m_entry->setPassword("mypass");
8818+
8819+ m_entry1 = new Entry();
8820+ m_entry1->setGroup(m_group);
8821+ m_entry1->setUsername("myuser");
8822+ m_entry1->setPassword("mypass");
8823+ AutoTypeAssociations::Association association;
8824+ association.window = "custom window";
8825+ association.sequence = "{username}association{password}";
8826+ m_entry1->autoTypeAssociations()->add(association);
8827+
8828+ m_entry2 = new Entry();
8829+ m_entry2->setGroup(m_group);
8830+ m_entry2->setPassword("myuser");
8831+ m_entry2->setTitle("entry title");
8832 }
8833
8834 void TestAutoType::cleanup()
8835@@ -76,7 +94,7 @@ void TestAutoType::testInternal()
8836
8837 void TestAutoType::testAutoTypeWithoutSequence()
8838 {
8839- m_autoType->performAutoType(m_entry, Q_NULLPTR);
8840+ m_autoType->performAutoType(m_entry1, Q_NULLPTR);
8841
8842 QCOMPARE(m_test->actionCount(), 14);
8843 QCOMPARE(m_test->actionChars(),
8844@@ -87,41 +105,54 @@ void TestAutoType::testAutoTypeWithoutSequence()
8845
8846 void TestAutoType::testAutoTypeWithSequence()
8847 {
8848- m_autoType->performAutoType(m_entry, Q_NULLPTR, "{Username}abc{PaSsWoRd}");
8849+ m_autoType->performAutoType(m_entry1, Q_NULLPTR, "{Username}abc{PaSsWoRd}");
8850
8851 QCOMPARE(m_test->actionCount(), 15);
8852 QCOMPARE(m_test->actionChars(),
8853 QString("%1abc%2")
8854- .arg(m_entry->username())
8855- .arg(m_entry->password()));
8856+ .arg(m_entry1->username())
8857+ .arg(m_entry1->password()));
8858 }
8859
8860 void TestAutoType::testGlobalAutoTypeWithNoMatch()
8861 {
8862- QList<Database*> dbList;
8863- dbList.append(m_db);
8864-
8865- m_autoType->performGlobalAutoType(dbList);
8866+ m_test->setActiveWindowTitle("nomatch");
8867+ MessageBox::setNextAnswer(QMessageBox::Ok);
8868+ m_autoType->performGlobalAutoType(m_dbList);
8869
8870 QCOMPARE(m_test->actionChars(), QString());
8871 }
8872
8873 void TestAutoType::testGlobalAutoTypeWithOneMatch()
8874 {
8875- QList<Database*> dbList;
8876- dbList.append(m_db);
8877- AutoTypeAssociations::Association association;
8878- association.window = "custom window";
8879- association.sequence = "{username}association{password}";
8880- m_entry->autoTypeAssociations()->add(association);
8881-
8882 m_test->setActiveWindowTitle("custom window");
8883- m_autoType->performGlobalAutoType(dbList);
8884+ m_autoType->performGlobalAutoType(m_dbList);
8885
8886 QCOMPARE(m_test->actionChars(),
8887 QString("%1association%2")
8888- .arg(m_entry->username())
8889- .arg(m_entry->password()));
8890+ .arg(m_entry1->username())
8891+ .arg(m_entry1->password()));
8892 }
8893
8894-QTEST_GUILESS_MAIN(TestAutoType)
8895+void TestAutoType::testGlobalAutoTypeTitleMatch()
8896+{
8897+ config()->set("AutoTypeEntryTitleMatch", true);
8898+
8899+ m_test->setActiveWindowTitle("An Entry Title!");
8900+ m_autoType->performGlobalAutoType(m_dbList);
8901+
8902+ QCOMPARE(m_test->actionChars(),
8903+ QString("%1%2").arg(m_entry2->password(), m_test->keyToString(Qt::Key_Enter)));
8904+}
8905+
8906+void TestAutoType::testGlobalAutoTypeTitleMatchDisabled()
8907+{
8908+ config()->set("AutoTypeEntryTitleMatch", false);
8909+
8910+ m_test->setActiveWindowTitle("An Entry Title!");
8911+ MessageBox::setNextAnswer(QMessageBox::Ok);
8912+ m_autoType->performGlobalAutoType(m_dbList);
8913+
8914+ QCOMPARE(m_test->actionChars(), QString());
8915+
8916+}
8917diff --git a/tests/TestAutoType.h b/tests/TestAutoType.h
8918index fba7fde..d46a559 100644
8919--- a/tests/TestAutoType.h
8920+++ b/tests/TestAutoType.h
8921@@ -41,14 +41,18 @@ private Q_SLOTS:
8922 void testAutoTypeWithSequence();
8923 void testGlobalAutoTypeWithNoMatch();
8924 void testGlobalAutoTypeWithOneMatch();
8925+ void testGlobalAutoTypeTitleMatch();
8926+ void testGlobalAutoTypeTitleMatchDisabled();
8927
8928 private:
8929 AutoTypePlatformInterface* m_platform;
8930 AutoTypeTestInterface* m_test;
8931 AutoType* m_autoType;
8932 Database* m_db;
8933+ QList<Database*> m_dbList;
8934 Group* m_group;
8935- Entry* m_entry;
8936+ Entry* m_entry1;
8937+ Entry* m_entry2;
8938 };
8939
8940 #endif // KEEPASSX_TESTAUTOTYPE_H
8941diff --git a/tests/TestCryptoHash.cpp b/tests/TestCryptoHash.cpp
8942index 4f258a1..eb26ca8 100644
8943--- a/tests/TestCryptoHash.cpp
8944+++ b/tests/TestCryptoHash.cpp
8945@@ -23,15 +23,17 @@
8946 #include "crypto/Crypto.h"
8947 #include "crypto/CryptoHash.h"
8948
8949+QTEST_GUILESS_MAIN(TestCryptoHash)
8950+
8951 void TestCryptoHash::initTestCase()
8952 {
8953- Crypto::init();
8954+ QVERIFY(Crypto::init());
8955 }
8956
8957 void TestCryptoHash::test()
8958 {
8959 // TODO: move somewhere else
8960- QVERIFY(Crypto::selfTest());
8961+ QVERIFY(Crypto::backendSelfTest());
8962
8963 CryptoHash cryptoHash1(CryptoHash::Sha256);
8964 QCOMPARE(cryptoHash1.result(),
8965@@ -47,5 +49,3 @@ void TestCryptoHash::test()
8966 QCOMPARE(cryptoHash3.result(),
8967 QByteArray::fromHex("0b56e5f65263e747af4a833bd7dd7ad26a64d7a4de7c68e52364893dca0766b4"));
8968 }
8969-
8970-QTEST_GUILESS_MAIN(TestCryptoHash)
8971diff --git a/tests/TestDeletedObjects.cpp b/tests/TestDeletedObjects.cpp
8972index 914096c..277dbcb 100644
8973--- a/tests/TestDeletedObjects.cpp
8974+++ b/tests/TestDeletedObjects.cpp
8975@@ -26,9 +26,11 @@
8976 #include "format/KeePass2XmlReader.h"
8977 #include "config-keepassx-tests.h"
8978
8979+QTEST_GUILESS_MAIN(TestDeletedObjects)
8980+
8981 void TestDeletedObjects::initTestCase()
8982 {
8983- Crypto::init();
8984+ QVERIFY(Crypto::init());
8985 }
8986
8987 void TestDeletedObjects::createAndDelete(Database* db, int delObjectsSize)
8988@@ -158,5 +160,3 @@ void TestDeletedObjects::testDatabaseChange()
8989 delete db;
8990 delete db2;
8991 }
8992-
8993-QTEST_GUILESS_MAIN(TestDeletedObjects)
8994diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp
8995index 15f398f..477e83b 100644
8996--- a/tests/TestEntry.cpp
8997+++ b/tests/TestEntry.cpp
8998@@ -23,9 +23,11 @@
8999 #include "core/Entry.h"
9000 #include "crypto/Crypto.h"
9001
9002+QTEST_GUILESS_MAIN(TestEntry)
9003+
9004 void TestEntry::initTestCase()
9005 {
9006- Crypto::init();
9007+ QVERIFY(Crypto::init());
9008 }
9009
9010 void TestEntry::testHistoryItemDeletion()
9011@@ -121,5 +123,3 @@ void TestEntry::testClone()
9012 QCOMPARE(entryCloneHistory->historyItems().first()->title(), QString("Original Title"));
9013 QCOMPARE(entryCloneHistory->timeInfo().creationTime(), entryOrg->timeInfo().creationTime());
9014 }
9015-
9016-QTEST_GUILESS_MAIN(TestEntry)
9017diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp
9018index fab63db..7ba886b 100644
9019--- a/tests/TestEntryModel.cpp
9020+++ b/tests/TestEntryModel.cpp
9021@@ -33,10 +33,12 @@
9022 #include "gui/entry/EntryAttachmentsModel.h"
9023 #include "gui/entry/EntryAttributesModel.h"
9024
9025+QTEST_GUILESS_MAIN(TestEntryModel)
9026+
9027 void TestEntryModel::initTestCase()
9028 {
9029 qRegisterMetaType<QModelIndex>("QModelIndex");
9030- Crypto::init();
9031+ QVERIFY(Crypto::init());
9032 }
9033
9034 void TestEntryModel::test()
9035@@ -341,5 +343,3 @@ void TestEntryModel::testDatabaseDelete()
9036 delete modelTest;
9037 delete model;
9038 }
9039-
9040-QTEST_GUILESS_MAIN(TestEntryModel)
9041diff --git a/tests/TestEntrySearcher.cpp b/tests/TestEntrySearcher.cpp
9042new file mode 100644
9043index 0000000..9f7ca13
9044--- /dev/null
9045+++ b/tests/TestEntrySearcher.cpp
9046@@ -0,0 +1,144 @@
9047+/*
9048+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
9049+ *
9050+ * This program is free software: you can redistribute it and/or modify
9051+ * it under the terms of the GNU General Public License as published by
9052+ * the Free Software Foundation, either version 2 or (at your option)
9053+ * version 3 of the License.
9054+ *
9055+ * This program is distributed in the hope that it will be useful,
9056+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
9057+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9058+ * GNU General Public License for more details.
9059+ *
9060+ * You should have received a copy of the GNU General Public License
9061+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
9062+ */
9063+
9064+#include "TestEntrySearcher.h"
9065+
9066+#include <QTest>
9067+
9068+#include "tests.h"
9069+
9070+QTEST_GUILESS_MAIN(TestEntrySearcher)
9071+
9072+void TestEntrySearcher::initTestCase()
9073+{
9074+ m_groupRoot = new Group();
9075+}
9076+
9077+void TestEntrySearcher::cleanupTestCase()
9078+{
9079+ delete m_groupRoot;
9080+}
9081+
9082+void TestEntrySearcher::testSearch()
9083+{
9084+ Group* group1 = new Group();
9085+ Group* group2 = new Group();
9086+ Group* group3 = new Group();
9087+
9088+ group1->setParent(m_groupRoot);
9089+ group2->setParent(m_groupRoot);
9090+ group3->setParent(m_groupRoot);
9091+
9092+ Group* group11 = new Group();
9093+
9094+ group11->setParent(group1);
9095+
9096+ Group* group21 = new Group();
9097+ Group* group211 = new Group();
9098+ Group* group2111 = new Group();
9099+
9100+ group21->setParent(group2);
9101+ group211->setParent(group21);
9102+ group2111->setParent(group211);
9103+
9104+ group1->setSearchingEnabled(Group::Disable);
9105+ group11->setSearchingEnabled(Group::Enable);
9106+
9107+ Entry* eRoot = new Entry();
9108+ eRoot->setNotes("test search term test");
9109+ eRoot->setGroup(m_groupRoot);
9110+
9111+ Entry* eRoot2 = new Entry();
9112+ eRoot2->setNotes("test term test");
9113+ eRoot2->setGroup(m_groupRoot);
9114+
9115+ Entry* e1 = new Entry();
9116+ e1->setNotes("test search term test");
9117+ e1->setGroup(group1);
9118+
9119+ Entry* e11 = new Entry();
9120+ e11->setNotes("test search term test");
9121+ e11->setGroup(group11);
9122+
9123+ Entry* e2111 = new Entry();
9124+ e2111->setNotes("test search term test");
9125+ e2111->setGroup(group2111);
9126+
9127+ Entry* e2111b = new Entry();
9128+ e2111b->setNotes("test search test");
9129+ e2111b->setGroup(group2111);
9130+
9131+ Entry* e3 = new Entry();
9132+ e3->setNotes("test search term test");
9133+ e3->setGroup(group3);
9134+
9135+ Entry* e3b = new Entry();
9136+ e3b->setNotes("test search test");
9137+ e3b->setGroup(group3);
9138+
9139+ m_searchResult = m_entrySearcher.search("search term", m_groupRoot, Qt::CaseInsensitive);
9140+ QCOMPARE(m_searchResult.count(), 3);
9141+
9142+ m_searchResult = m_entrySearcher.search("search term", group211, Qt::CaseInsensitive);
9143+ QCOMPARE(m_searchResult.count(), 1);
9144+
9145+ m_searchResult = m_entrySearcher.search("search term", group11, Qt::CaseInsensitive);
9146+ QCOMPARE(m_searchResult.count(), 1);
9147+
9148+ m_searchResult = m_entrySearcher.search("search term", group1, Qt::CaseInsensitive);
9149+ QCOMPARE(m_searchResult.count(), 0);
9150+}
9151+
9152+void TestEntrySearcher::testAndConcatenationInSearch()
9153+{
9154+ Entry* entry = new Entry();
9155+ entry->setNotes("abc def ghi");
9156+ entry->setTitle("jkl");
9157+ entry->setGroup(m_groupRoot);
9158+
9159+ m_searchResult = m_entrySearcher.search("", m_groupRoot, Qt::CaseInsensitive);
9160+ QCOMPARE(m_searchResult.count(), 1);
9161+
9162+ m_searchResult = m_entrySearcher.search("def", m_groupRoot, Qt::CaseInsensitive);
9163+ QCOMPARE(m_searchResult.count(), 1);
9164+
9165+ m_searchResult = m_entrySearcher.search(" abc ghi ", m_groupRoot, Qt::CaseInsensitive);
9166+ QCOMPARE(m_searchResult.count(), 1);
9167+
9168+ m_searchResult = m_entrySearcher.search("ghi ef", m_groupRoot, Qt::CaseInsensitive);
9169+ QCOMPARE(m_searchResult.count(), 1);
9170+
9171+ m_searchResult = m_entrySearcher.search("abc ef xyz", m_groupRoot, Qt::CaseInsensitive);
9172+ QCOMPARE(m_searchResult.count(), 0);
9173+
9174+ m_searchResult = m_entrySearcher.search("abc kl", m_groupRoot, Qt::CaseInsensitive);
9175+ QCOMPARE(m_searchResult.count(), 1);
9176+}
9177+
9178+void TestEntrySearcher::testAllAttributesAreSearched()
9179+{
9180+ Entry* entry = new Entry();
9181+ entry->setGroup(m_groupRoot);
9182+
9183+ entry->setTitle("testTitle");
9184+ entry->setUsername("testUsername");
9185+ entry->setUrl("testUrl");
9186+ entry->setNotes("testNote");
9187+
9188+ m_searchResult = m_entrySearcher.search("testTitle testUsername testUrl testNote", m_groupRoot, Qt::CaseInsensitive);
9189+ QCOMPARE(m_searchResult.count(), 1);
9190+}
9191diff --git a/tests/TestEntrySearcher.h b/tests/TestEntrySearcher.h
9192new file mode 100644
9193index 0000000..7c45451
9194--- /dev/null
9195+++ b/tests/TestEntrySearcher.h
9196@@ -0,0 +1,45 @@
9197+/*
9198+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
9199+ *
9200+ * This program is free software: you can redistribute it and/or modify
9201+ * it under the terms of the GNU General Public License as published by
9202+ * the Free Software Foundation, either version 2 or (at your option)
9203+ * version 3 of the License.
9204+ *
9205+ * This program is distributed in the hope that it will be useful,
9206+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
9207+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9208+ * GNU General Public License for more details.
9209+ *
9210+ * You should have received a copy of the GNU General Public License
9211+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
9212+ */
9213+
9214+
9215+#ifndef KEEPASSX_TESTENTRYSEARCHER_H
9216+#define KEEPASSX_TESTENTRYSEARCHER_H
9217+
9218+#include <QObject>
9219+
9220+#include "core/EntrySearcher.h"
9221+#include "core/Group.h"
9222+
9223+class TestEntrySearcher : public QObject
9224+{
9225+ Q_OBJECT
9226+
9227+private Q_SLOTS:
9228+ void initTestCase();
9229+ void cleanupTestCase();
9230+
9231+ void testAndConcatenationInSearch();
9232+ void testSearch();
9233+ void testAllAttributesAreSearched();
9234+
9235+private:
9236+ Group* m_groupRoot;
9237+ EntrySearcher m_entrySearcher;
9238+ QList<Entry*> m_searchResult;
9239+};
9240+
9241+#endif // KEEPASSX_TESTENTRYSEARCHER_H
9242diff --git a/tests/TestExporter.cpp b/tests/TestExporter.cpp
9243new file mode 100644
9244index 0000000..d703e02
9245--- /dev/null
9246+++ b/tests/TestExporter.cpp
9247@@ -0,0 +1,82 @@
9248+/*
9249+ * Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
9250+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
9251+ *
9252+ * This program is free software: you can redistribute it and/or modify
9253+ * it under the terms of the GNU General Public License as published by
9254+ * the Free Software Foundation, either version 2 or (at your option)
9255+ * version 3 of the License.
9256+ *
9257+ * This program is distributed in the hope that it will be useful,
9258+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
9259+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9260+ * GNU General Public License for more details.
9261+ *
9262+ * You should have received a copy of the GNU General Public License
9263+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
9264+ */
9265+
9266+#include "TestExporter.h"
9267+
9268+#include <QTest>
9269+
9270+#include "tests.h"
9271+#include "core/ToDbExporter.h"
9272+#include "core/Group.h"
9273+#include "core/Metadata.h"
9274+#include "crypto/Crypto.h"
9275+
9276+QTEST_GUILESS_MAIN(TestExporter)
9277+
9278+void TestExporter::initTestCase()
9279+{
9280+ QVERIFY(Crypto::init());
9281+}
9282+
9283+void TestExporter::testToDbExporter()
9284+{
9285+ QImage iconImage(1, 1, QImage::Format_RGB32);
9286+ iconImage.setPixel(0, 0, qRgb(1, 2, 3));
9287+ Uuid iconUuid = Uuid::random();
9288+
9289+ QImage iconUnusedImage(1, 1, QImage::Format_RGB32);
9290+ iconUnusedImage.setPixel(0, 0, qRgb(1, 2, 3));
9291+ Uuid iconUnusedUuid = Uuid::random();
9292+
9293+ Database* dbOrg = new Database();
9294+ Group* groupOrg = new Group();
9295+ groupOrg->setParent(dbOrg->rootGroup());
9296+ groupOrg->setName("GTEST");
9297+ Entry* entryOrg = new Entry();
9298+ entryOrg->setGroup(groupOrg);
9299+ entryOrg->setTitle("ETEST");
9300+ dbOrg->metadata()->addCustomIcon(iconUuid, iconImage);
9301+ dbOrg->metadata()->addCustomIcon(iconUnusedUuid, iconUnusedImage);
9302+ entryOrg->setIcon(iconUuid);
9303+ entryOrg->beginUpdate();
9304+ entryOrg->setIcon(Entry::DefaultIconNumber);
9305+ entryOrg->endUpdate();
9306+
9307+ Database* dbExp = ToDbExporter().exportGroup(groupOrg);
9308+
9309+ QCOMPARE(dbExp->rootGroup()->children().size(), 1);
9310+ Group* groupExp = dbExp->rootGroup()->children().first();
9311+ QVERIFY(groupExp != groupOrg);
9312+ QCOMPARE(groupExp->name(), groupOrg->name());
9313+ QCOMPARE(groupExp->entries().size(), 1);
9314+
9315+ Entry* entryExp = groupExp->entries().first();
9316+ QCOMPARE(entryExp->title(), entryOrg->title());
9317+ QCOMPARE(dbExp->metadata()->customIcons().size(), 1);
9318+ QVERIFY(dbExp->metadata()->containsCustomIcon(iconUuid));
9319+ QCOMPARE(entryExp->iconNumber(), entryOrg->iconNumber());
9320+
9321+ QCOMPARE(entryExp->historyItems().size(), 1);
9322+ QCOMPARE(entryExp->historyItems().first()->iconUuid(), iconUuid);
9323+
9324+ delete dbOrg;
9325+ delete dbExp;
9326+}
9327+
9328+
9329+
9330diff --git a/tests/TestExporter.h b/tests/TestExporter.h
9331new file mode 100644
9332index 0000000..15f9a7c
9333--- /dev/null
9334+++ b/tests/TestExporter.h
9335@@ -0,0 +1,33 @@
9336+/*
9337+ * Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
9338+ * Copyright (C) 2014 Florian Geyer <blueice@fobos.de>
9339+ *
9340+ * This program is free software: you can redistribute it and/or modify
9341+ * it under the terms of the GNU General Public License as published by
9342+ * the Free Software Foundation, either version 2 or (at your option)
9343+ * version 3 of the License.
9344+ *
9345+ * This program is distributed in the hope that it will be useful,
9346+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
9347+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9348+ * GNU General Public License for more details.
9349+ *
9350+ * You should have received a copy of the GNU General Public License
9351+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
9352+ */
9353+
9354+#ifndef KEEPASSX_TESTEXPORTER_H
9355+#define KEEPASSX_TESTEXPORTER_H
9356+
9357+#include <QObject>
9358+
9359+class TestExporter : public QObject
9360+{
9361+ Q_OBJECT
9362+
9363+private Q_SLOTS:
9364+ void initTestCase();
9365+ void testToDbExporter();
9366+};
9367+
9368+#endif // KEEPASSX_TESTEXPORTER_H
9369diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp
9370index 86b55b7..507cf15 100644
9371--- a/tests/TestGroup.cpp
9372+++ b/tests/TestGroup.cpp
9373@@ -27,11 +27,13 @@
9374 #include "core/Metadata.h"
9375 #include "crypto/Crypto.h"
9376
9377+QTEST_GUILESS_MAIN(TestGroup)
9378+
9379 void TestGroup::initTestCase()
9380 {
9381 qRegisterMetaType<Entry*>("Entry*");
9382 qRegisterMetaType<Group*>("Group*");
9383- Crypto::init();
9384+ QVERIFY(Crypto::init());
9385 }
9386
9387 void TestGroup::testParenting()
9388@@ -334,102 +336,6 @@ void TestGroup::testCopyCustomIcon()
9389 delete dbTarget;
9390 }
9391
9392-void TestGroup::testSearch()
9393-{
9394- Group* groupRoot = new Group();
9395- Group* group1 = new Group();
9396- Group* group2 = new Group();
9397- Group* group3 = new Group();
9398-
9399- group1->setParent(groupRoot);
9400- group2->setParent(groupRoot);
9401- group3->setParent(groupRoot);
9402-
9403- Group* group11 = new Group();
9404-
9405- group11->setParent(group1);
9406-
9407- Group* group21 = new Group();
9408- Group* group211 = new Group();
9409- Group* group2111 = new Group();
9410-
9411- group21->setParent(group2);
9412- group211->setParent(group21);
9413- group2111->setParent(group211);
9414-
9415- group1->setSearchingEnabled(Group::Disable);
9416- group11->setSearchingEnabled(Group::Enable);
9417-
9418- Entry* eRoot = new Entry();
9419- eRoot->setNotes("test search term test");
9420- eRoot->setGroup(groupRoot);
9421-
9422- Entry* eRoot2 = new Entry();
9423- eRoot2->setNotes("test term test");
9424- eRoot2->setGroup(groupRoot);
9425-
9426- Entry* e1 = new Entry();
9427- e1->setNotes("test search term test");
9428- e1->setGroup(group1);
9429-
9430- Entry* e2111 = new Entry();
9431- e2111->setNotes("test search term test");
9432- e2111->setGroup(group2111);
9433-
9434- Entry* e2111b = new Entry();
9435- e2111b->setNotes("test search test");
9436- e2111b->setGroup(group2111);
9437-
9438- Entry* e3 = new Entry();
9439- e3->setNotes("test search term test");
9440- e3->setGroup(group3);
9441-
9442- Entry* e3b = new Entry();
9443- e3b->setNotes("test search test");
9444- e3b->setGroup(group3);
9445-
9446- QList<Entry*> searchResult;
9447-
9448- searchResult = groupRoot->search("search term", Qt::CaseInsensitive);
9449- QCOMPARE(searchResult.count(), 3);
9450-
9451- searchResult = group211->search("search term", Qt::CaseInsensitive);
9452- QCOMPARE(searchResult.count(), 1);
9453-
9454- delete groupRoot;
9455-}
9456-
9457-void TestGroup::testAndConcatenationInSearch()
9458-{
9459- Group* group = new Group();
9460- Entry* entry = new Entry();
9461- entry->setNotes("abc def ghi");
9462- entry->setTitle("jkl");
9463- entry->setGroup(group);
9464-
9465- QList<Entry*> searchResult;
9466-
9467- searchResult = group->search("", Qt::CaseInsensitive);
9468- QCOMPARE(searchResult.count(), 1);
9469-
9470- searchResult = group->search("def", Qt::CaseInsensitive);
9471- QCOMPARE(searchResult.count(), 1);
9472-
9473- searchResult = group->search(" abc ghi ", Qt::CaseInsensitive);
9474- QCOMPARE(searchResult.count(), 1);
9475-
9476- searchResult = group->search("ghi ef", Qt::CaseInsensitive);
9477- QCOMPARE(searchResult.count(), 1);
9478-
9479- searchResult = group->search("abc ef xyz", Qt::CaseInsensitive);
9480- QCOMPARE(searchResult.count(), 0);
9481-
9482- searchResult = group->search("abc kl", Qt::CaseInsensitive);
9483- QCOMPARE(searchResult.count(), 1);
9484-
9485- delete group;
9486-}
9487-
9488 void TestGroup::testClone()
9489 {
9490 Database* db = new Database();
9491@@ -536,49 +442,3 @@ void TestGroup::testCopyCustomIcons()
9492 QCOMPARE(metaTarget->customIcon(group1Icon).pixel(0, 0), qRgb(1, 2, 3));
9493 QCOMPARE(metaTarget->customIcon(group2Icon).pixel(0, 0), qRgb(4, 5, 6));
9494 }
9495-
9496-void TestGroup::testExportToDb()
9497-{
9498- QImage iconImage(1, 1, QImage::Format_RGB32);
9499- iconImage.setPixel(0, 0, qRgb(1, 2, 3));
9500- Uuid iconUuid = Uuid::random();
9501-
9502- QImage iconUnusedImage(1, 1, QImage::Format_RGB32);
9503- iconUnusedImage.setPixel(0, 0, qRgb(1, 2, 3));
9504- Uuid iconUnusedUuid = Uuid::random();
9505-
9506- Database* dbOrg = new Database();
9507- Group* groupOrg = new Group();
9508- groupOrg->setParent(dbOrg->rootGroup());
9509- groupOrg->setName("GTEST");
9510- Entry* entryOrg = new Entry();
9511- entryOrg->setGroup(groupOrg);
9512- entryOrg->setTitle("ETEST");
9513- dbOrg->metadata()->addCustomIcon(iconUuid, iconImage);
9514- dbOrg->metadata()->addCustomIcon(iconUnusedUuid, iconUnusedImage);
9515- entryOrg->setIcon(iconUuid);
9516- entryOrg->beginUpdate();
9517- entryOrg->setIcon(Entry::DefaultIconNumber);
9518- entryOrg->endUpdate();
9519-
9520- Database* dbExp = groupOrg->exportToDb();
9521- QCOMPARE(dbExp->rootGroup()->children().size(), 1);
9522- Group* groupExp = dbExp->rootGroup()->children().first();
9523- QVERIFY(groupExp != groupOrg);
9524- QCOMPARE(groupExp->name(), groupOrg->name());
9525- QCOMPARE(groupExp->entries().size(), 1);
9526-
9527- Entry* entryExp = groupExp->entries().first();
9528- QCOMPARE(entryExp->title(), entryOrg->title());
9529- QCOMPARE(dbExp->metadata()->customIcons().size(), 1);
9530- QVERIFY(dbExp->metadata()->containsCustomIcon(iconUuid));
9531- QCOMPARE(entryExp->iconNumber(), entryOrg->iconNumber());
9532-
9533- QCOMPARE(entryExp->historyItems().size(), 1);
9534- QCOMPARE(entryExp->historyItems().first()->iconUuid(), iconUuid);
9535-
9536- delete dbOrg;
9537- delete dbExp;
9538-}
9539-
9540-QTEST_GUILESS_MAIN(TestGroup)
9541diff --git a/tests/TestGroup.h b/tests/TestGroup.h
9542index 895c2cc..c612a3a 100644
9543--- a/tests/TestGroup.h
9544+++ b/tests/TestGroup.h
9545@@ -31,11 +31,8 @@ private Q_SLOTS:
9546 void testEntries();
9547 void testDeleteSignals();
9548 void testCopyCustomIcon();
9549- void testSearch();
9550- void testAndConcatenationInSearch();
9551 void testClone();
9552 void testCopyCustomIcons();
9553- void testExportToDb();
9554 };
9555
9556 #endif // KEEPASSX_TESTGROUP_H
9557diff --git a/tests/TestGroupModel.cpp b/tests/TestGroupModel.cpp
9558index a16386c..32a4b8e 100644
9559--- a/tests/TestGroupModel.cpp
9560+++ b/tests/TestGroupModel.cpp
9561@@ -27,10 +27,12 @@
9562 #include "crypto/Crypto.h"
9563 #include "gui/group/GroupModel.h"
9564
9565+QTEST_GUILESS_MAIN(TestGroupModel)
9566+
9567 void TestGroupModel::initTestCase()
9568 {
9569 qRegisterMetaType<QModelIndex>("QModelIndex");
9570- Crypto::init();
9571+ QVERIFY(Crypto::init());
9572 }
9573
9574 void TestGroupModel::test()
9575@@ -149,5 +151,3 @@ void TestGroupModel::test()
9576 delete modelTest;
9577 delete model;
9578 }
9579-
9580-QTEST_GUILESS_MAIN(TestGroupModel)
9581diff --git a/tests/TestHashedBlockStream.cpp b/tests/TestHashedBlockStream.cpp
9582index ab7d386..09179fe 100644
9583--- a/tests/TestHashedBlockStream.cpp
9584+++ b/tests/TestHashedBlockStream.cpp
9585@@ -24,9 +24,11 @@
9586 #include "crypto/Crypto.h"
9587 #include "streams/HashedBlockStream.h"
9588
9589+QTEST_GUILESS_MAIN(TestHashedBlockStream)
9590+
9591 void TestHashedBlockStream::initTestCase()
9592 {
9593- Crypto::init();
9594+ QVERIFY(Crypto::init());
9595 }
9596
9597 void TestHashedBlockStream::testWriteRead()
9598@@ -69,5 +71,3 @@ void TestHashedBlockStream::testWriteRead()
9599 buffer.reset();
9600 buffer.buffer().clear();
9601 }
9602-
9603-QTEST_GUILESS_MAIN(TestHashedBlockStream)
9604diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp
9605index 3ec4e78..249a365 100644
9606--- a/tests/TestKeePass1Reader.cpp
9607+++ b/tests/TestKeePass1Reader.cpp
9608@@ -33,9 +33,11 @@
9609 #include "keys/FileKey.h"
9610 #include "keys/PasswordKey.h"
9611
9612+QTEST_GUILESS_MAIN(TestKeePass1Reader)
9613+
9614 void TestKeePass1Reader::initTestCase()
9615 {
9616- Crypto::init();
9617+ QVERIFY(Crypto::init());
9618
9619 QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/basic.kdb");
9620
9621@@ -292,5 +294,3 @@ void TestKeePass1Reader::reopenDatabase(Database* db, const QString& password, c
9622 QVERIFY(!reader.hasError());
9623 delete newDb;
9624 }
9625-
9626-QTEST_GUILESS_MAIN(TestKeePass1Reader)
9627diff --git a/tests/TestKeePass2RandomStream.cpp b/tests/TestKeePass2RandomStream.cpp
9628index 74a1540..7963e9a 100644
9629--- a/tests/TestKeePass2RandomStream.cpp
9630+++ b/tests/TestKeePass2RandomStream.cpp
9631@@ -26,9 +26,11 @@
9632 #include "format/KeePass2.h"
9633 #include "format/KeePass2RandomStream.h"
9634
9635+QTEST_GUILESS_MAIN(TestKeePass2RandomStream)
9636+
9637 void TestKeePass2RandomStream::initTestCase()
9638 {
9639- Crypto::init();
9640+ QVERIFY(Crypto::init());
9641 }
9642
9643 void TestKeePass2RandomStream::test()
9644@@ -77,5 +79,3 @@ void TestKeePass2RandomStream::test()
9645 QCOMPARE(cipherData, cipherDataEncrypt);
9646 QCOMPARE(randomStreamData, cipherData);
9647 }
9648-
9649-QTEST_GUILESS_MAIN(TestKeePass2RandomStream)
9650diff --git a/tests/TestKeePass2Reader.cpp b/tests/TestKeePass2Reader.cpp
9651index 6b1ee1e..d6cb70c 100644
9652--- a/tests/TestKeePass2Reader.cpp
9653+++ b/tests/TestKeePass2Reader.cpp
9654@@ -28,9 +28,11 @@
9655 #include "format/KeePass2Reader.h"
9656 #include "keys/PasswordKey.h"
9657
9658+QTEST_GUILESS_MAIN(TestKeePass2Reader)
9659+
9660 void TestKeePass2Reader::initTestCase()
9661 {
9662- Crypto::init();
9663+ QVERIFY(Crypto::init());
9664 }
9665
9666 void TestKeePass2Reader::testNonAscii()
9667@@ -154,5 +156,3 @@ void TestKeePass2Reader::testFormat300()
9668
9669 delete db;
9670 }
9671-
9672-QTEST_GUILESS_MAIN(TestKeePass2Reader)
9673diff --git a/tests/TestKeePass2Writer.cpp b/tests/TestKeePass2Writer.cpp
9674index bbc4992..cf4ab1c 100644
9675--- a/tests/TestKeePass2Writer.cpp
9676+++ b/tests/TestKeePass2Writer.cpp
9677@@ -29,9 +29,11 @@
9678 #include "format/KeePass2Writer.h"
9679 #include "keys/PasswordKey.h"
9680
9681+QTEST_GUILESS_MAIN(TestKeePass2Writer)
9682+
9683 void TestKeePass2Writer::initTestCase()
9684 {
9685- Crypto::init();
9686+ QVERIFY(Crypto::init());
9687
9688 CompositeKey key;
9689 key.addKey(PasswordKey("test"));
9690@@ -104,5 +106,3 @@ void TestKeePass2Writer::cleanupTestCase()
9691 delete m_dbOrg;
9692 delete m_dbTest;
9693 }
9694-
9695-QTEST_GUILESS_MAIN(TestKeePass2Writer)
9696diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2XmlReader.cpp
9697index ca57db9..8e87d67 100644
9698--- a/tests/TestKeePass2XmlReader.cpp
9699+++ b/tests/TestKeePass2XmlReader.cpp
9700@@ -28,6 +28,8 @@
9701 #include "format/KeePass2XmlReader.h"
9702 #include "config-keepassx-tests.h"
9703
9704+QTEST_GUILESS_MAIN(TestKeePass2XmlReader)
9705+
9706 namespace QTest {
9707 template<>
9708 char* toString(const Uuid& uuid)
9709@@ -66,7 +68,7 @@ QDateTime TestKeePass2XmlReader::genDT(int year, int month, int day, int hour, i
9710
9711 void TestKeePass2XmlReader::initTestCase()
9712 {
9713- Crypto::init();
9714+ QVERIFY(Crypto::init());
9715
9716 KeePass2XmlReader reader;
9717 QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml");
9718@@ -378,5 +380,3 @@ void TestKeePass2XmlReader::cleanupTestCase()
9719 {
9720 delete m_db;
9721 }
9722-
9723-QTEST_GUILESS_MAIN(TestKeePass2XmlReader)
9724diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp
9725index ec9a35b..d6758d6 100644
9726--- a/tests/TestKeys.cpp
9727+++ b/tests/TestKeys.cpp
9728@@ -31,9 +31,11 @@
9729 #include "keys/FileKey.h"
9730 #include "keys/PasswordKey.h"
9731
9732+QTEST_GUILESS_MAIN(TestKeys)
9733+
9734 void TestKeys::initTestCase()
9735 {
9736- Crypto::init();
9737+ QVERIFY(Crypto::init());
9738 }
9739
9740 void TestKeys::testComposite()
9741@@ -184,5 +186,3 @@ void TestKeys::benchmarkTransformKey()
9742 compositeKey.transform(seed, 1e6);
9743 }
9744 }
9745-
9746-QTEST_GUILESS_MAIN(TestKeys)
9747diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp
9748index 864ea1c..e275e83 100644
9749--- a/tests/TestModified.cpp
9750+++ b/tests/TestModified.cpp
9751@@ -27,9 +27,11 @@
9752 #include "core/Tools.h"
9753 #include "crypto/Crypto.h"
9754
9755+QTEST_GUILESS_MAIN(TestModified)
9756+
9757 void TestModified::initTestCase()
9758 {
9759- Crypto::init();
9760+ QVERIFY(Crypto::init());
9761 }
9762
9763 void TestModified::testSignals()
9764@@ -466,5 +468,3 @@ void TestModified::testHistoryItem()
9765
9766 delete db;
9767 }
9768-
9769-QTEST_GUILESS_MAIN(TestModified)
9770diff --git a/tests/TestQCommandLineParser.cpp b/tests/TestQCommandLineParser.cpp
9771index d487862..4e2c635 100644
9772--- a/tests/TestQCommandLineParser.cpp
9773+++ b/tests/TestQCommandLineParser.cpp
9774@@ -46,6 +46,8 @@
9775 #include "tests.h"
9776 #include "core/qcommandlineparser.h"
9777
9778+QTEST_GUILESS_MAIN(TestQCommandLineParser)
9779+
9780 Q_DECLARE_METATYPE(char**)
9781
9782 static char *empty_argv[] = { 0 };
9783@@ -412,5 +414,3 @@ void TestQCommandLineParser::testSingleDashWordOptionModes()
9784 QCOMPARE(parser.value(parser.optionNames().at(i)), expectedOptionValues.at(i));
9785 QCOMPARE(parser.unknownOptionNames(), QStringList());
9786 }
9787-
9788-QTEST_GUILESS_MAIN(TestQCommandLineParser)
9789diff --git a/tests/TestQSaveFile.cpp b/tests/TestQSaveFile.cpp
9790index bccee0e..443db52 100644
9791--- a/tests/TestQSaveFile.cpp
9792+++ b/tests/TestQSaveFile.cpp
9793@@ -29,6 +29,8 @@
9794 #include "tests.h"
9795 #include "core/qsavefile.h"
9796
9797+QTEST_GUILESS_MAIN(TestQSaveFile)
9798+
9799 class DirCleanup
9800 {
9801 public:
9802@@ -154,6 +156,9 @@ void TestQSaveFile::transactionalWriteCanceled()
9803 void TestQSaveFile::transactionalWriteErrorRenaming()
9804 {
9805 #ifndef Q_OS_WIN
9806+ if (::geteuid() == 0) {
9807+ QSKIP("not valid running this test as root", SkipAll);
9808+ }
9809 const QString dir = tmpDir();
9810 QVERIFY(!dir.isEmpty());
9811 const QString targetFile = dir + QString::fromLatin1("/outfile");
9812@@ -197,5 +202,3 @@ QString TestQSaveFile::tmpDir()
9813
9814 return dirName;
9815 }
9816-
9817-QTEST_GUILESS_MAIN(TestQSaveFile)
9818diff --git a/tests/TestRandom.cpp b/tests/TestRandom.cpp
9819index 8ac570e..40ab702 100644
9820--- a/tests/TestRandom.cpp
9821+++ b/tests/TestRandom.cpp
9822@@ -22,6 +22,8 @@
9823
9824 #include <QTest>
9825
9826+QTEST_GUILESS_MAIN(TestRandom)
9827+
9828 void TestRandom::initTestCase()
9829 {
9830 m_backend = new RandomBackendTest();
9831@@ -93,5 +95,3 @@ void RandomBackendTest::setNextBytes(const QByteArray& nextBytes)
9832 m_nextBytes = nextBytes;
9833 m_bytesIndex = 0;
9834 }
9835-
9836-QTEST_GUILESS_MAIN(TestRandom)
9837diff --git a/tests/TestSymmetricCipher.cpp b/tests/TestSymmetricCipher.cpp
9838index b47a005..6d4e94f 100644
9839--- a/tests/TestSymmetricCipher.cpp
9840+++ b/tests/TestSymmetricCipher.cpp
9841@@ -25,9 +25,11 @@
9842 #include "crypto/SymmetricCipher.h"
9843 #include "streams/SymmetricCipherStream.h"
9844
9845+QTEST_GUILESS_MAIN(TestSymmetricCipher)
9846+
9847 void TestSymmetricCipher::initTestCase()
9848 {
9849- Crypto::init();
9850+ QVERIFY(Crypto::init());
9851 }
9852
9853 void TestSymmetricCipher::testAes256CbcEncryption()
9854@@ -192,5 +194,3 @@ void TestSymmetricCipher::testPadding()
9855 QByteArray decrypted = streamDec.readAll();
9856 QCOMPARE(decrypted, plainText);
9857 }
9858-
9859-QTEST_GUILESS_MAIN(TestSymmetricCipher)
9860diff --git a/tests/TestWildcardMatcher.cpp b/tests/TestWildcardMatcher.cpp
9861index e06125b..dc9991d 100644
9862--- a/tests/TestWildcardMatcher.cpp
9863+++ b/tests/TestWildcardMatcher.cpp
9864@@ -22,6 +22,8 @@
9865 #include "tests.h"
9866 #include "autotype/WildcardMatcher.h"
9867
9868+QTEST_GUILESS_MAIN(TestWildcardMatcher)
9869+
9870 const QString TestWildcardMatcher::DefaultText = QString("some text");
9871 const QString TestWildcardMatcher::AlternativeText = QString("some other text");
9872
9873@@ -82,5 +84,3 @@ void TestWildcardMatcher::verifyNoMatch(QString pattern)
9874 bool matchResult = m_matcher->match(pattern);
9875 QVERIFY(!matchResult);
9876 }
9877-
9878-QTEST_GUILESS_MAIN(TestWildcardMatcher)
9879diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp
9880index a4d04c5..326c349 100644
9881--- a/tests/gui/TestGui.cpp
9882+++ b/tests/gui/TestGui.cpp
9883@@ -51,7 +51,7 @@
9884
9885 void TestGui::initTestCase()
9886 {
9887- Crypto::init();
9888+ QVERIFY(Crypto::init());
9889 Config::createTempFileInstance();
9890 m_mainWindow = new MainWindow();
9891 m_tabWidget = m_mainWindow->findChild<DatabaseTabWidget*>("tabWidget");
9892@@ -83,7 +83,7 @@ void TestGui::testTabs()
9893
9894 void TestGui::testEditEntry()
9895 {
9896- EntryView* entryView = m_dbWidget->entryView();
9897+ EntryView* entryView = m_dbWidget->findChild<EntryView*>("entryView");
9898 QModelIndex item = entryView->model()->index(0, 1);
9899 QRect itemRect = entryView->visualRect(item);
9900 QTest::mouseClick(entryView->viewport(), Qt::LeftButton, Qt::NoModifier, itemRect.center());
9901@@ -237,8 +237,8 @@ void TestGui::testSearch()
9902
9903 void TestGui::testDeleteEntry()
9904 {
9905- GroupView* groupView = m_dbWidget->groupView();
9906- EntryView* entryView = m_dbWidget->entryView();
9907+ GroupView* groupView = m_dbWidget->findChild<GroupView*>("groupView");
9908+ EntryView* entryView = m_dbWidget->findChild<EntryView*>("entryView");
9909 QToolBar* toolBar = m_mainWindow->findChild<QToolBar*>("toolBar");
9910 QAction* entryDeleteAction = m_mainWindow->findChild<QAction*>("actionEntryDelete");
9911 QWidget* entryDeleteWidget = toolBar->widgetForAction(entryDeleteAction);
9912@@ -274,7 +274,7 @@ void TestGui::testDeleteEntry()
9913
9914 void TestGui::testCloneEntry()
9915 {
9916- EntryView* entryView = m_dbWidget->entryView();
9917+ EntryView* entryView = m_dbWidget->findChild<EntryView*>("entryView");
9918
9919 QCOMPARE(entryView->model()->rowCount(), 1);
9920
9921@@ -292,8 +292,8 @@ void TestGui::testCloneEntry()
9922
9923 void TestGui::testDragAndDropEntry()
9924 {
9925- EntryView* entryView = m_dbWidget->entryView();
9926- GroupView* groupView = m_dbWidget->groupView();
9927+ EntryView* entryView = m_dbWidget->findChild<EntryView*>("entryView");
9928+ GroupView* groupView = m_dbWidget->findChild<GroupView*>("groupView");
9929 QAbstractItemModel* groupModel = groupView->model();
9930
9931 QModelIndex sourceIndex = entryView->model()->index(0, 1);
9932@@ -314,7 +314,7 @@ void TestGui::testDragAndDropEntry()
9933
9934 void TestGui::testDragAndDropGroup()
9935 {
9936- QAbstractItemModel* groupModel = m_dbWidget->groupView()->model();
9937+ QAbstractItemModel* groupModel = m_dbWidget->findChild<GroupView*>("groupView")->model();
9938 QModelIndex rootIndex = groupModel->index(0, 0);
9939
9940 dragAndDropGroup(groupModel->index(0, 0, rootIndex),
9941@@ -453,7 +453,7 @@ void TestGui::dragAndDropGroup(const QModelIndex& sourceIndex, const QModelIndex
9942 QVERIFY(sourceIndex.isValid());
9943 QVERIFY(targetIndex.isValid());
9944
9945- GroupModel* groupModel = qobject_cast<GroupModel*>(m_dbWidget->groupView()->model());
9946+ GroupModel* groupModel = qobject_cast<GroupModel*>(m_dbWidget->findChild<GroupView*>("groupView")->model());
9947
9948 QMimeData mimeData;
9949 QByteArray encoded;
9950diff --git a/tests/gui/TestGuiPixmaps.cpp b/tests/gui/TestGuiPixmaps.cpp
9951index 401f68b..87e3f24 100644
9952--- a/tests/gui/TestGuiPixmaps.cpp
9953+++ b/tests/gui/TestGuiPixmaps.cpp
9954@@ -29,7 +29,7 @@
9955
9956 void TestGuiPixmaps::initTestCase()
9957 {
9958- Crypto::init();
9959+ QVERIFY(Crypto::init());
9960 }
9961
9962 void TestGuiPixmaps::testDatabaseIcons()
9963diff --git a/utils/kdbx-extract.cpp b/utils/kdbx-extract.cpp
9964index beee71d..f5d2a19 100644
9965--- a/utils/kdbx-extract.cpp
9966+++ b/utils/kdbx-extract.cpp
9967@@ -38,7 +38,9 @@ int main(int argc, char **argv)
9968 return 1;
9969 }
9970
9971- Crypto::init();
9972+ if (!Crypto::init()) {
9973+ qFatal("Fatal error while testing the cryptographic functions:\n%s", qPrintable(Crypto::errorString()));
9974+ }
9975
9976 CompositeKey key;
9977 if (QFile::exists(app.arguments().at(1))) {
This page took 1.36621 seconds and 5 git commands to generate.