]> git.pld-linux.org Git - packages/KeePassX.git/blob - git.patch
- added update to current git master
[packages/KeePassX.git] / git.patch
1 diff --git a/.travis.yml b/.travis.yml
2 new file mode 100644
3 index 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
26 diff --git a/.tx/config b/.tx/config
27 new file mode 100644
28 index 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
40 diff --git a/CHANGELOG b/CHANGELOG
41 index 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]
50 diff --git a/CMakeLists.txt b/CMakeLists.txt
51 index 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"))
73 diff --git a/INSTALL b/INSTALL
74 index 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:
86 diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt
87 index 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)
99 diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt
100 new file mode 100644
101 index 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)
131 diff --git a/share/translations/keepassx_de.ts b/share/translations/keepassx_de.ts
132 new file mode 100644
133 index 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
1315 diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts
1316 new file mode 100644
1317 index 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>
2537 diff --git a/share/translations/keepassx_en_plurals.ts b/share/translations/keepassx_en_plurals.ts
2538 new file mode 100644
2539 index 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>
2584 diff --git a/share/translations/keepassx_it.ts b/share/translations/keepassx_it.ts
2585 new file mode 100644
2586 index 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
3770 diff --git a/share/translations/keepassx_nl_NL.ts b/share/translations/keepassx_nl_NL.ts
3771 new file mode 100644
3772 index 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
4955 diff --git a/share/translations/keepassx_sv.ts b/share/translations/keepassx_sv.ts
4956 new file mode 100644
4957 index 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
6140 diff --git a/share/translations/update.sh b/share/translations/update.sh
6141 new file mode 100755
6142 index 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
6154 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
6155 index 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
6192 diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp
6193 index 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          }
6238 diff --git a/src/autotype/x11/AutoTypeX11.cpp b/src/autotype/x11/AutoTypeX11.cpp
6239 index 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) {
6272 diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake
6273 index 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  
6284 diff --git a/src/core/Config.cpp b/src/core/Config.cpp
6285 index 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);
6325 diff --git a/src/core/Config.h b/src/core/Config.h
6326 index 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:
6338 diff --git a/src/core/Database.cpp b/src/core/Database.cpp
6339 index 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());
6351 diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp
6352 index 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;
6381 diff --git a/src/core/Entry.h b/src/core/Entry.h
6382 index 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  
6401 diff --git a/src/core/EntrySearcher.cpp b/src/core/EntrySearcher.cpp
6402 new file mode 100644
6403 index 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 +}
6472 diff --git a/src/core/EntrySearcher.h b/src/core/EntrySearcher.h
6473 new file mode 100644
6474 index 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
6515 diff --git a/src/core/Exporter.h b/src/core/Exporter.h
6516 new file mode 100644
6517 index 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
6535 diff --git a/src/core/Group.cpp b/src/core/Group.cpp
6536 index 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;
6617 diff --git a/src/core/Group.h b/src/core/Group.h
6618 index 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;
6649 diff --git a/src/core/ToDbExporter.cpp b/src/core/ToDbExporter.cpp
6650 new file mode 100644
6651 index 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 +}
6694 diff --git a/src/core/ToDbExporter.h b/src/core/ToDbExporter.h
6695 new file mode 100644
6696 index 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
6733 diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp
6734 new file mode 100644
6735 index 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 +}
6859 diff --git a/src/core/Translator.h b/src/core/Translator.h
6860 new file mode 100644
6861 index 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
6901 diff --git a/src/crypto/Crypto.cpp b/src/crypto/Crypto.cpp
6902 index 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 +}
7043 diff --git a/src/crypto/Crypto.h b/src/crypto/Crypto.h
7044 index 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
7075 diff --git a/src/gui/Clipboard.cpp b/src/gui/Clipboard.cpp
7076 index 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()
7111 diff --git a/src/gui/Clipboard.h b/src/gui/Clipboard.h
7112 index 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() {
7123 diff --git a/src/gui/DatabaseOpenWidget.cpp b/src/gui/DatabaseOpenWidget.cpp
7124 index 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);
7147 diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp
7148 index 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) {
7205 diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h
7206 index 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
7250 diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp
7251 index 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 +}
7567 diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h
7568 index 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  
7666 diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp
7667 new file mode 100644
7668 index 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 +}
7826 diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h
7827 new file mode 100644
7828 index 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
7886 diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp
7887 index 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      }
7900 diff --git a/src/gui/KeePass1OpenWidget.cpp b/src/gui/KeePass1OpenWidget.cpp
7901 index 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  }
7915 diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp
7916 index 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  }
8123 diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h
8124 index 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  };
8170 diff --git a/src/gui/PasswordComboBox.cpp b/src/gui/PasswordComboBox.cpp
8171 index 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
8189 diff --git a/src/gui/PasswordEdit.cpp b/src/gui/PasswordEdit.cpp
8190 index 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()) {
8206 diff --git a/src/gui/PasswordGeneratorWidget.ui b/src/gui/PasswordGeneratorWidget.ui
8207 index 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>
8246 diff --git a/src/gui/SearchWidget.ui b/src/gui/SearchWidget.ui
8247 index 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>
8296 diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp
8297 index 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  
8374 diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui
8375 index 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>
8493 diff --git a/src/gui/SettingsWidgetSecurity.ui b/src/gui/SettingsWidgetSecurity.ui
8494 index 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>
8511 diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp
8512 index 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;
8552 diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp
8553 index 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)
8611 diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h
8612 index 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);
8629 diff --git a/src/gui/group/EditGroupWidget.cpp b/src/gui/group/EditGroupWidget.cpp
8630 index 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  }
8680 diff --git a/src/gui/group/EditGroupWidget.h b/src/gui/group/EditGroupWidget.h
8681 index 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  
8693 diff --git a/src/gui/group/EditGroupWidgetMain.ui b/src/gui/group/EditGroupWidgetMain.ui
8694 index 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>
8706 diff --git a/src/main.cpp b/src/main.cpp
8707 index 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);
8749 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
8750 index 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)
8774 diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp
8775 index 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 +}
8917 diff --git a/tests/TestAutoType.h b/tests/TestAutoType.h
8918 index 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
8941 diff --git a/tests/TestCryptoHash.cpp b/tests/TestCryptoHash.cpp
8942 index 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)
8971 diff --git a/tests/TestDeletedObjects.cpp b/tests/TestDeletedObjects.cpp
8972 index 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)
8994 diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp
8995 index 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)
9017 diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp
9018 index 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)
9041 diff --git a/tests/TestEntrySearcher.cpp b/tests/TestEntrySearcher.cpp
9042 new file mode 100644
9043 index 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 +}
9191 diff --git a/tests/TestEntrySearcher.h b/tests/TestEntrySearcher.h
9192 new file mode 100644
9193 index 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
9242 diff --git a/tests/TestExporter.cpp b/tests/TestExporter.cpp
9243 new file mode 100644
9244 index 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 +
9330 diff --git a/tests/TestExporter.h b/tests/TestExporter.h
9331 new file mode 100644
9332 index 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
9369 diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp
9370 index 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)
9541 diff --git a/tests/TestGroup.h b/tests/TestGroup.h
9542 index 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
9557 diff --git a/tests/TestGroupModel.cpp b/tests/TestGroupModel.cpp
9558 index 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)
9581 diff --git a/tests/TestHashedBlockStream.cpp b/tests/TestHashedBlockStream.cpp
9582 index 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)
9604 diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp
9605 index 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)
9627 diff --git a/tests/TestKeePass2RandomStream.cpp b/tests/TestKeePass2RandomStream.cpp
9628 index 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)
9650 diff --git a/tests/TestKeePass2Reader.cpp b/tests/TestKeePass2Reader.cpp
9651 index 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)
9673 diff --git a/tests/TestKeePass2Writer.cpp b/tests/TestKeePass2Writer.cpp
9674 index 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)
9696 diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2XmlReader.cpp
9697 index 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)
9724 diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp
9725 index 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)
9747 diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp
9748 index 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)
9770 diff --git a/tests/TestQCommandLineParser.cpp b/tests/TestQCommandLineParser.cpp
9771 index 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)
9789 diff --git a/tests/TestQSaveFile.cpp b/tests/TestQSaveFile.cpp
9790 index 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)
9818 diff --git a/tests/TestRandom.cpp b/tests/TestRandom.cpp
9819 index 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)
9837 diff --git a/tests/TestSymmetricCipher.cpp b/tests/TestSymmetricCipher.cpp
9838 index 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)
9860 diff --git a/tests/TestWildcardMatcher.cpp b/tests/TestWildcardMatcher.cpp
9861 index 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)
9879 diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp
9880 index 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;
9950 diff --git a/tests/gui/TestGuiPixmaps.cpp b/tests/gui/TestGuiPixmaps.cpp
9951 index 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()
9963 diff --git a/utils/kdbx-extract.cpp b/utils/kdbx-extract.cpp
9964 index 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.676553 seconds and 4 git commands to generate.