Compare commits

...

24 Commits

Author SHA1 Message Date
Felix Geyer
a954e9a4d8 Update translations. 2015-09-06 23:41:29 +02:00
Felix Geyer
95c449481e Prepare beta 2 release. 2015-09-06 23:39:54 +02:00
Felix Geyer
0b43607aa1 Make sure we use the native file dialog on Windows and OS X. 2015-09-06 13:32:12 +02:00
Felix Geyer
e75efb8bfb Improve setting the default file extension in FileDialog.
Largely from PR #105 by Charles Brunet <charles@cbrunet.net>
2015-09-05 19:10:26 +02:00
Felix Geyer
d83fee89bd Fix building WITH_CXX11 on OS X. 2015-09-05 19:03:24 +02:00
Felix Geyer
98417d6465 Set default extension when selected filename doesn't have one.
Closes #79
2015-07-25 18:16:33 +02:00
Felix Geyer
0ea64afe92 Fix type of default value for options. 2015-07-25 18:13:57 +02:00
Felix Geyer
a862f62fe8 Set a default filename when saving a new database.
Closes #308
2015-07-25 17:47:45 +02:00
Felix Geyer
5bd525a6dd Use correct keycode when unregistering global shortcuts.
charToKeySym() is already correctly used in registerGlobalShortcut().
2015-07-22 20:38:03 +02:00
Felix Geyer
af3d896bdf Make setNativeLocks() non-fatal on OS X. 2015-07-21 23:12:20 +02:00
Felix Geyer
ceeb72a277 Pull QLockFile updates from the qtbase repository. 2015-07-21 23:11:02 +02:00
Felix Geyer
2c17fdcff0 Correct link order of testhashedblockstream.
Fixes FTBFS on Windows.
2015-07-21 23:08:12 +02:00
Florian Geyer
41a7c96968 Close search before locking database and add additional check on current group.
Closes #309.
2015-07-20 22:45:57 +02:00
Felix Geyer
98d9dae087 Test if reset() and close() write only one final block. 2015-07-20 21:51:32 +02:00
Felix Geyer
2033174d95 Test if we correctly detect errors when writing. 2015-07-20 21:35:48 +02:00
Felix Geyer
606e36acf3 Detect and display more errors when writing databases. 2015-07-20 21:35:48 +02:00
Felix Geyer
0422943d52 Explicitly close/reset streams so we can detect errors. 2015-07-20 21:35:48 +02:00
Felix Geyer
0024f2e30f Signal errors in QXmlStreamWriter upstream.
Unfortunately the method is only avaiable in Qt >= 4.8.
Not much we can do about that.
2015-07-20 21:35:43 +02:00
Felix Geyer
abe5e8ecea Don't write final block(s) if we already have. 2015-07-20 21:33:51 +02:00
Felix Geyer
61503a8047 SymmetricCipherStream: Add error handling when reading from the device. 2015-07-20 19:54:18 +02:00
Felix Geyer
fcb5deff0a SymmetricCipherStream: Fix error string when detecting an error while writing. 2015-07-20 19:53:17 +02:00
Felix Geyer
fdec16c3a0 Fix copyright file match for username-copy.png. 2015-07-19 21:16:22 +02:00
Felix Geyer
84ee8b993f Explicity hide the tray icon before deleting it.
In some conditions the tray icon stayed visible until the application
was closed.
Tested on Kubuntu 15.04 (KDE Plasma 5.2).
2015-07-19 21:14:08 +02:00
Felix Geyer
3d1c27ceb7 Copy the database in TestGui before opening it.
We don't want to create lock files in the source tree.
2015-07-19 19:33:47 +02:00
43 changed files with 1829 additions and 624 deletions

View File

@@ -1,3 +1,10 @@
2.0 Beta 2 (2015-09-06)
=========================
- Fix crash when locking with search UI open [#309]
- Fix file locking on Mac OS X [#327]
- Set default extension when saving a database [#79, #308]
2.0 Beta 1 (2015-07-18)
=========================

View File

@@ -34,8 +34,8 @@ option(WITH_GUI_TESTS "Enable building of GUI tests" OFF)
option(WITH_LTO "Enable Link Time Optimization (LTO)" OFF)
option(WITH_CXX11 "Build with the C++ 11 standard" ON)
set(KEEPASSX_VERSION "2.0 beta 1")
set(KEEPASSX_VERSION_NUM "1.9.91")
set(KEEPASSX_VERSION "2.0 beta 2")
set(KEEPASSX_VERSION_NUM "1.9.92")
if("${CMAKE_C_COMPILER}" MATCHES "clang$" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_COMPILER_IS_CLANG 1)
@@ -118,6 +118,9 @@ endif()
if (WITH_CXX11)
add_gcc_compiler_cxxflags("-std=c++0x")
add_gcc_compiler_cflags("-ansi")
if(APPLE)
add_gcc_compiler_cxxflags("-stdlib=libc++")
endif()
else()
add_gcc_compiler_flags("-ansi")
endif()

View File

@@ -139,10 +139,10 @@ Files: share/icons/application/*/actions/application-exit.png
share/icons/application/*/actions/password-copy.png
share/icons/application/*/actions/password-show-*.png
share/icons/application/*/actions/system-search.png
share/icons/application/*/actions/username-copy.png
share/icons/application/*/status/dialog-error.png
share/icons/application/*/status/dialog-information.png
share/icons/application/*/status/dialog-warning.png
share/icons/application/*/status/username-copy.png
share/icons/svg/*.svgz
Copyright: 2007, Nuno Pinheiro <nuno@oxygen-icons.org>
2007, David Vignoni <david@icon-king.com>

View File

@@ -3,7 +3,7 @@
<name>AboutDialog</name>
<message>
<source>About KeePassX</source>
<translation>O aplikaci KeePassX</translation>
<translation>O KeePassX</translation>
</message>
<message>
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
@@ -44,7 +44,7 @@
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation>Vyberte položku pro samočinné vyplňování:</translation>
<translation>Vyberte položku, kterou se bude samočinně vyplňovat:</translation>
</message>
</context>
<context>
@@ -103,11 +103,21 @@
</message>
<message>
<source>Do you really want to use an empty string as password?</source>
<translation>Opravdu chcete heslo ponechat nevyplněné?</translation>
<translation>Opravdu chcete ponechat bez hesla, tedy nechráněné?</translation>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Zadání hesla nejsou shodná.</translation>
<translation>Nepodařilo se vám zadat heslo tak, aby jeho znění bylo stejné v obou políčkách.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>Nezdařilo se nastavit soubor s klíčem</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Nezdařilo se nastavit %1 jako soubor s klíčem:
%2</translation>
</message>
</context>
<context>
@@ -138,7 +148,7 @@
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Soubor s klíčem nelze otevřít.</translation>
<translation>Soubor s klíčem se nedaří otevřít</translation>
</message>
<message>
<source>All files</source>
@@ -165,7 +175,7 @@
</message>
<message>
<source>Transform rounds:</source>
<translation>Počet průchodů:</translation>
<translation>Počet průchodů algoritmu:</translation>
</message>
<message>
<source>Default username:</source>
@@ -173,7 +183,7 @@
</message>
<message>
<source>Use recycle bin:</source>
<translation>Použít Koš:</translation>
<translation>Mazat do Koše:</translation>
</message>
<message>
<source> MiB</source>
@@ -185,11 +195,11 @@
</message>
<message>
<source>Max. history items:</source>
<translation>Nejvyšší umožněný položek historie:</translation>
<translation>Nejvyšší umožněný počet položek historie:</translation>
</message>
<message>
<source>Max. history size:</source>
<translation>Nejvyšší umožněná velikost historie:</translation>
<translation>Nejvyšší umožněný objem dat historie záznamů:</translation>
</message>
</context>
<context>
@@ -234,12 +244,6 @@
<source>Close?</source>
<translation>Zavřít?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>%1 je upravováno.
Přesto zavřít?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>Uložit změny?</translation>
@@ -270,6 +274,57 @@ Uložit změny?</translation>
<source>locked</source>
<translation>zamčeno</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation>Pro databázi, kterou se pokoušíte otevřít, existuje zámek úprav (stejnojmenný
.lock soubor). To znamená, že je nejspíš již otevřená v jiném okně KeePassX
(v případě sdíleného úložiště, třeba i na jiném počítači). Pokud tomu tak není,
je zámek nejspíš pozůstatkem předchozího neočekávaného ukončení aplikace
a je možné ho smazat. V každém případě, dotčenou databázi je možné otevřít
i tak, ale pouze pro čtení. Chcete?</translation>
</message>
<message>
<source>Lock database</source>
<translation>Uzamknout databázi</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation>Nelze uzamknout databázi, protože ji v tuto chvíli upravujete.
Pokud chcete změny dokončit, klikněte na Zrušit. V opačném případě změny zahodíte.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Tato databáze doposud ještě nebyla uložena.
Buď ji můžete uložit, nebo neuzamknout.</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation>Tato databáze byla upravena.
Chcete ji před uzamčením uložit?
Pokud ne, změny budou ztraceny.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export database to CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -283,7 +338,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
<translation>Opravdu chcete smazat položku %1?</translation>
<translation>Opravdu chcete nenávratně smazat položku %1?</translation>
</message>
<message>
<source>Delete entries?</source>
@@ -291,7 +346,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Do you really want to delete %1 entries for good?</source>
<translation>Opravdu chcete smazat %1 položek?</translation>
<translation>Opravdu chcete nenávratně smazat %1 položek?</translation>
</message>
<message>
<source>Move entries to recycle bin?</source>
@@ -299,7 +354,7 @@ Uložit změny?</translation>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Opravdu chcete přesunout %n položku do Koše?</numerusform><numerusform>Opravdu chcete přesunout %n položky do Koše?</numerusform><numerusform>Opravdu chcete přesunout %n položek do Koše?</numerusform></translation>
</message>
<message>
<source>Delete group?</source>
@@ -307,12 +362,20 @@ Uložit změny?</translation>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
<translation>Opravdu chcete smazat skupinu %1?</translation>
<translation>Opravdu chcete nenávratně smazat skupinu %1?</translation>
</message>
<message>
<source>Current group</source>
<translation>Stávající skupina</translation>
</message>
<message>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Nebylo možné vypočítat hlavní klíč</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -388,11 +451,11 @@ Uložit změny?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%n týden</numerusform><numerusform>%n týdny</numerusform><numerusform>%n týdnů</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%n měsíc</numerusform><numerusform>%n měsíce</numerusform><numerusform>%n měsíců</numerusform></translation>
</message>
<message>
<source>1 year</source>
@@ -425,12 +488,16 @@ Uložit změny?</translation>
<source>Save</source>
<translation>Uložit</translation>
</message>
<message>
<source>Open</source>
<translation>Otevřít</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
<translation>Zapnout samočinné vyplňování u této položky</translation>
<translation>Zapnout samočinné vyplňování této položky</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the group</source>
@@ -500,7 +567,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Gen.</source>
<translation>Obec.</translation>
<translation>Tvoř</translation>
</message>
<message>
<source>URL:</source>
@@ -576,6 +643,14 @@ Uložit změny?</translation>
<source>Auto-type</source>
<translation>Samočinné vyplňování</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>Použít výchozí posloupnost samočinného vyplňování z nadřazené skupiny</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Nastavit výchozí posloupnost samočinného vyplňování</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -613,26 +688,26 @@ Uložit změny?</translation>
</message>
<message numerus="yes">
<source>Can&apos;t delete icon. Still used by %n item(s).</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Ikonu není možné smazat. Je používána %n položkou.</numerusform><numerusform>Ikonu není možné smazat. Je používána %n položkami.</numerusform><numerusform>Ikonu není možné smazat. Je používána %n položek</numerusform></translation>
</message>
</context>
<context>
<name>EditWidgetProperties</name>
<message>
<source>Created:</source>
<translation>Vytvořeno:</translation>
<translation>Okamžik vytvoření:</translation>
</message>
<message>
<source>Modified:</source>
<translation>Čas poslední změny:</translation>
<translation>Okamžik poslední úpravy:</translation>
</message>
<message>
<source>Accessed:</source>
<translation>Čas posledního přístupu:</translation>
<translation>Okamžik posledního přístupu:</translation>
</message>
<message>
<source>Uuid:</source>
<translation>Uuid identifikátor:</translation>
<translation>Jedinečný identifikátor uživatele:</translation>
</message>
</context>
<context>
@@ -646,7 +721,7 @@ Uložit změny?</translation>
<name>EntryHistoryModel</name>
<message>
<source>Last modified</source>
<translation>Čas poslední změny</translation>
<translation>Okamžik poslední změny</translation>
</message>
<message>
<source>Title</source>
@@ -724,6 +799,10 @@ Uložit změny?</translation>
<source>Root</source>
<translation>Kořen</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Nelze spočítat hlavní klíč</translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -739,12 +818,16 @@ Uložit změny?</translation>
<source>Wrong key or database file is corrupt.</source>
<translation>Chybný klíč nebo je databáze poškozená.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Nelze spočítat hlavní klíč</translation>
</message>
</context>
<context>
<name>Main</name>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
<translation>Při testování šifrovacích funkcí došlo k fatální chybě.</translation>
<translation>Při ověřování šifrovacích funkcí byl zjištěn fatální nedostatek.</translation>
</message>
<message>
<source>KeePassX - Error</source>
@@ -777,10 +860,6 @@ Uložit změny?</translation>
<source>Groups</source>
<translation>Skupiny</translation>
</message>
<message>
<source>Extras</source>
<translation>Doplňující</translation>
</message>
<message>
<source>View</source>
<translation>Zobrazit</translation>
@@ -857,18 +936,10 @@ Uložit změny?</translation>
<source>Find</source>
<translation>Najít</translation>
</message>
<message>
<source>Username</source>
<translation>Uživatelské jméno</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Zkopírovat uživatelské jméno do schránky</translation>
</message>
<message>
<source>Password</source>
<translation>Heslo</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Zkopírovat heslo do schránky</translation>
@@ -913,6 +984,22 @@ Uložit změny?</translation>
<source>Toggle window</source>
<translation>Přepnout okno</translation>
</message>
<message>
<source>Tools</source>
<translation>Nástroje</translation>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -942,15 +1029,15 @@ Uložit změny?</translation>
</message>
<message>
<source>Special Characters</source>
<translation>Speciál znaky</translation>
<translation>Zvlášt znaky</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation>Vynechat podobně vypadající znaky</translation>
<translation>Vynechat podobně vypadající znaky (předejití záměně)</translation>
</message>
<message>
<source>Ensure that the password contains characters from every group</source>
<translation>Zajistit, aby heslo obsahovalo znaky ze všech zvolených skupin</translation>
<translation>Zajistit, aby heslo obsahovalo znaky ze všech zvolených skupin znaků</translation>
</message>
<message>
<source>Accept</source>
@@ -1004,7 +1091,7 @@ Uložit změny?</translation>
<name>QSaveFile</name>
<message>
<source>Existing file %1 is not writable</source>
<translation>Existující soubor %1 ne zapisovatelný</translation>
<translation>Do stávajícího souboru %1 nelze zapisovat</translation>
</message>
<message>
<source>Writing canceled by application</source>
@@ -1012,7 +1099,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Partial write. Partition full?</source>
<translation>Zápis nebylo možné dokončit zcela. Nedostatek volného místa?</translation>
<translation>Zápis nebylo možné zcela dokončit. Nedostatek volného místa?</translation>
</message>
</context>
<context>
@@ -1023,15 +1110,15 @@ Uložit změny?</translation>
</message>
<message>
<source>Error writing to underlying device: </source>
<translation>Chyba při zápisu na zařízení:</translation>
<translation>Při zápisu na zařízení, na kterém se nachází, došlo k chybě:</translation>
</message>
<message>
<source>Error opening underlying device: </source>
<translation>Chyba při otevírání zařízení:</translation>
<translation>Při otevírání zařízení, na kterém se nachází, došlo k chybě:</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
<translation>Chyba při čtení dat ze zařízení:</translation>
<translation>Při čtení dat ze zařízení, na kterém se nachází, došlo k chybě:</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
@@ -1042,7 +1129,7 @@ Uložit změny?</translation>
<name>QtIOCompressor::open</name>
<message>
<source>The gzip format not supported in this version of zlib.</source>
<translation>Formát tohoto gzip archivu není podporován touto verzí knihovny zlib.</translation>
<translation>Použitý formát gzip komprese není podporován verzí knihovny zlib, která je právě používána na tomto systému.</translation>
</message>
<message>
<source>Internal zlib error: </source>
@@ -1087,19 +1174,15 @@ Uložit změny?</translation>
<name>SettingsWidgetGeneral</name>
<message>
<source>Remember last databases</source>
<translation>Pamatovat si nedávno otevíra databáze</translation>
<translation>Pamatovat si nedávno otevře databáze</translation>
</message>
<message>
<source>Open previous databases on startup</source>
<translation>Při startu otevřít minule otevřenou databázi</translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation>Při změnách rozšířeného stavu označit jako změněné</translation>
<translation>Při spuštění aplikace otevřít minule otevřené databáze</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>i ukončování samočinně uložit</translation>
<translation>ed ukončením aplikace provést samočinné uložení případných změn v otevřených databázích</translation>
</message>
<message>
<source>Automatically save after every change</source>
@@ -1107,7 +1190,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Minimize when copying to clipboard</source>
<translation>Po zkopírování do schránky samočinně zminimalizovat aplikaci</translation>
<translation>Po zkopírování atributu do schránky samočinně minimalizovat okno KeePassX (do popředí se tak dostane okno, do kterého se zkopírovaný atribut bude vkládat)</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
@@ -1115,7 +1198,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
<translation>Všeobecná klávesová zkratka pro samočinné vyplňování</translation>
<translation>Klávesová zkratka pro všeobecné samočinné vyplňování</translation>
</message>
<message>
<source>Use entry title to match windows for global auto-type</source>
@@ -1127,11 +1210,15 @@ Uložit změny?</translation>
</message>
<message>
<source>Show a system tray icon</source>
<translation>Zobrazit ikonu v oznamovací oblasti</translation>
<translation>Zobrazit ikonu v oznamovací oblasti hlavního panelu prostředí</translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation>Minimalizovat do oznamovací oblasti</translation>
<translation>Minimalizovat okno aplikace do oznamovací oblasti hlavního panelu prostředí</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Pamatovat si nedávno otevřené soubory s klíči</translation>
</message>
</context>
<context>
@@ -1142,7 +1229,7 @@ Uložit změny?</translation>
</message>
<message>
<source> sec</source>
<translation>sek</translation>
<translation>sek.</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
@@ -1150,7 +1237,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Show passwords in cleartext by default</source>
<translation>Vždy zobrazovat hesla</translation>
<translation>Hesla vždy viditelná (nezakrývat hvězdičkami)</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
@@ -1163,14 +1250,6 @@ Uložit změny?</translation>
<source>Unlock database</source>
<translation>Odemknout databázi</translation>
</message>
<message>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Chybný klíč.</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
@@ -1183,11 +1262,11 @@ Uložit změny?</translation>
<name>main</name>
<message>
<source>KeePassX - cross-platform password manager</source>
<translation>KeePassX multiplatformní správce hesel</translation>
<translation>KeePassX správce hesel, fungující napříč rozličnými operačními systémy</translation>
</message>
<message>
<source>filename of the password database to open (*.kdbx)</source>
<translation>Soubor s databází hesel (*.kdbx), který otevřít</translation>
<translation>který soubor s databází hesel (*.kdbx) otevřít</translation>
</message>
<message>
<source>path to a custom config file</source>
@@ -1195,7 +1274,7 @@ Uložit změny?</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>heslo databáze (NEBEZPEČNÉ!)</translation>
<translation>heslo k databázi (NEBEZPEČNÉ!)</translation>
</message>
<message>
<source>key file of the database</source>

View File

@@ -109,12 +109,22 @@
<source>Different passwords supplied.</source>
<translation>Andre adgangskoder leveret.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>Kan ikke sætte nøglefil</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Kunne ikke sætte %1 som Nøglefil:
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
<message>
<source>Enter master key</source>
<translation>Indtast primærnøgle</translation>
<translation>Indtast hovednøgle</translation>
</message>
<message>
<source>Key File:</source>
@@ -189,14 +199,14 @@
</message>
<message>
<source>Max. history size:</source>
<translation type="unfinished"/>
<translation>Maks. historikstørrelse:</translation>
</message>
</context>
<context>
<name>DatabaseTabWidget</name>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation>Rod</translation>
</message>
<message>
<source>KeePass 2 Database</source>
@@ -234,11 +244,6 @@
<source>Close?</source>
<translation>Luk?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Save changes?</source>
<translation>Gem ændringer?</translation>
@@ -246,7 +251,8 @@ Close anyway?</source>
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
<translation type="unfinished"/>
<translation>&quot;%1&quot; blev ændret.
Gem disse ændringer?</translation>
</message>
<message>
<source>Error</source>
@@ -268,12 +274,59 @@ Save changes?</source>
<source>locked</source>
<translation>låst</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation>Den database, du prøver at åbne er låst af en anden forekomst af KeePassX.
Vil du åbne den alligevel? Alternativt åbnes databasen skrivebeskyttet.</translation>
</message>
<message>
<source>Lock database</source>
<translation>Lås database</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation>Kan ikke låse databasen, mens du redigerer i den.
Tryk Afbryd for at afslutte dine ændringer eller kassere dem.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Denne database er aldrig blevet gemt.
Du kan gemme databasen eller stop låsning.</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation>Denne database er blevet ændret.
Vil du gemme databasen før låsning?
Ellers mister du dine ændringer.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Eksportér databasen til CSV-fil</translation>
</message>
<message>
<source>CSV file</source>
<translation>CSV-fil</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Kan ikke skrive til CSV-fil.</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Change master key</source>
<translation>Skift primærnøgle</translation>
<translation>Skift hovednøgle</translation>
</message>
<message>
<source>Delete entry?</source>
@@ -281,7 +334,7 @@ Save changes?</source>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
<translation type="unfinished"/>
<translation>Vil du virkelig slette posten &quot;%1&quot; permanent?</translation>
</message>
<message>
<source>Delete entries?</source>
@@ -289,7 +342,7 @@ Save changes?</source>
</message>
<message>
<source>Do you really want to delete %1 entries for good?</source>
<translation type="unfinished"/>
<translation>Vil du virkelig slette %1 poster permanent?</translation>
</message>
<message>
<source>Move entries to recycle bin?</source>
@@ -297,7 +350,7 @@ Save changes?</source>
</message>
<message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Ønsker du virkelig at flytte %n post over i papirkurven?</numerusform><numerusform>Ønsker du virkelig at flytte %n poster over i papirkurven?</numerusform></translation>
</message>
<message>
<source>Delete group?</source>
@@ -305,12 +358,20 @@ Save changes?</source>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
<translation type="unfinished"/>
<translation>Ønsker du at slette gruppen &quot;%1&quot; permanent?</translation>
</message>
<message>
<source>Current group</source>
<translation>Nuværende gruppe</translation>
</message>
<message>
<source>Error</source>
<translation>Fejl</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Kan ikke beregne hovednøgle</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -377,7 +438,7 @@ Save changes?</source>
<message>
<source>Unable to save the attachment:
</source>
<translation type="unfinished"/>
<translation>Kan ikke gemme vedhæftningen:</translation>
</message>
<message>
<source>Tomorrow</source>
@@ -422,6 +483,10 @@ Save changes?</source>
<source>Save</source>
<translation>Gem</translation>
</message>
<message>
<source>Open</source>
<translation>Åben</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -451,11 +516,11 @@ Save changes?</source>
</message>
<message>
<source>Use default sequence</source>
<translation type="unfinished"/>
<translation>Brug standardsekvens</translation>
</message>
<message>
<source>Set custom sequence:</source>
<translation type="unfinished"/>
<translation>Definér brugervalgt sekvens:</translation>
</message>
</context>
<context>
@@ -509,7 +574,7 @@ Save changes?</source>
</message>
<message>
<source>Presets</source>
<translation type="unfinished"/>
<translation>Predefinerede</translation>
</message>
<message>
<source>Notes:</source>
@@ -573,6 +638,14 @@ Save changes?</source>
<source>Auto-type</source>
<translation type="unfinished"/>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -610,7 +683,7 @@ Save changes?</source>
</message>
<message numerus="yes">
<source>Can&apos;t delete icon. Still used by %n item(s).</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Kan ikke slette ikonet. Det anvendes stadig af %n element.</numerusform><numerusform>Kan ikke slette ikonet. Det anvendes stadig af %n elementer.</numerusform></translation>
</message>
</context>
<context>
@@ -719,7 +792,11 @@ Save changes?</source>
</message>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation>Rod</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Kan ikke beregne hovednøgle</translation>
</message>
</context>
<context>
@@ -736,6 +813,10 @@ Save changes?</source>
<source>Wrong key or database file is corrupt.</source>
<translation>Forkert nøgle eller databasefil er korrupt.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Kan ikke beregne hovednøgle</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -774,10 +855,6 @@ Save changes?</source>
<source>Groups</source>
<translation>Grupper</translation>
</message>
<message>
<source>Extras</source>
<translation type="unfinished"/>
</message>
<message>
<source>View</source>
<translation>Vis</translation>
@@ -836,7 +913,7 @@ Save changes?</source>
</message>
<message>
<source>Change master key</source>
<translation>Skift primærnøgle</translation>
<translation>Skift hovednøgle</translation>
</message>
<message>
<source>Database settings</source>
@@ -854,18 +931,10 @@ Save changes?</source>
<source>Find</source>
<translation>Find</translation>
</message>
<message>
<source>Username</source>
<translation>Brugernavn</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Kopiér brugernavn til udklipsholder</translation>
</message>
<message>
<source>Password</source>
<translation>Adgangskode</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Kopiér adgangskode til udklipsholder</translation>
@@ -910,6 +979,22 @@ Save changes?</source>
<source>Toggle window</source>
<translation>Skift vindue</translation>
</message>
<message>
<source>Tools</source>
<translation>Værktøj</translation>
</message>
<message>
<source>Copy username</source>
<translation>Kopiér adgangskode</translation>
</message>
<message>
<source>Copy password</source>
<translation>Kopiér adgangskode</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Eksportér til CSV-fil</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -931,7 +1016,7 @@ Save changes?</source>
</message>
<message>
<source>Lower Case Letters</source>
<translation type="unfinished"/>
<translation>Små Bogstaver</translation>
</message>
<message>
<source>Numbers</source>
@@ -939,15 +1024,15 @@ Save changes?</source>
</message>
<message>
<source>Special Characters</source>
<translation type="unfinished"/>
<translation>Specialtegn</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation type="unfinished"/>
<translation>Udeluk lool-alike tegn</translation>
</message>
<message>
<source>Ensure that the password contains characters from every group</source>
<translation type="unfinished"/>
<translation>Vær sikker at din adgangskode indeholder tegn fra alle grupper</translation>
</message>
<message>
<source>Accept</source>
@@ -1020,11 +1105,11 @@ Save changes?</source>
</message>
<message>
<source>Error writing to underlying device: </source>
<translation type="unfinished"/>
<translation>Fejl ved skrivning til enhed:</translation>
</message>
<message>
<source>Error opening underlying device: </source>
<translation type="unfinished"/>
<translation>Fejl ved åbning fra enhed:</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
@@ -1032,7 +1117,7 @@ Save changes?</source>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
<translation type="unfinished"/>
<translation>Intern zlib-fejl ved dekomprimering:</translation>
</message>
</context>
<context>
@@ -1054,7 +1139,7 @@ Save changes?</source>
</message>
<message>
<source>Case sensitive</source>
<translation type="unfinished"/>
<translation>Versalfølsom</translation>
</message>
<message>
<source>Current group</source>
@@ -1062,7 +1147,7 @@ Save changes?</source>
</message>
<message>
<source>Root group</source>
<translation type="unfinished"/>
<translation>Rodgruppe</translation>
</message>
</context>
<context>
@@ -1073,7 +1158,7 @@ Save changes?</source>
</message>
<message>
<source>General</source>
<translation type="unfinished"/>
<translation>Generelt</translation>
</message>
<message>
<source>Security</source>
@@ -1084,15 +1169,11 @@ Save changes?</source>
<name>SettingsWidgetGeneral</name>
<message>
<source>Remember last databases</source>
<translation type="unfinished"/>
<translation>Husk seneste databaser</translation>
</message>
<message>
<source>Open previous databases on startup</source>
<translation type="unfinished"/>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation type="unfinished"/>
<translation>Åben foregående databaser ved opstart</translation>
</message>
<message>
<source>Automatically save on exit</source>
@@ -1108,7 +1189,7 @@ Save changes?</source>
</message>
<message>
<source>Use group icon on entry creation</source>
<translation type="unfinished"/>
<translation>Brug gruppeikon ved oprettelse af post</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
@@ -1130,6 +1211,10 @@ Save changes?</source>
<source>Hide window to system tray when minimized</source>
<translation>Skjul vindue i systembakken når det er minimeret</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Husk de sidste nøglefiler</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
@@ -1143,11 +1228,11 @@ Save changes?</source>
</message>
<message>
<source>Lock databases after inactivity of</source>
<translation type="unfinished"/>
<translation>Lås databaserne efter inaktivitet i</translation>
</message>
<message>
<source>Show passwords in cleartext by default</source>
<translation type="unfinished"/>
<translation>Vis adgangskoder i klartekst som standard</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
@@ -1160,14 +1245,6 @@ Save changes?</source>
<source>Unlock database</source>
<translation>Lås database op</translation>
</message>
<message>
<source>Error</source>
<translation>Fejl</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Forkert nøgle.</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
@@ -1188,7 +1265,7 @@ Save changes?</source>
</message>
<message>
<source>path to a custom config file</source>
<translation type="unfinished"/>
<translation>sti til brugerdefineret indstillingsfil</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>

View File

@@ -7,7 +7,7 @@
</message>
<message>
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX ist unter der GNU General Public License (GPL) version 2 (version 3) veröffentlicht.</translation>
<translation>KeePassX steht unter der GNU General Public License (GPL) version 2 (version 3).</translation>
</message>
</context>
<context>
@@ -109,6 +109,15 @@
<source>Different passwords supplied.</source>
<translation>Unterschiedliche Passwörter eingegeben.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>Festlegen der Schlüsseldatei nicht möglich.</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Festlegen von %1 als Schlüsseldatei nicht möglich: %2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
@@ -234,12 +243,6 @@
<source>Close?</source>
<translation>Schließen?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; wird bearbeitet.
Trotzdem schließen?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>Änderungen speichern?</translation>
@@ -270,6 +273,53 @@ Save changes?</source>
<source>locked</source>
<translation>gesperrt</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation>Die Datenbank, die geöffnet werden soll, ist aktuell von einer anderen Instanz von KeePassX blockiert. Soll sie dennoch geöffnet werden? Andererseits wird die Datenbank schreibgeschützt geöffnet.</translation>
</message>
<message>
<source>Lock database</source>
<translation>Datenbank sperren</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation>Datenbank kann nicht gesperrt werden, da sie gerade bearbeitet wird.
Wählen sie &quot;cancel&quot;, um die Änderungen zu speichern oder sie zurückzunehmen.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Diese Datenbank wurde noch nicht gespeichert.
Sie können sie speichern oder Sperre freigeben.</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation>Dieses Datenbank wurde geändert.
Soll sie gespeichert werden bevor sie gesperrt wirt?
Anderenfalls gehen Ihre Änderungen verloren.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>&quot;%1&quot; wird bearbeitet.
Änderungen verwerfen und trotzdem schließen?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Datenbank als CSV Datei exportieren.</translation>
</message>
<message>
<source>CSV file</source>
<translation>CSV Datei</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Die CSV Datei konnte nicht gespeichert werden.</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -313,6 +363,14 @@ Save changes?</source>
<source>Current group</source>
<translation>Aktuelle Gruppe</translation>
</message>
<message>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Berechnung des &quot;master keys&quot; gescheitert</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -424,6 +482,10 @@ Save changes?</source>
<source>Save</source>
<translation>Speichern</translation>
</message>
<message>
<source>Open</source>
<translation>Offen</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -575,6 +637,14 @@ Save changes?</source>
<source>Auto-type</source>
<translation>Auto-type</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>Auto-Type-Sequenz der übergeordneten Gruppe anwenden.</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Standard Auto-Type-Sequenz setzen</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -723,6 +793,10 @@ Save changes?</source>
<source>Root</source>
<translation>Root</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Berechnung des &quot;master keys&quot; gescheitert</translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -738,6 +812,10 @@ Save changes?</source>
<source>Wrong key or database file is corrupt.</source>
<translation>Falscher Schlüssel oder die Datei ist beschädigt.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Berechnung des &quot;master keys&quot; gescheitert</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -776,10 +854,6 @@ Save changes?</source>
<source>Groups</source>
<translation>Gruppen</translation>
</message>
<message>
<source>Extras</source>
<translation>Extras</translation>
</message>
<message>
<source>View</source>
<translation>Ansicht</translation>
@@ -856,18 +930,10 @@ Save changes?</source>
<source>Find</source>
<translation>Suchen</translation>
</message>
<message>
<source>Username</source>
<translation>Benutzername</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Benutzername in die Zwischenablage kopieren</translation>
</message>
<message>
<source>Password</source>
<translation>Passwort</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Passwort in die Zwischenablage kopieren</translation>
@@ -912,6 +978,22 @@ Save changes?</source>
<source>Toggle window</source>
<translation>Fenster zeigen/verstecken</translation>
</message>
<message>
<source>Tools</source>
<translation>Tools</translation>
</message>
<message>
<source>Copy username</source>
<translation>Benutzername kopieren</translation>
</message>
<message>
<source>Copy password</source>
<translation>Passwort kopieren</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Als CSV Datei exportieren</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1092,10 +1174,6 @@ Save changes?</source>
<source>Open previous databases on startup</source>
<translation>Letzte Datenbank beim Starten öffnen</translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation>Als erweiterte Zustandsänderungen makieren</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Automatisch speichern beim Schließen</translation>
@@ -1132,6 +1210,10 @@ Save changes?</source>
<source>Hide window to system tray when minimized</source>
<translation>Fenster verstecken wenn minimiert</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Letzte Schlüsseldateien merken</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
@@ -1162,14 +1244,6 @@ Save changes?</source>
<source>Unlock database</source>
<translation>Datenbank entsperren</translation>
</message>
<message>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Falscher Schlüssel.</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>

View File

@@ -11,6 +11,10 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Revision</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -316,6 +320,11 @@ Discard changes and close anyway?</source>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The database you are trying to save as is locked by another instance of KeePassX.
Do you want to save it anyway?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -1274,10 +1283,6 @@ Discard changes and close anyway?</source>
<source>path to a custom config file</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>key file of the database</source>
<translation type="unfinished"></translation>

View File

@@ -75,7 +75,7 @@
</message>
<message>
<source>Key files</source>
<translation>Archivos de llaves</translation>
<translation>Archivos llave</translation>
</message>
<message>
<source>All files</source>
@@ -109,6 +109,16 @@
<source>Different passwords supplied.</source>
<translation>Las contraseñas ingresadas son distintas.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>No se pudo establecer el archivo llave</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>No se pudo establecer %1 como el Archivo llave:
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
@@ -118,7 +128,7 @@
</message>
<message>
<source>Key File:</source>
<translation>Archivo clave:</translation>
<translation>Archivo llave:</translation>
</message>
<message>
<source>Password:</source>
@@ -196,7 +206,7 @@
<name>DatabaseTabWidget</name>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation>Raíz</translation>
</message>
<message>
<source>KeePass 2 Database</source>
@@ -234,12 +244,6 @@
<source>Close?</source>
<translation>¿Cerrar?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; está en modo de edición.
¿Cerrar de todas formas?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>¿Guardar cambios?</translation>
@@ -270,12 +274,60 @@ Save changes?</source>
<source>locked</source>
<translation>bloqueado</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation>La base de datos que está intentando abrir está bloqueada por otra instancia de KeePassX.
¿Quiere abrirla de todos modos? Alternativamente, la base de datos se abre como sólo lectura.</translation>
</message>
<message>
<source>Lock database</source>
<translation>Bloquear base de datos</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation>No se puede bloquear la base de datos porque actualmente está editándola.
Por favor, pulse cancelar para terminar sus cambios o descartarlos.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Esta base de datos nunca ha sido guardada.
Puede guardar la base de datos o dejar de bloquearla.</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation>Esta base de datos ha sido modificada.
¿Desea guardar la base de datos antes de bloquearla?
De lo contrario se perderán los cambios.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>&quot;% 1&quot; está en el modo de edición.
¿Descartar cambios y cerrar de todos modos?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Exportar base de datos a un archivo CSV</translation>
</message>
<message>
<source>CSV file</source>
<translation>Archivo CSV</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>La escritura del archivo CSV falló.</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Change master key</source>
<translation>Cambiar la llave maestra</translation>
<translation>Cambiar la clave maestra</translation>
</message>
<message>
<source>Delete entry?</source>
@@ -313,6 +365,14 @@ Save changes?</source>
<source>Current group</source>
<translation>Grupo actual</translation>
</message>
<message>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>No se puede calcular la llave maestra</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -425,6 +485,10 @@ Save changes?</source>
<source>Save</source>
<translation>Guardar</translation>
</message>
<message>
<source>Open</source>
<translation>Abrir</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -576,6 +640,14 @@ Save changes?</source>
<source>Auto-type</source>
<translation>Auto-escritura</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>Usar escritura automática por defecto del grupo padre</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Establecer escritura automática por defecto</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -722,7 +794,11 @@ Save changes?</source>
</message>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation>Raíz</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>No se puede calcular la clave maestra</translation>
</message>
</context>
<context>
@@ -739,6 +815,10 @@ Save changes?</source>
<source>Wrong key or database file is corrupt.</source>
<translation>La contraseña es incorrecta o el archivo está dañado</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>No se puede calcular la clave maestra</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -777,10 +857,6 @@ Save changes?</source>
<source>Groups</source>
<translation>Grupos</translation>
</message>
<message>
<source>Extras</source>
<translation>Extras</translation>
</message>
<message>
<source>View</source>
<translation>Ver</translation>
@@ -839,7 +915,7 @@ Save changes?</source>
</message>
<message>
<source>Change master key</source>
<translation>Cambiar la llave maestra</translation>
<translation>Cambiar la clave maestra</translation>
</message>
<message>
<source>Database settings</source>
@@ -857,18 +933,10 @@ Save changes?</source>
<source>Find</source>
<translation>Buscar</translation>
</message>
<message>
<source>Username</source>
<translation>Usuario</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Copiar nombre de usuario al portapapeles</translation>
</message>
<message>
<source>Password</source>
<translation>Contraseña</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Copiar contraseña al portapapeles</translation>
@@ -913,6 +981,22 @@ Save changes?</source>
<source>Toggle window</source>
<translation>Cambiar a ventana</translation>
</message>
<message>
<source>Tools</source>
<translation>Herramientas</translation>
</message>
<message>
<source>Copy username</source>
<translation>Copiar nombre de usuario</translation>
</message>
<message>
<source>Copy password</source>
<translation>Copiar contraseña</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Exportar a un archivo CSV</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1065,7 +1149,7 @@ Save changes?</source>
</message>
<message>
<source>Root group</source>
<translation type="unfinished"/>
<translation>Grupo raíz</translation>
</message>
</context>
<context>
@@ -1093,10 +1177,6 @@ Save changes?</source>
<source>Open previous databases on startup</source>
<translation>Abrir base de datos anterior al inicio</translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation>Marcar como modificado en los cambios de estado ampliados</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Guardar automáticamente al salir</translation>
@@ -1133,6 +1213,10 @@ Save changes?</source>
<source>Hide window to system tray when minimized</source>
<translation>Ocultar la ventana a la bandeja del sistema cuando se minimiza</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Recordar últimos archivos clave</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
@@ -1163,14 +1247,6 @@ Save changes?</source>
<source>Unlock database</source>
<translation>Desbloquear base de datos</translation>
</message>
<message>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Clave incorrecta.</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>

View File

@@ -63,7 +63,7 @@
</message>
<message>
<source>Key file</source>
<translation>Fichier de clé</translation>
<translation>Fichier-clé</translation>
</message>
<message>
<source>Browse</source>
@@ -83,7 +83,7 @@
</message>
<message>
<source>Create Key File...</source>
<translation>Créer un fichier de clé...</translation>
<translation>Créer un fichier-clé...</translation>
</message>
<message>
<source>Error</source>
@@ -91,11 +91,11 @@
</message>
<message>
<source>Unable to create Key File : </source>
<translation>Incapable de créer un fichier de clé :</translation>
<translation>Impossible de créer un fichier-clé :</translation>
</message>
<message>
<source>Select a key file</source>
<translation>Choisir un fichier de clé</translation>
<translation>Choisir un fichier-clé</translation>
</message>
<message>
<source>Question</source>
@@ -109,16 +109,26 @@
<source>Different passwords supplied.</source>
<translation>Les mots de passe ne sont pas identiques.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>Échec de définition du fichier-clé</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Impossible de définir %1 comme fichier-clé:
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
<message>
<source>Enter master key</source>
<translation>Entrez la clé maîtresse</translation>
<translation>Entrez la clé maître</translation>
</message>
<message>
<source>Key File:</source>
<translation>Fichier de clé :</translation>
<translation>Fichier-clé :</translation>
</message>
<message>
<source>Password:</source>
@@ -138,7 +148,7 @@
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Impossible d&apos;ouvrir le fichier de clé</translation>
<translation>Impossible d&apos;ouvrir le fichier-clé</translation>
</message>
<message>
<source>All files</source>
@@ -146,11 +156,11 @@
</message>
<message>
<source>Key files</source>
<translation>Fichiers de clé</translation>
<translation>Fichiers-clés</translation>
</message>
<message>
<source>Select key file</source>
<translation>Choisissez un fichier de clé</translation>
<translation>Choisissez un fichier-clé</translation>
</message>
</context>
<context>
@@ -208,7 +218,7 @@
</message>
<message>
<source>Open database</source>
<translation>Ovrire la base de données</translation>
<translation>Ouvrir la base de données</translation>
</message>
<message>
<source>Warning</source>
@@ -232,13 +242,7 @@
</message>
<message>
<source>Close?</source>
<translation>Fermer?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; est en cours de modification.
Fermer quand même ?</translation>
<translation>Fermer ?</translation>
</message>
<message>
<source>Save changes?</source>
@@ -270,12 +274,60 @@ Enregistrer les modifications ?</translation>
<source>locked</source>
<translation>verrouillée</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation>La base de données que vous essayez d&apos;ouvrir est verrouillée par une autre instance de KeePassX.
Voulez-vous quand même l&apos;ouvrir ? Dans ce cas, elle sera ouverte en lecture seule.</translation>
</message>
<message>
<source>Lock database</source>
<translation>Verrouiiler la base de données</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation>Impossible de verrouiller la base de données lors de modifications.
Cliquez sur Annuler pour finir vos modifications ou abandonnez-les.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Cette base de données n&apos;a pas encore é sauvegardée.
Vous devez la sauvegarder ou annuler son verrouillage.</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation>La base de données a é modifiée.
Voulez-vous l&apos;enregistrer avant de la verrouiller ?
Autrement, vos modifications seront perdues.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>&quot;%1&quot; est en mode édition.
Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Exporter la base de données au format CSV</translation>
</message>
<message>
<source>CSV file</source>
<translation>Fichier CSV</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Échec de l&apos;écriture du fichier CSV.</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Change master key</source>
<translation>Changer la clé maîtresse</translation>
<translation>Changer la clé maître</translation>
</message>
<message>
<source>Delete entry?</source>
@@ -311,7 +363,15 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Current group</source>
<translation>Group actif</translation>
<translation>Groupe actif</translation>
</message>
<message>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Impossible de calculer la clé maître</translation>
</message>
</context>
<context>
@@ -322,7 +382,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Advanced</source>
<translation>Avancées</translation>
<translation>Avancé</translation>
</message>
<message>
<source>Icon</source>
@@ -330,7 +390,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Auto-Type</source>
<translation>Auto-Type</translation>
<translation>Remplissage automatique</translation>
</message>
<message>
<source>Properties</source>
@@ -379,7 +439,7 @@ Enregistrer les modifications ?</translation>
<message>
<source>Unable to save the attachment:
</source>
<translation>Impossible de enregistrer le fichier attaché:
<translation>Impossible d&apos;enregistrer le fichier attaché:
</translation>
</message>
<message>
@@ -396,14 +456,14 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>1 year</source>
<translation>Une année</translation>
<translation>1 an</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
<message>
<source>Additional attributes</source>
<translation>Attributs additionnel </translation>
<translation>Attributs supplémentaires </translation>
</message>
<message>
<source>Add</source>
@@ -425,20 +485,24 @@ Enregistrer les modifications ?</translation>
<source>Save</source>
<translation>Enregistrer le fichier </translation>
</message>
<message>
<source>Open</source>
<translation>Ouvrir</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
<translation>Activer l&apos;Auto-Type pour cette entrée</translation>
<translation>Activer le remplissage automatique pour cette entrée</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the group</source>
<translation type="unfinished"/>
<translation>Utiliser la séquence de remplissage automatique par défaut du groupe</translation>
</message>
<message>
<source>Use custom Auto-Type sequence:</source>
<translation>Utiliser une séquence d&apos;Auto-Type personnalisée :</translation>
<translation>Utiliser une séquence de remplissage automatique personnalisée :</translation>
</message>
<message>
<source>+</source>
@@ -450,7 +514,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Window title:</source>
<translation>Titre de la fenêtre:</translation>
<translation>Titre de la fenêtre :</translation>
</message>
<message>
<source>Use default sequence</source>
@@ -458,14 +522,14 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Set custom sequence:</source>
<translation type="unfinished"/>
<translation>Définir une séquence personnalisé :</translation>
</message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
<message>
<source>Show</source>
<translation>Exposer</translation>
<translation>Afficher</translation>
</message>
<message>
<source>Restore</source>
@@ -484,19 +548,19 @@ Enregistrer les modifications ?</translation>
<name>EditEntryWidgetMain</name>
<message>
<source>Title:</source>
<translation>Titre:</translation>
<translation>Titre :</translation>
</message>
<message>
<source>Username:</source>
<translation>Non d&apos;utilisateur:</translation>
<translation>Non d&apos;utilisateur :</translation>
</message>
<message>
<source>Password:</source>
<translation>Mot de passe:</translation>
<translation>Mot de passe :</translation>
</message>
<message>
<source>Repeat:</source>
<translation>Confirme: </translation>
<translation>Confirmation :</translation>
</message>
<message>
<source>Gen.</source>
@@ -504,7 +568,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>URL:</source>
<translation>URL:</translation>
<translation>URL :</translation>
</message>
<message>
<source>Expires</source>
@@ -516,7 +580,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Notes:</source>
<translation>Notes:</translation>
<translation>Notes :</translation>
</message>
</context>
<context>
@@ -539,7 +603,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Edit group</source>
<translation>Modifie le groupe</translation>
<translation>Modifier le groupe</translation>
</message>
<message>
<source>Enable</source>
@@ -566,7 +630,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Expires</source>
<translation>Expires</translation>
<translation>Expiration</translation>
</message>
<message>
<source>Search</source>
@@ -574,7 +638,15 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Auto-type</source>
<translation>Auto-type</translation>
<translation>Remplissage automatique</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>Utiliser la séquence de remplissage automatique par défaut du groupe parent</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Définir une séquence de remplissage automatique par défaut</translation>
</message>
</context>
<context>
@@ -605,7 +677,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Select Image</source>
<translation>Choisis un image. </translation>
<translation>Choisir une image</translation>
</message>
<message>
<source>Can&apos;t delete icon!</source>
@@ -632,7 +704,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Uuid:</source>
<translation>Uuid:</translation>
<translation>Uuid :</translation>
</message>
</context>
<context>
@@ -684,14 +756,14 @@ Enregistrer les modifications ?</translation>
<name>Group</name>
<message>
<source>Recycle Bin</source>
<translation>Bac de Recyclage</translation>
<translation>Corbeille</translation>
</message>
</context>
<context>
<name>KeePass1OpenWidget</name>
<message>
<source>Import KeePass1 database</source>
<translation>Importe un KeePass1 bas de données</translation>
<translation>Importer une base de données au format KeePass1</translation>
</message>
<message>
<source>Error</source>
@@ -699,14 +771,14 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Impossible d&apos;ouvrir la bas de données.</translation>
<translation>Impossible d&apos;ouvrir la base de données.</translation>
</message>
</context>
<context>
<name>KeePass1Reader</name>
<message>
<source>Unable to read keyfile.</source>
<translation>Impossible de lire le fichier de clé.</translation>
<translation>Impossible de lire le fichier-clé.</translation>
</message>
<message>
<source>Not a KeePass database.</source>
@@ -724,6 +796,10 @@ Enregistrer les modifications ?</translation>
<source>Root</source>
<translation>Racine</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Impossible de calculer la clé maître</translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -739,6 +815,10 @@ Enregistrer les modifications ?</translation>
<source>Wrong key or database file is corrupt.</source>
<translation>Mauvaise clé ou fichier de base de donnée corrompu.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Impossible de calculer la clé maître</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -777,10 +857,6 @@ Enregistrer les modifications ?</translation>
<source>Groups</source>
<translation>Groupes</translation>
</message>
<message>
<source>Extras</source>
<translation>Extras</translation>
</message>
<message>
<source>View</source>
<translation>Vue</translation>
@@ -857,18 +933,10 @@ Enregistrer les modifications ?</translation>
<source>Find</source>
<translation>Chercher</translation>
</message>
<message>
<source>Username</source>
<translation>Nom d&apos;utilisateur</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Copier le nom d&apos;utilisateur dans le presse-papiers</translation>
</message>
<message>
<source>Password</source>
<translation>Mot de passe</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Copier le mot de passe dans le presse-papiers</translation>
@@ -879,7 +947,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Perform Auto-Type</source>
<translation>Effectuer un Auto-Type</translation>
<translation>Effectuer un remplissage automatique</translation>
</message>
<message>
<source>Open URL</source>
@@ -913,12 +981,28 @@ Enregistrer les modifications ?</translation>
<source>Toggle window</source>
<translation>Basculer de fenêtre</translation>
</message>
<message>
<source>Tools</source>
<translation>Outils</translation>
</message>
<message>
<source>Copy username</source>
<translation>Copier le nom d&apos;utilisateur</translation>
</message>
<message>
<source>Copy password</source>
<translation>Copier le mot de passe</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Exporter au format CSV</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
<message>
<source>Password:</source>
<translation>Mot de passe:</translation>
<translation>Mot de passe :</translation>
</message>
<message>
<source>Length:</source>
@@ -1023,15 +1107,15 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Error writing to underlying device: </source>
<translation type="unfinished"/>
<translation>Erreur d&apos;écriture sur le périphérique concerné :</translation>
</message>
<message>
<source>Error opening underlying device: </source>
<translation type="unfinished"/>
<translation>Erreur d&apos;ouverture du périphérique concerné :</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
<translation type="unfinished"/>
<translation>Erreur de lecture sur le périphérique concerné :</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
@@ -1093,10 +1177,6 @@ Enregistrer les modifications ?</translation>
<source>Open previous databases on startup</source>
<translation>Ouvrir les base de données précédentes au démarrage</translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation type="unfinished"/>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Sauvegarde automatiquement à la sortie</translation>
@@ -1107,7 +1187,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Minimize when copying to clipboard</source>
<translation type="unfinished"/>
<translation>Réduire lors de la copie dans le presse-papiers</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
@@ -1115,11 +1195,11 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
<translation>Raccourci d&apos;Auto-Type global</translation>
<translation>Raccourci de remplissage automatique global</translation>
</message>
<message>
<source>Use entry title to match windows for global auto-type</source>
<translation>Utiliser la correspondance entre le titre de l&apos;entrée et de la fenêtre pour l&apos;Auto-Type global</translation>
<translation>Utiliser la correspondance entre le titre de l&apos;entrée et de la fenêtre pour le remplissage automatique global</translation>
</message>
<message>
<source>Language</source>
@@ -1127,11 +1207,15 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Show a system tray icon</source>
<translation type="unfinished"/>
<translation>Afficher une icône dans la zone de notification</translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation type="unfinished"/>
<translation>Réduire la fenêtre vers la zone de notification lors de sa réduction</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Se rappeler les derniers fichiers-clés ouverts</translation>
</message>
</context>
<context>
@@ -1154,7 +1238,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
<translation>Toujours demander avant d&apos;effectuer un auto-type</translation>
<translation>Toujours demander avant d&apos;effectuer un remplissage automatique</translation>
</message>
</context>
<context>
@@ -1163,14 +1247,6 @@ Enregistrer les modifications ?</translation>
<source>Unlock database</source>
<translation>Déverrouiller la base de donnée</translation>
</message>
<message>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Mauvaise clé.</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
@@ -1199,7 +1275,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>key file of the database</source>
<translation>Fichier de clé de la base de donnée</translation>
<translation>Fichier-clé de la base de données</translation>
</message>
</context>
</TS>

View File

@@ -109,6 +109,15 @@
<source>Different passwords supplied.</source>
<translation>Kata sandi yang berbeda diberikan.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
@@ -234,12 +243,6 @@
<source>Close?</source>
<translation>Tutup?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; dalam berada mode sunting.
Tetap tutup?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>Simpan perubahan?</translation>
@@ -270,6 +273,48 @@ Simpan perubahan?</translation>
<source>locked</source>
<translation>terkunci</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Lock database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation type="unfinished"/>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation type="unfinished"/>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation type="unfinished"/>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export database to CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -313,6 +358,14 @@ Simpan perubahan?</translation>
<source>Current group</source>
<translation>Grup saat ini</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -425,6 +478,10 @@ Simpan perubahan?</translation>
<source>Save</source>
<translation>Simpan</translation>
</message>
<message>
<source>Open</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -576,6 +633,14 @@ Simpan perubahan?</translation>
<source>Auto-type</source>
<translation>Ketik-otomatis</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -724,6 +789,10 @@ Simpan perubahan?</translation>
<source>Root</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -739,6 +808,10 @@ Simpan perubahan?</translation>
<source>Wrong key or database file is corrupt.</source>
<translation>Kunci salah atau berkas basis data korup.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>Main</name>
@@ -777,10 +850,6 @@ Simpan perubahan?</translation>
<source>Groups</source>
<translation>Grup</translation>
</message>
<message>
<source>Extras</source>
<translation>Ekstra</translation>
</message>
<message>
<source>View</source>
<translation type="unfinished"/>
@@ -857,18 +926,10 @@ Simpan perubahan?</translation>
<source>Find</source>
<translation>Temukan</translation>
</message>
<message>
<source>Username</source>
<translation>Nama pengguna</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Salin nama pengguna ke papan klip</translation>
</message>
<message>
<source>Password</source>
<translation>Kata sandi</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Salin kata sandi ke papan klip</translation>
@@ -913,6 +974,22 @@ Simpan perubahan?</translation>
<source>Toggle window</source>
<translation type="unfinished"/>
</message>
<message>
<source>Tools</source>
<translation type="unfinished"/>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1093,10 +1170,6 @@ Simpan perubahan?</translation>
<source>Open previous databases on startup</source>
<translation>Buka basis data sebelumnya saat mulai</translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation type="unfinished"/>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Otomatis simpan ketika keluar</translation>
@@ -1133,6 +1206,10 @@ Simpan perubahan?</translation>
<source>Hide window to system tray when minimized</source>
<translation>Sembunyikan jendela ke baki sistem ketika dikecilkan</translation>
</message>
<message>
<source>Remember last key files</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
@@ -1163,14 +1240,6 @@ Simpan perubahan?</translation>
<source>Unlock database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Error</source>
<translation>Galat</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Kunci salah.</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>

View File

@@ -19,7 +19,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
<translation type="unfinished"/>
<translation>Impossibile trovare una voce che corrisponda al titolo della finestra</translation>
</message>
</context>
<context>
@@ -112,12 +112,12 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Failed to set key file</source>
<translation type="unfinished"/>
<translation>Impossibile impostare il file della chiave</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation type="unfinished"/>
<translation>Impossibile impostare %1 come file della Chiave: %2</translation>
</message>
</context>
<context>
@@ -244,12 +244,6 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
<source>Close?</source>
<translation>Chiudere?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; è in modalità modifica.
Chiudere comunque?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>Salvare modifiche?</translation>
@@ -283,27 +277,49 @@ Salvare le modifiche?</translation>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation type="unfinished"/>
<translation>Il Database che stai tentando di aprire è bloccato da un&apos;altra esecuzione di KeePassX.
Vuoi aprire comunque il database? In alternativa, il database è aperto in sola lettura.</translation>
</message>
<message>
<source>Lock database</source>
<translation type="unfinished"/>
<translation>Bloccare database</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation type="unfinished"/>
<translation>Non è possibile bloccare il database ne modo in cui lo stai modificando.
Premere annulla per terminare le modifiche o scartarle .</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation type="unfinished"/>
<translation>Questo database non è ancora stato salvato.
È possibile salvare il database o interrompere bloccandolo.</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation type="unfinished"/>
<translation>Questo database è stato modificato.
Vuoi salvare il database prima di bloccarlo?
Altrimenti le modifiche verranno perse.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>&quot;%1&quot; è in modalità modifica. Annullare le modifiche e chiudere comunque?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Esporta il database come file CSV</translation>
</message>
<message>
<source>CSV file</source>
<translation>file CSV</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Scrittura del file CSV fallita.</translation>
</message>
</context>
<context>
@@ -350,11 +366,11 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Error</source>
<translation type="unfinished"/>
<translation>Errore</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Impossibile calcolare la chiave master</translation>
</message>
</context>
<context>
@@ -470,7 +486,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Open</source>
<translation type="unfinished"/>
<translation>Apri</translation>
</message>
</context>
<context>
@@ -625,11 +641,11 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
<translation>Ereditare la sequenza predefinita di auto-type dal gruppo</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
<translation>Usare sequenza predefinita</translation>
</message>
</context>
<context>
@@ -781,7 +797,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Impossibile calcolare la chiave master</translation>
</message>
</context>
<context>
@@ -800,18 +816,18 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Impossibile calcolare la chiave master</translation>
</message>
</context>
<context>
<name>Main</name>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
<translation type="unfinished"/>
<translation>Errore fatale durante il test delle funzioni di crittografia.</translation>
</message>
<message>
<source>KeePassX - Error</source>
<translation type="unfinished"/>
<translation>KeePassx - Errore</translation>
</message>
</context>
<context>
@@ -916,18 +932,10 @@ Otherwise your changes are lost.</source>
<source>Find</source>
<translation>Trovare</translation>
</message>
<message>
<source>Username</source>
<translation>Nome Utente</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Copiare nome utente negli appunti</translation>
</message>
<message>
<source>Password</source>
<translation>Password</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Copiare password negli appunti</translation>
@@ -970,11 +978,23 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Toggle window</source>
<translation type="unfinished"/>
<translation>Cambia finestra</translation>
</message>
<message>
<source>Tools</source>
<translation type="unfinished"/>
<translation>Strumenti</translation>
</message>
<message>
<source>Copy username</source>
<translation>Copia nome utente</translation>
</message>
<message>
<source>Copy password</source>
<translation>Copia password</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Esporta in un file CSV</translation>
</message>
</context>
<context>
@@ -1182,19 +1202,19 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Language</source>
<translation type="unfinished"/>
<translation>Lingua</translation>
</message>
<message>
<source>Show a system tray icon</source>
<translation type="unfinished"/>
<translation>Mostra un&apos;icona nell&apos;area di notifica del sistema</translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation type="unfinished"/>
<translation>Nascondi la finestra nell&apos;area di notifica del sistema quando viene minimizzatala finestra</translation>
</message>
<message>
<source>Remember last key files</source>
<translation type="unfinished"/>
<translation>Ricorda gli ultimi files di chiave</translation>
</message>
</context>
<context>
@@ -1231,14 +1251,14 @@ Otherwise your changes are lost.</source>
<name>WelcomeWidget</name>
<message>
<source>Welcome!</source>
<translation>Benvenuto/a!</translation>
<translation>Benvenuto!</translation>
</message>
</context>
<context>
<name>main</name>
<message>
<source>KeePassX - cross-platform password manager</source>
<translation>KeePassX - gestore di password cross-platform</translation>
<translation>KeePassX - gestore di password multipiattafroma</translation>
</message>
<message>
<source>filename of the password database to open (*.kdbx)</source>

View File

@@ -243,12 +243,6 @@
<source>Close?</source>
<translation>?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot;
?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>?</translation>
@@ -305,6 +299,23 @@ Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation type="unfinished"/>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export database to CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -916,18 +927,10 @@ Otherwise your changes are lost.</source>
<source>Find</source>
<translation></translation>
</message>
<message>
<source>Username</source>
<translation></translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation></translation>
</message>
<message>
<source>Password</source>
<translation></translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation></translation>
@@ -976,6 +979,18 @@ Otherwise your changes are lost.</source>
<source>Tools</source>
<translation></translation>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>

View File

@@ -109,6 +109,16 @@
<source>Different passwords supplied.</source>
<translation>Verschillende wachtwoorden opgegeven.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>Niet gelukt het sleutelbestand in te stellen</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Niet gelukt %1 als sleutelbestand in te stellen:
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
@@ -234,12 +244,6 @@
<source>Close?</source>
<translation>Sluiten?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; is in bewerkmodus.
Toch sluiten?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>Wijzigingen opslaan?</translation>
@@ -270,6 +274,54 @@ Opslaan?</translation>
<source>locked</source>
<translation>vergrendeld</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation>De database die u probeert te openen is vergrendeld door een andere instantie van KeePassX.
Wilt u toch doorgaan met openen? U kunt de database ook alleen-lezen openen.</translation>
</message>
<message>
<source>Lock database</source>
<translation>Database vergrendelen</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation>Kan de database niet vergrendelen omdat u deze momenteel aan het bewerken bent.
Druk op annuleren om uw wijzigingen aan te passen of gooi de wijzigingen weg.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Deze database is nog niet opgeslagen.
U kunt de database opslaan of het vergrendelen annuleren.</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation>Deze database is gewijzigd.
Wilt u de database opslaan voordat u deze vergrendelt?
Zo nee, dan gaan de wijzigingen verloren.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>&quot;%1&quot; is gewijzigd.
Wijzigingen ongedaan maken en doorgaan met sluiten?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Database exporteren naar CSV-bestand</translation>
</message>
<message>
<source>CSV file</source>
<translation>CSV-bestand</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Schrijven van het CSV-bestand mislukt.</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -313,6 +365,14 @@ Opslaan?</translation>
<source>Current group</source>
<translation>Huidige groep</translation>
</message>
<message>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -425,6 +485,10 @@ Opslaan?</translation>
<source>Save</source>
<translation>Opslaan</translation>
</message>
<message>
<source>Open</source>
<translation>Open</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -576,6 +640,14 @@ Opslaan?</translation>
<source>Auto-type</source>
<translation>Auto-typen</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>Gebruik standaard auto-typevolgorde van bovenliggende groep</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Stel standaard auto-typevolgorde in</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -724,6 +796,10 @@ Opslaan?</translation>
<source>Root</source>
<translation>Alles</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -739,6 +815,10 @@ Opslaan?</translation>
<source>Wrong key or database file is corrupt.</source>
<translation>Verkeerde sleutel of corrupte database.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -777,10 +857,6 @@ Opslaan?</translation>
<source>Groups</source>
<translation>Groepen</translation>
</message>
<message>
<source>Extras</source>
<translation>Extra&apos;s</translation>
</message>
<message>
<source>View</source>
<translation>Beeld</translation>
@@ -857,18 +933,10 @@ Opslaan?</translation>
<source>Find</source>
<translation>Vind</translation>
</message>
<message>
<source>Username</source>
<translation>Gebruikersnaam</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Kopieer gebruikersnaam naar klembord</translation>
</message>
<message>
<source>Password</source>
<translation>Wachtwoord</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Kopieer wachtwoord naar klembord</translation>
@@ -913,6 +981,22 @@ Opslaan?</translation>
<source>Toggle window</source>
<translation>Wissel venster</translation>
</message>
<message>
<source>Tools</source>
<translation>Hulpmiddelen</translation>
</message>
<message>
<source>Copy username</source>
<translation>Gebruikersnaam kopieren</translation>
</message>
<message>
<source>Copy password</source>
<translation>Wachtwoord kopiëren</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Naar CSV-bestand exporteren</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1093,10 +1177,6 @@ Opslaan?</translation>
<source>Open previous databases on startup</source>
<translation>Open vorige databases bij starten</translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation>Markeer database als gewijzigd bij wijzigen van de status</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Automatisch opslaan bij afsluiten</translation>
@@ -1133,6 +1213,10 @@ Opslaan?</translation>
<source>Hide window to system tray when minimized</source>
<translation>Bij minimaliseren enkel icoon in systray tonen</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Onthoud laatste sleutelbestanden</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
@@ -1163,14 +1247,6 @@ Opslaan?</translation>
<source>Unlock database</source>
<translation>Database ontgrendelen</translation>
</message>
<message>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Verkeerd wachtwoord</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>

View File

@@ -244,12 +244,6 @@
<source>Close?</source>
<translation>Fechar ?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; em modo de edição.
Fechar na mesma ?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>Guardar alterações ?</translation>
@@ -310,6 +304,24 @@ Otherwise your changes are lost.</source>
Pretende guardar a base de dados antes de a trancar ?
Caso contrário as alterações serão perdidas.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>%1 está em modo de edição.
Fechar e Ignorar alterações ?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Exportar base de dados para ficheiro CSV</translation>
</message>
<message>
<source>CSV file</source>
<translation>Ficheiro CSV</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Falha na escrita do ficheiro CSV</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -920,18 +932,10 @@ Caso contrário as alterações serão perdidas.</translation>
<source>Find</source>
<translation>Encontrar</translation>
</message>
<message>
<source>Username</source>
<translation>Nome de utilizador</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Copiar nome de utilizador para inserção</translation>
</message>
<message>
<source>Password</source>
<translation>Senha</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Copiar senha para inserção</translation>
@@ -980,6 +984,18 @@ Caso contrário as alterações serão perdidas.</translation>
<source>Tools</source>
<translation>Ferramentas</translation>
</message>
<message>
<source>Copy username</source>
<translation>Copiar nome de utilizador</translation>
</message>
<message>
<source>Copy password</source>
<translation>Copiar senha</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Exportar para ficheiro CSV</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>

View File

@@ -44,7 +44,7 @@
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation>Выберете запись для автоввода:</translation>
<translation>Выберите запись для автоввода:</translation>
</message>
</context>
<context>
@@ -103,12 +103,22 @@
</message>
<message>
<source>Do you really want to use an empty string as password?</source>
<translation>Вы действительно хотите использовать пустую строку как пароль?</translation>
<translation>Вы действительно хотите использовать в качестве пароля пустую строку?</translation>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Пароли не совпадают.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>Не удалось установить файл-ключ</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Не удалось установить %1 как файл-ключ:
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
@@ -150,7 +160,7 @@
</message>
<message>
<source>Select key file</source>
<translation>Выберете файл-ключ</translation>
<translation>Выберите файл-ключ</translation>
</message>
</context>
<context>
@@ -169,7 +179,7 @@
</message>
<message>
<source>Default username:</source>
<translation>Имя пользователя по-умолчанию:</translation>
<translation>Имя пользователя по умолчанию:</translation>
</message>
<message>
<source>Use recycle bin:</source>
@@ -234,12 +244,6 @@
<source>Close?</source>
<translation>Закрыть?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>«%1» в режиме редактирования.
Всё равно закрыть?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>Сохранить изменения?</translation>
@@ -268,14 +272,56 @@ Save changes?</source>
</message>
<message>
<source>locked</source>
<translation>заблокированно</translation>
<translation>заблокировано</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Lock database</source>
<translation>Заблокировать хранилище</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation type="unfinished"/>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation type="unfinished"/>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation type="unfinished"/>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Экспортировать хранилище в файл CSV</translation>
</message>
<message>
<source>CSV file</source>
<translation>Файл CSV</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Change master key</source>
<translation>Сменить мастер-пароль</translation>
<translation>Изменить мастер-пароль</translation>
</message>
<message>
<source>Delete entry?</source>
@@ -313,6 +359,14 @@ Save changes?</source>
<source>Current group</source>
<translation>Текущая группа</translation>
</message>
<message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Невозможно вычислить мастер-пароль</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -326,7 +380,7 @@ Save changes?</source>
</message>
<message>
<source>Icon</source>
<translation>Иконка</translation>
<translation>Значок</translation>
</message>
<message>
<source>Auto-Type</source>
@@ -425,6 +479,10 @@ Save changes?</source>
<source>Save</source>
<translation>Сохранить</translation>
</message>
<message>
<source>Open</source>
<translation>Открыть</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -527,7 +585,7 @@ Save changes?</source>
</message>
<message>
<source>Icon</source>
<translation>Иконка</translation>
<translation>Значок</translation>
</message>
<message>
<source>Properties</source>
@@ -574,26 +632,34 @@ Save changes?</source>
</message>
<message>
<source>Auto-type</source>
<translation>автоввод</translation>
<translation>Автоввод</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
<message>
<source>Use default icon</source>
<translation>Использовать стандартную иконку</translation>
<translation>Использовать стандартный значок</translation>
</message>
<message>
<source>Use custom icon</source>
<translation>Использовать свою иконку</translation>
<translation>Использовать свой значок</translation>
</message>
<message>
<source>Add custom icon</source>
<translation>Добавить свою иконку</translation>
<translation>Добавить свой значок</translation>
</message>
<message>
<source>Delete custom icon</source>
<translation>Удалить свою иконку</translation>
<translation>Удалить свой значок</translation>
</message>
<message>
<source>Images</source>
@@ -609,11 +675,11 @@ Save changes?</source>
</message>
<message>
<source>Can&apos;t delete icon!</source>
<translation>Не могу удалить иконку!</translation>
<translation>Не могу удалить значок!</translation>
</message>
<message numerus="yes">
<source>Can&apos;t delete icon. Still used by %n item(s).</source>
<translation><numerusform>Не могу удалить иконку, %n запись всё ещё использует её.</numerusform><numerusform>Не могу удалить иконку, %n записи всё ещё использует её.</numerusform><numerusform>Не могу удалить иконку, %n записей всё ещё использует её.</numerusform><numerusform>Не могу удалить иконку, %n записей всё ещё использует её.</numerusform></translation>
<translation><numerusform>Не могу удалить иконку, %n запись всё ещё использует её.</numerusform><numerusform>Не могу удалить иконку, %n записи всё ещё использует её.</numerusform><numerusform>Не могу удалить иконку, %n записей всё ещё использует её.</numerusform><numerusform>Не могу удалить значок, %n записей всё ещё использует его.</numerusform></translation>
</message>
</context>
<context>
@@ -724,6 +790,10 @@ Save changes?</source>
<source>Root</source>
<translation>Корень</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Невозможно вычислить мастер-пароль</translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -739,6 +809,10 @@ Save changes?</source>
<source>Wrong key or database file is corrupt.</source>
<translation>Неверный ключ или файл хранилища повреждён.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Невозможно вычислить мастер-пароль</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -777,10 +851,6 @@ Save changes?</source>
<source>Groups</source>
<translation>Группы</translation>
</message>
<message>
<source>Extras</source>
<translation>Дополнительно</translation>
</message>
<message>
<source>View</source>
<translation>Вид</translation>
@@ -857,18 +927,10 @@ Save changes?</source>
<source>Find</source>
<translation>Найти</translation>
</message>
<message>
<source>Username</source>
<translation>Имя пользователя</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Скопировать имя пользователя в буфер обмена</translation>
</message>
<message>
<source>Password</source>
<translation>Пароль</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Скопировать пароль в буфер обмена</translation>
@@ -913,6 +975,22 @@ Save changes?</source>
<source>Toggle window</source>
<translation>Переключить окно</translation>
</message>
<message>
<source>Tools</source>
<translation>Инструменты</translation>
</message>
<message>
<source>Copy username</source>
<translation>Скопировать имя пользователя</translation>
</message>
<message>
<source>Copy password</source>
<translation>Скопировать пароль</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Экспортировать в файл CSV</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -950,7 +1028,7 @@ Save changes?</source>
</message>
<message>
<source>Ensure that the password contains characters from every group</source>
<translation>Пожалуйста, пусть пароль будет содержать символы всех видов</translation>
<translation>Убедитесь, что пароль содержит символы всех видов</translation>
</message>
<message>
<source>Accept</source>
@@ -1023,19 +1101,19 @@ Save changes?</source>
</message>
<message>
<source>Error writing to underlying device: </source>
<translation>Ошибка записи на нижлежащее устройство:</translation>
<translation>Ошибка записи на низлежащее устройство:</translation>
</message>
<message>
<source>Error opening underlying device: </source>
<translation>Ошибка открытия нижлежащего устройства:</translation>
<translation>Ошибка открытия низлежащего устройства:</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
<translation>Ошибка чтения с нижлежащего устройства:</translation>
<translation>Ошибка чтения с низлежащего устройства:</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
<translation>Внутренняя ошибка zlib при расжатии:</translation>
<translation>Внутренняя ошибка zlib при распаковке:</translation>
</message>
</context>
<context>
@@ -1093,10 +1171,6 @@ Save changes?</source>
<source>Open previous databases on startup</source>
<translation>Открывать предыдущее хранилище при запуске</translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation type="unfinished"/>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Автоматически сохранять при выходе</translation>
@@ -1133,12 +1207,16 @@ Save changes?</source>
<source>Hide window to system tray when minimized</source>
<translation>При сворачивании прятать окно в область системных уведомлений</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Запоминать последние файл-ключи</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
<message>
<source>Clear clipboard after</source>
<translation>Потом почтистить буфер обмена</translation>
<translation>Очищать буфер обмена через</translation>
</message>
<message>
<source> sec</source>
@@ -1150,7 +1228,7 @@ Save changes?</source>
</message>
<message>
<source>Show passwords in cleartext by default</source>
<translation>Показывать пароль в открытую по-умолчанию</translation>
<translation>По умолчанию показывать пароль в открытую</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
@@ -1163,14 +1241,6 @@ Save changes?</source>
<source>Unlock database</source>
<translation>Разблокировать хранилище</translation>
</message>
<message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Неверный ключ.</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>

View File

@@ -109,6 +109,15 @@
<source>Different passwords supplied.</source>
<translation>Olika lösenord angivna</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
@@ -234,12 +243,6 @@
<source>Close?</source>
<translation>Stäng?</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; är i redigerar-läge.
Stäng ändå?</translation>
</message>
<message>
<source>Save changes?</source>
<translation>Spara ändringar?</translation>
@@ -270,6 +273,48 @@ Spara ändringarna?</translation>
<source>locked</source>
<translation>låst</translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Lock database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation type="unfinished"/>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation type="unfinished"/>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation type="unfinished"/>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export database to CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -313,6 +358,14 @@ Spara ändringarna?</translation>
<source>Current group</source>
<translation>Nuvarande grupp</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -425,6 +478,10 @@ Spara ändringarna?</translation>
<source>Save</source>
<translation>Spara</translation>
</message>
<message>
<source>Open</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -576,6 +633,14 @@ Spara ändringarna?</translation>
<source>Auto-type</source>
<translation>Auto-skriv</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -724,6 +789,10 @@ Spara ändringarna?</translation>
<source>Root</source>
<translation>Root</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -739,6 +808,10 @@ Spara ändringarna?</translation>
<source>Wrong key or database file is corrupt.</source>
<translation>Fel lösenord eller korrupt databas-fil</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>Main</name>
@@ -777,10 +850,6 @@ Spara ändringarna?</translation>
<source>Groups</source>
<translation>Grupper</translation>
</message>
<message>
<source>Extras</source>
<translation>Extra</translation>
</message>
<message>
<source>View</source>
<translation>Vy</translation>
@@ -857,18 +926,10 @@ Spara ändringarna?</translation>
<source>Find</source>
<translation>Sök</translation>
</message>
<message>
<source>Username</source>
<translation>Användarnamn</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Kopiera användarnamn</translation>
</message>
<message>
<source>Password</source>
<translation>Lösenord</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Kopiera lösenord</translation>
@@ -913,6 +974,22 @@ Spara ändringarna?</translation>
<source>Toggle window</source>
<translation>Visa/dölj fönster</translation>
</message>
<message>
<source>Tools</source>
<translation type="unfinished"/>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1093,10 +1170,6 @@ Spara ändringarna?</translation>
<source>Open previous databases on startup</source>
<translation>Öppna senaste databasen är programmet startar</translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation>Markera som ändrad när utökat läge ändras</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Spara automatiskt är applikationen anslutas</translation>
@@ -1133,6 +1206,10 @@ Spara ändringarna?</translation>
<source>Hide window to system tray when minimized</source>
<translation>Vid minimering, minimera fönstret till systemfältet</translation>
</message>
<message>
<source>Remember last key files</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
@@ -1163,14 +1240,6 @@ Spara ändringarna?</translation>
<source>Unlock database</source>
<translation>Lås upp databas</translation>
</message>
<message>
<source>Error</source>
<translation>Fel</translation>
</message>
<message>
<source>Wrong key.</source>
<translation>Fel lösenord</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>

View File

@@ -244,12 +244,6 @@
<source>Close?</source>
<translation></translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation> &quot;%1&quot;
</translation>
</message>
<message>
<source>Save changes?</source>
<translation></translation>
@@ -310,6 +304,23 @@ Otherwise your changes are lost.</source>
</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export database to CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -921,18 +932,10 @@ Otherwise your changes are lost.</source>
<source>Find</source>
<translation></translation>
</message>
<message>
<source>Username</source>
<translation></translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation></translation>
</message>
<message>
<source>Password</source>
<translation></translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation></translation>
@@ -981,6 +984,18 @@ Otherwise your changes are lost.</source>
<source>Tools</source>
<translation></translation>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>

View File

@@ -109,6 +109,16 @@
<source>Different passwords supplied.</source>
<translation></translation>
</message>
<message>
<source>Failed to set key file</source>
<translation></translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation> %1
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
@@ -234,11 +244,6 @@
<source>Close?</source>
<translation></translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Close anyway?</source>
<translation>&quot;%1&quot; </translation>
</message>
<message>
<source>Save changes?</source>
<translation></translation>
@@ -268,6 +273,53 @@ Save changes?</source>
<source>locked</source>
<translation></translation>
</message>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation> KeePassX
</translation>
</message>
<message>
<source>Lock database</source>
<translation></translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation>
</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>
</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation>
</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export database to CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -311,6 +363,14 @@ Save changes?</source>
<source>Current group</source>
<translation></translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation></translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -423,6 +483,10 @@ Save changes?</source>
<source>Save</source>
<translation></translation>
</message>
<message>
<source>Open</source>
<translation></translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -574,6 +638,14 @@ Save changes?</source>
<source>Auto-type</source>
<translation></translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>使</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation></translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -722,6 +794,10 @@ Save changes?</source>
<source>Root</source>
<translation></translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation></translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -737,6 +813,10 @@ Save changes?</source>
<source>Wrong key or database file is corrupt.</source>
<translation></translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation></translation>
</message>
</context>
<context>
<name>Main</name>
@@ -775,10 +855,6 @@ Save changes?</source>
<source>Groups</source>
<translation></translation>
</message>
<message>
<source>Extras</source>
<translation></translation>
</message>
<message>
<source>View</source>
<translation></translation>
@@ -855,18 +931,10 @@ Save changes?</source>
<source>Find</source>
<translation></translation>
</message>
<message>
<source>Username</source>
<translation>使</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>使簿</translation>
</message>
<message>
<source>Password</source>
<translation></translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>簿</translation>
@@ -911,6 +979,22 @@ Save changes?</source>
<source>Toggle window</source>
<translation></translation>
</message>
<message>
<source>Tools</source>
<translation></translation>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1091,10 +1175,6 @@ Save changes?</source>
<source>Open previous databases on startup</source>
<translation></translation>
</message>
<message>
<source>Mark as modified on expanded state changes</source>
<translation></translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation></translation>
@@ -1131,6 +1211,10 @@ Save changes?</source>
<source>Hide window to system tray when minimized</source>
<translation> </translation>
</message>
<message>
<source>Remember last key files</source>
<translation></translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
@@ -1161,14 +1245,6 @@ Save changes?</source>
<source>Unlock database</source>
<translation></translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Wrong key.</source>
<translation></translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>

View File

@@ -160,7 +160,7 @@ uint AutoTypePlatformX11::qtToNativeModifiers(Qt::KeyboardModifiers modifiers)
void AutoTypePlatformX11::unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
{
KeyCode keycode = XKeysymToKeycode(m_dpy, keyToKeySym(key));
KeyCode keycode = XKeysymToKeycode(m_dpy, charToKeySym(key));
uint nativeModifiers = qtToNativeModifiers(modifiers);
XUngrabKey(m_dpy, keycode, nativeModifiers, m_rootWindow);

View File

@@ -83,10 +83,7 @@ public:
// Returns \c true if the lock belongs to dead PID, or is old.
// The attempt to delete it will tell us if it was really stale or not, though.
bool isApparentlyStale() const;
#ifdef Q_OS_UNIX
static int checkFcntlWorksAfterFlock();
#endif
static QString processNameByPid(qint64 pid);
QString fileName;
#ifdef Q_OS_WIN

View File

@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -42,10 +43,17 @@
#include <sys/file.h> // flock
#include <sys/types.h> // kill
#include <signal.h> // kill
#include <unistd.h>
#include <unistd.h> // gethostname
#include <errno.h>
#if defined(Q_OS_MAC)
# include <libproc.h>
#elif defined(Q_OS_LINUX)
# include <unistd.h>
# include <cstdio>
#endif
QT_BEGIN_NAMESPACE
#define EINTR_LOOP(var, cmd) \
@@ -77,13 +85,13 @@ static inline qint64 qt_safe_write(int fd, const void *data, qint64 len)
return ret;
}
static QString localHostName() // from QHostInfo::localHostName()
static QByteArray localHostName() // from QHostInfo::localHostName(), modified to return a QByteArray
{
char hostName[512];
if (gethostname(hostName, sizeof(hostName)) == -1)
return QString();
hostName[sizeof(hostName) - 1] = '\0';
return QString::fromLocal8Bit(hostName);
QByteArray hostName(512, Qt::Uninitialized);
if (gethostname(hostName.data(), hostName.size()) == -1)
return QByteArray();
hostName.truncate(strlen(hostName.data()));
return hostName;
}
// ### merge into qt_safe_write?
@@ -122,8 +130,8 @@ QLockFile::LockError QLockFilePrivate::tryLock_sys()
// (otherwise we'd have to check every write call)
// Use operator% from the fast builder to avoid multiple memory allocations.
QByteArray fileData = QByteArray::number(QCoreApplication::applicationPid()) + '\n'
+ qAppName().toUtf8() + '\n'
+ localHostName().toUtf8() + '\n';
+ QCoreApplication::applicationName().toUtf8() + '\n'
+ localHostName() + '\n';
const QByteArray lockFileName = QFile::encodeName(fileName);
const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY | O_CREAT | O_EXCL, 0644);
@@ -161,7 +169,13 @@ bool QLockFilePrivate::removeStaleLock()
const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0644);
if (fd < 0) // gone already?
return false;
#ifdef Q_OS_MAC
// ugly workaround: ignore setNativeLocks() result on Mac since it's broken there
setNativeLocks(fd);
bool success = (::unlink(lockFileName) == 0);
#else
bool success = setNativeLocks(fd) && (::unlink(lockFileName) == 0);
#endif
close(fd);
return success;
}
@@ -170,16 +184,48 @@ bool QLockFilePrivate::isApparentlyStale() const
{
qint64 pid;
QString hostname, appname;
if (!getLockInfo(&pid, &hostname, &appname))
return false;
if (hostname.isEmpty() || hostname == localHostName()) {
if (::kill(pid, 0) == -1 && errno == ESRCH)
return true; // PID doesn't exist anymore
if (getLockInfo(&pid, &hostname, &appname)) {
if (hostname.isEmpty() || hostname == QString::fromLocal8Bit(localHostName())) {
if (::kill(pid, 0) == -1 && errno == ESRCH)
return true; // PID doesn't exist anymore
const QString processName = processNameByPid(pid);
if (!processName.isEmpty()) {
QFileInfo fi(appname);
if (fi.isSymLink())
fi.setFile(fi.symLinkTarget());
if (processName.toLower() != fi.fileName().toLower())
return true; // PID got reused by a different application.
}
}
}
const qint64 age = QFileInfo(fileName).lastModified().secsTo(QDateTime::currentDateTime()) * 1000;
return staleLockTime > 0 && age > staleLockTime;
}
QString QLockFilePrivate::processNameByPid(qint64 pid)
{
#if defined(Q_OS_MAC)
char name[1024];
proc_name(pid, name, sizeof(name) / sizeof(char));
return QFile::decodeName(name);
#elif defined(Q_OS_LINUX)
if (!QFile::exists(QString("/proc/version")))
return QString();
char exePath[64];
char buf[PATH_MAX + 1];
sprintf(exePath, "/proc/%lld/exe", pid);
size_t len = static_cast<size_t>(readlink(exePath, buf, sizeof(buf)));
if (len >= sizeof(buf)) {
// The pid is gone. Return some invalid process name to fail the test.
return QString("/ERROR/");
}
buf[len] = 0;
return QFileInfo(QFile::decodeName(buf)).fileName();
#else
return QString();
#endif
}
void QLockFile::unlock()
{
Q_D(QLockFile);
@@ -191,7 +237,6 @@ void QLockFile::unlock()
qWarning() << "Could not remove our own lock file" << d->fileName << "maybe permissions changed meanwhile?";
// This is bad because other users of this lock file will now have to wait for the stale-lock-timeout...
}
QFile::remove(d->fileName);
d->lockError = QLockFile::NoError;
d->isLocked = false;
}

View File

@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -134,27 +135,75 @@ bool QLockFilePrivate::isApparentlyStale() const
{
qint64 pid;
QString hostname, appname;
if (!getLockInfo(&pid, &hostname, &appname))
return false;
// On WinRT there seems to be no way of obtaining information about other
// processes due to sandboxing
#ifndef Q_OS_WINRT
if (hostname == QString::fromLocal8Bit(localHostName())) {
HANDLE procHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
if (!procHandle)
return true;
// We got a handle but check if process is still alive
DWORD dwR = ::WaitForSingleObject(procHandle, 0);
::CloseHandle(procHandle);
if (dwR == WAIT_TIMEOUT)
return true;
if (getLockInfo(&pid, &hostname, &appname)) {
if (hostname.isEmpty() || hostname == QString::fromLocal8Bit(localHostName())) {
HANDLE procHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
if (!procHandle)
return true;
// We got a handle but check if process is still alive
DWORD dwR = ::WaitForSingleObject(procHandle, 0);
::CloseHandle(procHandle);
if (dwR == WAIT_TIMEOUT)
return true;
const QString processName = processNameByPid(pid);
if (!processName.isEmpty() && processName != appname)
return true; // PID got reused by a different application.
}
}
#endif // !Q_OS_WINRT
#else // !Q_OS_WINRT
Q_UNUSED(pid);
Q_UNUSED(hostname);
Q_UNUSED(appname);
#endif // Q_OS_WINRT
const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime());
return staleLockTime > 0 && age > staleLockTime;
}
QString QLockFilePrivate::processNameByPid(qint64 pid)
{
#if !defined(Q_OS_WINRT) && !defined(Q_OS_WINCE)
typedef DWORD (WINAPI *GetModuleFileNameExFunc)(HANDLE, HMODULE, LPTSTR, DWORD);
HMODULE hPsapi = LoadLibraryA("psapi");
if (!hPsapi)
return QString();
GetModuleFileNameExFunc qGetModuleFileNameEx
= (GetModuleFileNameExFunc)GetProcAddress(hPsapi, "GetModuleFileNameExW");
if (!qGetModuleFileNameEx) {
FreeLibrary(hPsapi);
return QString();
}
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, DWORD(pid));
if (!hProcess) {
FreeLibrary(hPsapi);
return QString();
}
wchar_t buf[MAX_PATH];
const DWORD length = qGetModuleFileNameEx(hProcess, NULL, buf, sizeof(buf) / sizeof(wchar_t));
CloseHandle(hProcess);
FreeLibrary(hPsapi);
if (!length)
return QString();
QString name = QString::fromWCharArray(buf, length);
int i = name.lastIndexOf(QLatin1Char('\\'));
if (i >= 0)
name.remove(0, i + 1);
i = name.lastIndexOf(QLatin1Char('.'));
if (i >= 0)
name.truncate(i);
return name;
#else
Q_UNUSED(pid);
return QString();
#endif
}
void QLockFile::unlock()
{
Q_D(QLockFile);

View File

@@ -127,6 +127,20 @@ void KeePass2Writer::writeDatabase(QIODevice* device, Database* db)
KeePass2XmlWriter xmlWriter;
xmlWriter.writeDatabase(m_device, db, &randomStream, headerHash);
// Explicitly close/reset streams so they are flushed and we can detect
// errors. QIODevice::close() resets errorString() etc.
if (ioCompressor) {
ioCompressor->close();
}
if (!hashedStream.reset()) {
raiseError(hashedStream.errorString());
return;
}
if (!cipherStream.reset()) {
raiseError(cipherStream.errorString());
return;
}
if (xmlWriter.hasError()) {
raiseError(xmlWriter.errorString());
}

View File

@@ -57,6 +57,12 @@ void KeePass2XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2R
m_xml.writeEndElement();
m_xml.writeEndDocument();
#if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0)
if (m_xml.hasError()) {
raiseError(device->errorString());
}
#endif
}
void KeePass2XmlWriter::writeDatabase(const QString& filename, Database* db)

View File

@@ -295,24 +295,24 @@ bool DatabaseTabWidget::saveDatabase(Database* db)
DatabaseManagerStruct& dbStruct = m_dbList[db];
if (dbStruct.saveToFilename) {
bool result = false;
QSaveFile saveFile(dbStruct.filePath);
if (saveFile.open(QIODevice::WriteOnly)) {
m_writer.writeDatabase(&saveFile, db);
result = saveFile.commit();
if (m_writer.hasError()) {
MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ m_writer.errorString());
return false;
}
if (!saveFile.commit()) {
MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ saveFile.errorString());
return false;
}
}
if (result) {
dbStruct.modified = false;
updateTabName(db);
return true;
}
else {
MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ saveFile.errorString());
return false;
}
dbStruct.modified = false;
updateTabName(db);
return true;
}
else {
return saveDatabaseAs(db);
@@ -326,8 +326,12 @@ bool DatabaseTabWidget::saveDatabaseAs(Database* db)
if (dbStruct.saveToFilename) {
oldFileName = dbStruct.filePath;
}
else {
oldFileName = tr("New database").append(".kdbx");
}
QString fileName = fileDialog()->getSaveFileName(this, tr("Save database as"),
oldFileName, tr("KeePass 2 Database").append(" (*.kdbx)"));
oldFileName, tr("KeePass 2 Database").append(" (*.kdbx)"),
Q_NULLPTR, 0, "kdbx");
if (!fileName.isEmpty()) {
QFileInfo fileInfo(fileName);
QString lockFilePath;
@@ -370,6 +374,11 @@ bool DatabaseTabWidget::saveDatabaseAs(Database* db)
}
m_writer.writeDatabase(&saveFile, db);
if (m_writer.hasError()) {
MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ m_writer.errorString());
return false;
}
if (!saveFile.commit()) {
MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ saveFile.errorString());
@@ -442,7 +451,8 @@ void DatabaseTabWidget::exportToCsv()
}
QString fileName = fileDialog()->getSaveFileName(this, tr("Export database to CSV file"),
QString(), tr("CSV file").append(" (*.csv)"));
QString(), tr("CSV file").append(" (*.csv)"),
Q_NULLPTR, 0, "csv");
if (fileName.isEmpty()) {
return;
}

View File

@@ -889,8 +889,17 @@ void DatabaseWidget::clearLastGroup(Group* group)
void DatabaseWidget::lock()
{
Q_ASSERT(currentMode() != DatabaseWidget::LockedMode);
if (isInSearchMode()) {
closeSearch();
}
if (m_groupView->currentGroup()) {
m_groupBeforeLock = m_groupView->currentGroup()->uuid();
}
else {
m_groupBeforeLock = m_db->rootGroup()->uuid();
}
m_groupBeforeLock = m_groupView->currentGroup()->uuid();
clearAllWidgets();
m_unlockDatabaseWidget->load(m_filename);
setCurrentWidget(m_unlockDatabaseWidget);

View File

@@ -53,7 +53,7 @@ QString FileDialog::getOpenFileName(QWidget* parent, const QString& caption, QSt
QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, QString dir,
const QString& filter, QString* selectedFilter,
QFileDialog::Options options)
QFileDialog::Options options, const QString& defaultExtension)
{
if (!m_nextFileName.isEmpty()) {
QString result = m_nextFileName;
@@ -65,8 +65,29 @@ QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, QSt
dir = config()->get("LastDir").toString();
}
QString result = QFileDialog::getSaveFileName(parent, caption, dir, filter,
selectedFilter, options);
QString result;
#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
// the native dialogs on these platforms already append the file extension
result = QFileDialog::getSaveFileName(parent, caption, dir, filter,
selectedFilter, options);
#else
QFileDialog dialog(parent, caption, dir, filter);
dialog.setAcceptMode(QFileDialog::AcceptSave);
dialog.setFileMode(QFileDialog::AnyFile);
if (selectedFilter) {
dialog.selectNameFilter(*selectedFilter);
}
dialog.setOptions(options);
dialog.setDefaultSuffix(defaultExtension);
QStringList results;
if (dialog.exec()) {
results = dialog.selectedFiles();
if (!results.isEmpty()) {
result = results[0];
}
}
#endif
// on Mac OS X the focus is lost after closing the native dialog
if (parent) {

View File

@@ -27,10 +27,11 @@ class FileDialog
public:
QString getOpenFileName(QWidget* parent = Q_NULLPTR, const QString& caption = QString(),
QString dir = QString(), const QString& filter = QString(),
QString* selectedFilter = Q_NULLPTR, QFileDialog::Options options = Q_NULLPTR);
QString* selectedFilter = Q_NULLPTR, QFileDialog::Options options = 0);
QString getSaveFileName(QWidget* parent = Q_NULLPTR, const QString& caption = QString(),
QString dir = QString(), const QString& filter = QString(),
QString* selectedFilter = Q_NULLPTR, QFileDialog::Options options = Q_NULLPTR);
QString* selectedFilter = Q_NULLPTR, QFileDialog::Options options = 0,
const QString& defaultExtension = QString());
/**
* Sets the result of the next get* method call.

View File

@@ -512,6 +512,7 @@ void MainWindow::updateTrayIcon()
}
else {
if (m_trayIcon) {
m_trayIcon->hide();
delete m_trayIcon;
m_trayIcon = Q_NULLPTR;
}

View File

@@ -54,7 +54,9 @@ void HashedBlockStream::init()
bool HashedBlockStream::reset()
{
if (isWritable()) {
// Write final block(s) only if device is writable and we haven't
// already written a final block.
if (isWritable() && (!m_buffer.isEmpty() || m_blockIndex != 0)) {
if (!m_buffer.isEmpty()) {
if (!writeHashedBlock()) {
return false;
@@ -74,7 +76,9 @@ bool HashedBlockStream::reset()
void HashedBlockStream::close()
{
if (isWritable()) {
// Write final block(s) only if device is writable and we haven't
// already written a final block.
if (isWritable() && (!m_buffer.isEmpty() || m_blockIndex != 0)) {
if (!m_buffer.isEmpty()) {
writeHashedBlock();
}

View File

@@ -25,6 +25,7 @@ SymmetricCipherStream::SymmetricCipherStream(QIODevice* baseDevice, SymmetricCip
, m_bufferFilling(false)
, m_error(false)
, m_isInitalized(false)
, m_dataWritten(false)
{
}
@@ -43,6 +44,16 @@ bool SymmetricCipherStream::init(const QByteArray& key, const QByteArray& iv)
return m_isInitalized;
}
void SymmetricCipherStream::resetInternalState()
{
m_buffer.clear();
m_bufferPos = 0;
m_bufferFilling = false;
m_error = false;
m_dataWritten = false;
m_cipher->reset();
}
bool SymmetricCipherStream::open(QIODevice::OpenMode mode)
{
if (!m_isInitalized) {
@@ -54,27 +65,25 @@ bool SymmetricCipherStream::open(QIODevice::OpenMode mode)
bool SymmetricCipherStream::reset()
{
if (isWritable()) {
if (isWritable() && m_dataWritten) {
if (!writeBlock(true)) {
return false;
}
}
m_buffer.clear();
m_bufferPos = 0;
m_bufferFilling = false;
m_error = false;
m_cipher->reset();
resetInternalState();
return true;
}
void SymmetricCipherStream::close()
{
if (isWritable()) {
if (isWritable() && m_dataWritten) {
writeBlock(true);
}
resetInternalState();
LayeredStream::close();
}
@@ -115,11 +124,25 @@ qint64 SymmetricCipherStream::readData(char* data, qint64 maxSize)
bool SymmetricCipherStream::readBlock()
{
QByteArray newData;
if (m_bufferFilling) {
m_buffer.append(m_baseDevice->read(m_cipher->blockSize() - m_buffer.size()));
newData.resize(m_cipher->blockSize() - m_buffer.size());
}
else {
m_buffer = m_baseDevice->read(m_cipher->blockSize());
m_buffer.clear();
newData.resize(m_cipher->blockSize());
}
int readResult = m_baseDevice->read(newData.data(), newData.size());
if (readResult == -1) {
m_error = true;
setErrorString(m_baseDevice->errorString());
return false;
}
else {
m_buffer.append(newData.left(readResult));
}
if (m_buffer.size() != m_cipher->blockSize()) {
@@ -172,6 +195,7 @@ qint64 SymmetricCipherStream::writeData(const char* data, qint64 maxSize)
return -1;
}
m_dataWritten = true;
qint64 bytesRemaining = maxSize;
qint64 offset = 0;
@@ -200,6 +224,8 @@ qint64 SymmetricCipherStream::writeData(const char* data, qint64 maxSize)
bool SymmetricCipherStream::writeBlock(bool lastBlock)
{
Q_ASSERT(lastBlock || (m_buffer.size() == m_cipher->blockSize()));
if (lastBlock) {
// PKCS7 padding
int padLen = m_cipher->blockSize() - m_buffer.size();
@@ -207,9 +233,6 @@ bool SymmetricCipherStream::writeBlock(bool lastBlock)
m_buffer.append(static_cast<char>(padLen));
}
}
else if (m_buffer.isEmpty()) {
return true;
}
if (!m_cipher->processInPlace(m_buffer)) {
m_error = true;
@@ -219,7 +242,7 @@ bool SymmetricCipherStream::writeBlock(bool lastBlock)
if (m_baseDevice->write(m_buffer) != m_buffer.size()) {
m_error = true;
setErrorString(m_cipher->errorString());
setErrorString(m_baseDevice->errorString());
return false;
}
else {

View File

@@ -42,6 +42,7 @@ protected:
qint64 writeData(const char* data, qint64 maxSize) Q_DECL_OVERRIDE;
private:
void resetInternalState();
bool readBlock();
bool writeBlock(bool lastBlock);
@@ -51,6 +52,7 @@ private:
bool m_bufferFilling;
bool m_error;
bool m_isInitalized;
bool m_dataWritten;
};
#endif // KEEPASSX_SYMMETRICCIPHERSTREAM_H

View File

@@ -93,9 +93,9 @@ set(TEST_LIBRARIES
${ZLIB_LIBRARIES}
)
set(modeltest_SOURCRS modeltest.cpp)
qt4_wrap_cpp(modeltest_SOURCRS modeltest.h)
add_library(modeltest STATIC ${modeltest_SOURCRS})
set(testsupport_SOURCES modeltest.cpp FailDevice.cpp)
qt4_wrap_cpp(testsupport_SOURCES modeltest.h FailDevice.h)
add_library(testsupport STATIC ${testsupport_SOURCES})
add_unit_test(NAME testgroup SOURCES TestGroup.cpp MOCS TestGroup.h
LIBS ${TEST_LIBRARIES})
@@ -110,13 +110,13 @@ add_unit_test(NAME testkeepass2reader SOURCES TestKeePass2Reader.cpp MOCS TestKe
LIBS ${TEST_LIBRARIES})
add_unit_test(NAME testkeepass2writer SOURCES TestKeePass2Writer.cpp MOCS TestKeePass2Writer.h
LIBS ${TEST_LIBRARIES})
LIBS testsupport ${TEST_LIBRARIES})
add_unit_test(NAME testgroupmodel SOURCES TestGroupModel.cpp MOCS TestGroupModel.h
LIBS modeltest ${TEST_LIBRARIES})
LIBS testsupport ${TEST_LIBRARIES})
add_unit_test(NAME testentrymodel SOURCES TestEntryModel.cpp MOCS TestEntryModel.h
LIBS modeltest ${TEST_LIBRARIES})
LIBS testsupport ${TEST_LIBRARIES})
add_unit_test(NAME testcryptohash SOURCES TestCryptoHash.cpp MOCS TestCryptoHash.h
LIBS ${TEST_LIBRARIES})
@@ -125,7 +125,7 @@ add_unit_test(NAME testsymmetriccipher SOURCES TestSymmetricCipher.cpp MOCS Test
LIBS ${TEST_LIBRARIES})
add_unit_test(NAME testhashedblockstream SOURCES TestHashedBlockStream.cpp MOCS TestHashedBlockStream.h
LIBS ${TEST_LIBRARIES})
LIBS testsupport ${TEST_LIBRARIES})
add_unit_test(NAME testkeepass2randomstream SOURCES TestKeePass2RandomStream.cpp MOCS TestKeePass2RandomStream.h
LIBS ${TEST_LIBRARIES})

63
tests/FailDevice.cpp Normal file
View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) 2015 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 or (at your option)
* version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "FailDevice.h"
FailDevice::FailDevice(int failAfter, QObject* parent)
: QBuffer(parent)
, m_failAfter(failAfter)
, m_readCount(0)
, m_writeCount(0)
{
}
bool FailDevice::open(QIODevice::OpenMode openMode)
{
return QBuffer::open(openMode | QIODevice::Unbuffered);
}
qint64 FailDevice::readData(char* data, qint64 len)
{
if (m_readCount >= m_failAfter) {
setErrorString("FAILDEVICE");
return -1;
}
else {
qint64 result = QBuffer::readData(data, len);
if (result != -1) {
m_readCount += result;
}
return result;
}
}
qint64 FailDevice::writeData(const char* data, qint64 len)
{
if (m_writeCount >= m_failAfter) {
setErrorString("FAILDEVICE");
return -1;
}
else {
qint64 result = QBuffer::writeData(data, len);
if (result != -1) {
m_writeCount += result;
}
return result;
}
}

43
tests/FailDevice.h Normal file
View File

@@ -0,0 +1,43 @@
/*
* Copyright (C) 2015 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 or (at your option)
* version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KEEPASSX_FAILDEVICE_H
#define KEEPASSX_FAILDEVICE_H
#include <QBuffer>
#include "core/Global.h"
class FailDevice : public QBuffer
{
Q_OBJECT
public:
explicit FailDevice(int failAfter, QObject* parent = Q_NULLPTR);
bool open(QIODevice::OpenMode openMode) Q_DECL_OVERRIDE;
protected:
qint64 readData(char* data, qint64 len) Q_DECL_OVERRIDE;
qint64 writeData(const char* data, qint64 len) Q_DECL_OVERRIDE;
private:
int m_failAfter;
int m_readCount;
int m_writeCount;
};
#endif // KEEPASSX_FAILDEVICE_H

View File

@@ -21,6 +21,7 @@
#include <QTest>
#include "tests.h"
#include "FailDevice.h"
#include "crypto/Crypto.h"
#include "streams/HashedBlockStream.h"
@@ -71,3 +72,34 @@ void TestHashedBlockStream::testWriteRead()
buffer.reset();
buffer.buffer().clear();
}
void TestHashedBlockStream::testReset()
{
QBuffer buffer;
QVERIFY(buffer.open(QIODevice::WriteOnly));
HashedBlockStream writer(&buffer, 16);
QVERIFY(writer.open(QIODevice::WriteOnly));
QCOMPARE(writer.write(QByteArray(8, 'Z')), qint64(8));
// test if reset() and close() write only one final block
QVERIFY(writer.reset());
QVERIFY(writer.reset());
writer.close();
QCOMPARE(buffer.buffer().size(), 8 + (32 + 4 + 4) * 2);
}
void TestHashedBlockStream::testWriteFailure()
{
FailDevice failDevice(1500);
QVERIFY(failDevice.open(QIODevice::WriteOnly));
QByteArray input(2000, 'Z');
HashedBlockStream writer(&failDevice, 500);
QVERIFY(writer.open(QIODevice::WriteOnly));
QCOMPARE(writer.write(input.left(900)), qint64(900));
writer.write(input.left(900));
QVERIFY(!writer.reset());
QCOMPARE(writer.errorString(), QString("FAILDEVICE"));
}

View File

@@ -27,6 +27,8 @@ class TestHashedBlockStream : public QObject
private Q_SLOTS:
void initTestCase();
void testWriteRead();
void testReset();
void testWriteFailure();
};
#endif // KEEPASSX_TESTHASHEDBLOCKSTREAM_H

View File

@@ -21,12 +21,14 @@
#include <QTest>
#include "tests.h"
#include "FailDevice.h"
#include "core/Database.h"
#include "core/Group.h"
#include "core/Metadata.h"
#include "crypto/Crypto.h"
#include "format/KeePass2Reader.h"
#include "format/KeePass2Writer.h"
#include "format/KeePass2XmlWriter.h"
#include "keys/PasswordKey.h"
QTEST_GUILESS_MAIN(TestKeePass2Writer)
@@ -101,6 +103,30 @@ void TestKeePass2Writer::testNonAsciiPasswords()
QCOMPARE(m_dbTest->rootGroup()->entries()[0]->password(), m_dbOrg->rootGroup()->entries()[0]->password());
}
void TestKeePass2Writer::testDeviceFailure()
{
CompositeKey key;
key.addKey(PasswordKey("test"));
Database* db = new Database();
db->setKey(key);
// Disable compression so we write a predictable number of bytes.
db->setCompressionAlgo(Database::CompressionNone);
Entry* entry = new Entry();
entry->setParent(db->rootGroup());
QByteArray attachment(4096, 'Z');
entry->attachments()->set("test", attachment);
FailDevice failDevice(512);
QVERIFY(failDevice.open(QIODevice::WriteOnly));
KeePass2Writer writer;
writer.writeDatabase(&failDevice, db);
QVERIFY(writer.hasError());
QCOMPARE(writer.errorString(), QString("FAILDEVICE"));
delete db;
}
void TestKeePass2Writer::cleanupTestCase()
{
delete m_dbOrg;

View File

@@ -32,6 +32,7 @@ private Q_SLOTS:
void testProtectedAttributes();
void testAttachments();
void testNonAsciiPasswords();
void testDeviceFailure();
void cleanupTestCase();
private:

View File

@@ -207,3 +207,22 @@ void TestSymmetricCipher::testPadding()
QByteArray decrypted = streamDec.readAll();
QCOMPARE(decrypted, plainText);
}
void TestSymmetricCipher::testStreamReset()
{
QByteArray key = QByteArray::fromHex("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4");
QByteArray iv = QByteArray::fromHex("000102030405060708090a0b0c0d0e0f");
QBuffer buffer;
QVERIFY(buffer.open(QIODevice::WriteOnly));
SymmetricCipherStream writer(&buffer, SymmetricCipher::Aes256, SymmetricCipher::Cbc,
SymmetricCipher::Encrypt);
QVERIFY(writer.init(key, iv));
QVERIFY(writer.open(QIODevice::WriteOnly));
QCOMPARE(writer.write(QByteArray(4, 'Z')), qint64(4));
// test if reset() and close() write only one block
QVERIFY(writer.reset());
QVERIFY(writer.reset());
writer.close();
QCOMPARE(buffer.buffer().size(), 16);
}

View File

@@ -30,6 +30,7 @@ private Q_SLOTS:
void testAes256CbcDecryption();
void testSalsa20();
void testPadding();
void testStreamReset();
};
#endif // KEEPASSX_TESTSYMMETRICCIPHER_H

View File

@@ -57,11 +57,21 @@ void TestGui::initTestCase()
m_tabWidget = m_mainWindow->findChild<DatabaseTabWidget*>("tabWidget");
m_mainWindow->show();
Tools::wait(50);
QByteArray tmpData;
QFile sourceDbFile(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx"));
QVERIFY(sourceDbFile.open(QIODevice::ReadOnly));
QVERIFY(Tools::readAllFromDevice(&sourceDbFile, tmpData));
QVERIFY(m_orgDbFile.open());
m_orgDbFileName = QFileInfo(m_orgDbFile.fileName()).fileName();
QCOMPARE(m_orgDbFile.write(tmpData), static_cast<qint64>((tmpData.size())));
m_orgDbFile.close();
}
void TestGui::testOpenDatabase()
{
fileDialog()->setNextFileName(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx"));
fileDialog()->setNextFileName(m_orgDbFile.fileName());
triggerAction("actionDatabaseOpen");
QWidget* databaseOpenWidget = m_mainWindow->findChild<QWidget*>("databaseOpenWidget");
@@ -75,7 +85,7 @@ void TestGui::testOpenDatabase()
void TestGui::testTabs()
{
QCOMPARE(m_tabWidget->count(), 1);
QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("NewDatabase.kdbx"));
QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), m_orgDbFileName);
m_dbWidget = m_tabWidget->currentDatabaseWidget();
m_db = m_dbWidget->database();
@@ -103,7 +113,7 @@ void TestGui::testEditEntry()
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
// make sure the database isn't marked as modified
// wait for modified timer
QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("NewDatabase.kdbx"));
QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), m_orgDbFileName);
}
void TestGui::testAddEntry()
@@ -134,7 +144,7 @@ void TestGui::testAddEntry()
QCOMPARE(entry->title(), QString("test"));
QCOMPARE(entry->historyItems().size(), 0);
// wait for modified timer
QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("NewDatabase.kdbx*"));
QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("%1*").arg(m_orgDbFileName));
QAction* entryEditAction = m_mainWindow->findChild<QAction*>("actionEntryEdit");
QVERIFY(entryEditAction->isEnabled());
@@ -352,7 +362,7 @@ void TestGui::testDragAndDropGroup()
void TestGui::testSaveAs()
{
QFileInfo fileInfo(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx"));
QFileInfo fileInfo(m_orgDbFile.fileName());
QDateTime lastModified = fileInfo.lastModified();
m_db->metadata()->setName("SaveAs");

View File

@@ -20,6 +20,7 @@
#include <QAbstractItemModel>
#include <QObject>
#include <QTemporaryFile>
class Database;
class DatabaseTabWidget;
@@ -60,6 +61,8 @@ private:
MainWindow* m_mainWindow;
DatabaseTabWidget* m_tabWidget;
DatabaseWidget* m_dbWidget;
QTemporaryFile m_orgDbFile;
QString m_orgDbFileName;
QString m_tmpFileName;
Database* m_db;
};