Compare commits

...

76 Commits

Author SHA1 Message Date
Felix Geyer
00f068b93e Fix typo in changelog. 2016-01-31 20:00:44 +01:00
Felix Geyer
654353e26b Update translations. 2016-01-31 19:03:25 +01:00
Felix Geyer
d670ef2638 Prepare for 2.0.1 release. 2016-01-31 18:49:35 +01:00
Felix Geyer
aff935b3c7 Properly handle a missing key filename. 2016-01-31 17:08:50 +01:00
Felix Geyer
107c0673c7 Make sure we don't write negative icon ids into the database. 2016-01-31 17:06:51 +01:00
Felix Geyer
c14d04b3e8 Fix crash when icon id is larger than INT_MAX.
In these cases icon id was interpreted as a negative number.
The QList access with a negative index resulted in a crash.
2016-01-31 16:44:34 +01:00
Felix Geyer
7a017041bf Allow opening databases that have no password and keyfile.
Closes #391
2016-01-31 16:17:24 +01:00
Felix Geyer
eb56bd8973 Add repair functionality to strip invalid XML chars.
Refs #392
2016-01-28 23:07:04 +01:00
Felix Geyer
93585aded7 Always display scaled custom icons.
Closes #322
2016-01-26 22:44:38 +01:00
Felix Geyer
38245aa2a9 Add iconScaledPixmap() convenience functions. 2016-01-24 20:12:33 +01:00
Felix Geyer
1f33e6f044 Add Metadata::customIconScaledPixmap(). 2016-01-24 20:12:33 +01:00
Felix Geyer
4752adf9d3 Move pixmap caching to Metadata. 2016-01-24 20:12:21 +01:00
Felix Geyer
2d741afe3e Strip invalid XML chars when writing databases.
These characters are unprintable or just plain invalid.
QXmlStreamReader throws and error when reading XML documents with such chars.

Closes #392
2016-01-24 17:20:16 +01:00
Florian Geyer
5e6b17aba4 Disable password generator button when showing entry in history mode.
Closes #422
2016-01-22 22:55:28 +01:00
Florian Geyer
c51098e2cf Flush temporary file before opening attachment.
Closes #390
2015-12-16 21:38:20 +01:00
Felix Geyer
24275d8dc4 Bump version. 2015-12-06 22:19:05 +01:00
Felix Geyer
94d82948f6 Update translations. 2015-12-06 21:06:06 +01:00
Felix Geyer
54fb1abb96 Update changelog. 2015-12-06 21:03:00 +01:00
Felix Geyer
a3b936fcd0 Coding style fixes. 2015-12-06 20:27:09 +01:00
Felix Geyer
efc4cd5969 Merge remote-tracking branch 'github/pr/74' 2015-12-06 19:21:38 +01:00
Felix Geyer
17ab438c5a Make sure Windows doesn't load DLLs from the current working directory. 2015-12-06 14:32:06 +01:00
Felix Geyer
77b4bfb14e Cleanup string argument numbers. 2015-12-06 14:31:23 +01:00
Felix Geyer
7839280cb3 Check if the tray icon is visible before minimizing to it. 2015-11-01 23:32:37 +01:00
Felix Geyer
9e1ea264e2 Use availableGeometry() to calculate the dialog position.
availableGeometry() excludes ares where windows can't be placed (e.g. panels).
2015-11-01 23:26:40 +01:00
Felix Geyer
b02ec98ec6 Show AutoTypeSelectDialog on the active desktop.
This wasn't always the case on X11 with virtual desktops.

Closes #359
2015-11-01 23:23:01 +01:00
Felix Geyer
2fa531745f Check XML key file for valid base64 before using it.
QByteArray::fromBase64() doesn't validate the input.

Closes #366
2015-11-01 18:32:15 +01:00
Felix Geyer
820941fd40 Auto-Type: Only require a substring match for regex.
This matches the behavior of KeePass.

Refs #357
2015-10-10 17:36:08 +02:00
Felix Geyer
862941abf6 TestAutoType: Restore AutoTypeEntryTitleMatch before every test. 2015-10-10 17:23:57 +02:00
Felix Geyer
e98c30f633 Disable systray on OS X.
It's not useful on that platform.

Refs #326
2015-10-10 17:10:29 +02:00
Felix Geyer
316a7e6fb7 Expose version of used libraries in the About dialog. 2015-10-10 17:10:29 +02:00
Felix Geyer
58ed99d562 OS X: Restore main window when clicking on the docker icon.
Apparently this worked previously. Maybe a regression in Qt?

Refs #326
2015-10-10 17:10:27 +02:00
Felix Geyer
840642394f Cope with focusWidget/activeWindow returning windows that are minimized. 2015-10-10 12:07:28 +02:00
Florian Geyer
ebeedba072 Reset visibility state of password field on unlocking.
Closes #354
2015-09-28 22:30:29 +02:00
Felix Geyer
568dfde074 Fix minimum size of AboutDialog.
Also make the dialog non-resizeable.

Closes #352
2015-09-28 22:08:33 +02:00
Felix Geyer
b8c1829857 Improve tray icon behavior on OS X.
Previously the main window had issues on restore:
- was sometimes hidden again.
- window was unresponsive, all actions disabled.
2015-09-27 23:16:18 +02:00
Felix Geyer
4f2d56a55f Fix another small memory leak. 2015-09-26 12:41:53 +02:00
Felix Geyer
6b49f8f26b Free input device list.
Fixes a memory leak.
2015-09-26 12:41:53 +02:00
Felix Geyer
fc8cb7cd14 Check if XListInputDevices returns an error.
Refs #351
2015-09-26 12:41:52 +02:00
Felix Geyer
727094abc6 Unload auto-type plugins if they run in an unsupported environment.
Refs #351
2015-09-26 12:41:47 +02:00
Felix Geyer
bcb54bc38a Avoid dereferencing QLists. 2015-09-25 21:34:56 +02:00
Felix Geyer
14aac09318 Avoid implicit casts from bool to int. 2015-09-25 21:34:56 +02:00
Felix Geyer
9d42db9849 Mark more methods as override. 2015-09-25 21:34:56 +02:00
Felix Geyer
ee81c7c00e Remove WITH_LTO option.
It's broken and probably not worth the potential again.

Refs #353
2015-09-25 21:34:51 +02:00
Felix Geyer
2edf414aa4 Fix compiler warning on OS X and Windows. 2015-09-24 18:45:23 +02:00
Felix Geyer
54f44f5267 Show a better message when trying to open an old database format.
Refs #338
2015-09-23 23:16:49 +02:00
Felix Geyer
6ab54bc95a Check if libXi is installed and explicitly link against it. 2015-09-23 22:26:49 +02:00
Felix Geyer
673dff2268 Auto-Type: Raise target window after showing the select dialog.
kwin >= 5.4 (since commit cfa1d61) prefers to focus the main window
instead of following the focus chain.

We ask the window manager nicely to focus the window we want to
type into. kwin seems to follow that (in the default configuration).
2015-09-21 23:12:10 +02:00
Felix Geyer
bb38be40f6 Enable Ctrl+M shortcut to minimize window on all platforms.
Closes #329
2015-09-13 22:33:07 +02:00
Felix Geyer
f236c32063 Clear clipboard when locking databases.
Closes #342
2015-09-13 12:38:19 +02:00
Felix Geyer
236edae60b travis-ci: Backport OS X improvements from master. 2015-09-12 23:35:59 +02:00
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
Akinori MUSHA
b773dbe645 Test if hitting the Down key moves the focus to the entry view. 2015-08-05 19:02:17 +09:00
Akinori MUSHA
5c7c7f54fa Improve UI of the search edit.
- The copy action (Control+C) when no text is selected copies the
  password of the current entry.  This should be reasonable when
  Control+B copies the username.

- Down at EOL moves the focus to the entry view.  Enter and Tab should
  do that, but it would be handy for user to be able to get to the third
  entry by hitting Down three times.
2015-08-05 19:02:17 +09: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
116 changed files with 12415 additions and 1144 deletions

View File

@@ -9,11 +9,13 @@ install:
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq update; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake libqt4-dev libgcrypt11-dev zlib1g-dev libxtst-dev; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew install cmake qt libgcrypt; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq cmake || brew install cmake; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq qt || brew install qt; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq libgcrypt || brew install libgcrypt; fi
before_script: mkdir build && pushd build
script:
- cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_GUI_TESTS=ON ..
- make
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then make test ARGS+="-E testgui --output-on-failure"; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then xvfb-run -a --server-args="-screen 0 800x600x24" make test ARGS+="-R testgui --output-on-failure"; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then make test; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then make test ARGS+="--output-on-failure"; fi

View File

@@ -1,3 +1,34 @@
2.0.1 (2016-01-31)
=========================
- Flush temporary file before opening attachment. [#390]
- Disable password generator when showing entry in history mode. [#422]
- Strip invalid XML chars when writing databases. [#392]
- Add repair function to fix databases with invalid XML chars. [#392]
- Display custom icons scaled. [#322]
- Allow opening databases that have no password and keyfile. [#391]
- Fix crash when importing .kdb files with invalid icon ids. [#425]
- Update translations.
2.0 (2015-12-06)
=========================
- Improve UI of the search edit.
- Clear clipboard when locking databases. [#342]
- Enable Ctrl+M shortcut to minimize the window on all platforms. [#329]
- Show a better message when trying to open an old database format. [#338]
- Fix global auto-type behavior with some window managers.
- Show global auto-type window on the active desktop. [#359]
- Disable systray on OS X. [#326]
- Restore main window when clicking on the OS X docker icon. [#326]
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

@@ -31,11 +31,10 @@ include(CheckCXXSourceCompiles)
option(WITH_TESTS "Enable building of unit tests" ON)
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.1")
set(KEEPASSX_VERSION_NUM "2.0.1")
if("${CMAKE_C_COMPILER}" MATCHES "clang$" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_COMPILER_IS_CLANG 1)
@@ -101,23 +100,12 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro")
endif()
if(WITH_LTO)
if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_COMPILER_IS_GNUCXX)
check_cxx_compiler_flag("-flto -fuse-linker-plugin" LTO_AVAILABLE)
if(LTO_AVAILABLE)
add_gcc_compiler_flags("-flto -fuse-linker-plugin")
else()
message(FATAL_ERROR "This version of gcc doesn't support LTO")
endif(LTO_AVAILABLE)
else()
message(FATAL_ERROR "LTO is only supported with gcc")
endif()
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,22 +3,26 @@
<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>
<translation>KeePassX je šířeno za podmínek licence GNU General Public License (GPL) verze 2 a (případně) 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revize</translation>
</message>
</context>
<context>
<name>AutoType</name>
<message>
<source>Auto-Type - KeePassX</source>
<translation>Samočinné vyplňování KeePassX</translation>
<translation>Automatické vyplňování KeePassX</translation>
</message>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
<translation>Nelze nalézt položku, která by se shodovala s titulkem okna:</translation>
<translation>Nedaří se nalézt položku, která by se shodovala s titulkem okna:</translation>
</message>
</context>
<context>
@@ -40,11 +44,11 @@
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassX</source>
<translation>Samočinné vyplňování KeePassX</translation>
<translation>Automatické vyplňování KeePassX</translation>
</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 automaticky vyplňovat:</translation>
</message>
</context>
<context>
@@ -91,7 +95,7 @@
</message>
<message>
<source>Unable to create Key File : </source>
<translation>Nelze vytvořit soubor s klíčem :</translation>
<translation>Nedaří se vytvořit soubor s klíčem :</translation>
</message>
<message>
<source>Select a key file</source>
@@ -103,11 +107,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 do obou kolonek stejně.</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>
@@ -134,11 +148,11 @@
</message>
<message>
<source>Unable to open the database.</source>
<translation>Databázi nebylo možné otevřít.</translation>
<translation>Databázi se nepodařilo otevřít.</translation>
</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 +179,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 +187,7 @@
</message>
<message>
<source>Use recycle bin:</source>
<translation>Použít Koš:</translation>
<translation>Namísto mazání přesouvat do Koše:</translation>
</message>
<message>
<source> MiB</source>
@@ -185,11 +199,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>
@@ -200,7 +214,7 @@
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Databáze aplikace KeePass 2</translation>
<translation>Databáze aplikace KeePass verze 2</translation>
</message>
<message>
<source>All files</source>
@@ -220,11 +234,11 @@
</message>
<message>
<source>Open KeePass 1 database</source>
<translation>Otevřít databázi aplikace KeePass 1</translation>
<translation>Otevřít databázi aplikace KeePass verze 1</translation>
</message>
<message>
<source>KeePass 1 database</source>
<translation>Databáze aplikace KeePass 1</translation>
<translation>Databáze aplikace KeePass verze 1</translation>
</message>
<message>
<source>All files (*)</source>
@@ -234,12 +248,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 +278,64 @@ 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 neuzamykat.</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, provedené změny budou ztraceny.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>%1 je právě upravováno.
Přesto zavřít a zahodit změny?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Exportovat databázi do CSV souboru</translation>
</message>
<message>
<source>CSV file</source>
<translation>CSV soubor</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Zápis do CSV souboru se nezdařil.</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>Databáze, kterou se pokoušíte uložit, je uzamčena jinou instancí KeePassX.
Přesto uložit?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -283,7 +349,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 +357,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 +365,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 +373,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>Nepodařilo se spočítat hlavní klíč</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -330,7 +404,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Auto-Type</source>
<translation>Samočinné vyplňování</translation>
<translation>Automatické vyplňování</translation>
</message>
<message>
<source>Properties</source>
@@ -370,7 +444,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Unable to open file</source>
<translation>Soubor nelze otevřít</translation>
<translation>Soubor se nedaří otevřít</translation>
</message>
<message>
<source>Save attachment</source>
@@ -379,7 +453,7 @@ Uložit změny?</translation>
<message>
<source>Unable to save the attachment:
</source>
<translation>Přílohu nelze uložit:
<translation>Přílohu se nedaří uložit:
</translation>
</message>
<message>
@@ -388,11 +462,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,20 +499,24 @@ 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 automatické vyplňování této položky</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the group</source>
<translation>Převzít výchozí posloupnost samočinného vyplňování ze skupiny</translation>
<translation>Převzít výchozí posloupnost automatického vyplňování od skupiny</translation>
</message>
<message>
<source>Use custom Auto-Type sequence:</source>
<translation>Použít vlastní posloupnost samočinného vyplňování:</translation>
<translation>Použít vlastní posloupnost automatického vyplňování:</translation>
</message>
<message>
<source>+</source>
@@ -500,7 +578,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Gen.</source>
<translation>Obec.</translation>
<translation>Tvoř</translation>
</message>
<message>
<source>URL:</source>
@@ -551,7 +629,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Inherit from parent group (%1)</source>
<translation>Převzít z nadřazené skupiny (%1)</translation>
<translation>Převzít od nadřazené skupiny (%1)</translation>
</message>
</context>
<context>
@@ -574,7 +652,15 @@ Uložit změny?</translation>
</message>
<message>
<source>Auto-type</source>
<translation>Samočinné vyplňování</translation>
<translation>Automatické vyplňování</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>Použít výchozí posloupnost automatického vyplňování z nadřazené skupiny</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Nastavit výchozí posloupnost automatického vyplňování</translation>
</message>
</context>
<context>
@@ -585,15 +671,15 @@ Uložit změny?</translation>
</message>
<message>
<source>Use custom icon</source>
<translation>Použít vlastní ikonu</translation>
<translation>Použít svou vlastní ikonu</translation>
</message>
<message>
<source>Add custom icon</source>
<translation>Přidat vlastní ikonu</translation>
<translation>Přidat svou vlastní ikonu</translation>
</message>
<message>
<source>Delete custom icon</source>
<translation>Smazat vlastní ikonu</translation>
<translation>Smazat svou vlastní ikonu</translation>
</message>
<message>
<source>Images</source>
@@ -613,26 +699,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. Používá ji %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 minulé úpravy:</translation>
</message>
<message>
<source>Accessed:</source>
<translation>Čas posledního přístupu:</translation>
<translation>Okamžik minulého přístupu:</translation>
</message>
<message>
<source>Uuid:</source>
<translation>Uuid identifikátor:</translation>
<translation>Univerzálně jedinečný identifikátor:</translation>
</message>
</context>
<context>
@@ -646,7 +732,7 @@ Uložit změny?</translation>
<name>EntryHistoryModel</name>
<message>
<source>Last modified</source>
<translation>Čas poslední změny</translation>
<translation>Okamžik minulé změny</translation>
</message>
<message>
<source>Title</source>
@@ -691,7 +777,7 @@ Uložit změny?</translation>
<name>KeePass1OpenWidget</name>
<message>
<source>Import KeePass1 database</source>
<translation>Importovat databázi aplikace KeePass 1</translation>
<translation>Importovat databázi aplikace KeePass verze 1</translation>
</message>
<message>
<source>Error</source>
@@ -724,6 +810,10 @@ Uložit změny?</translation>
<source>Root</source>
<translation>Kořen</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Nedaří se spočítat hlavní klíč</translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -739,12 +829,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>Nedaří se 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 +871,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>
@@ -847,7 +937,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Import KeePass 1 database</source>
<translation>Importovat databázi aplikace KeePass 1</translation>
<translation>Importovat databázi aplikace KeePass verze 1</translation>
</message>
<message>
<source>Clone entry</source>
@@ -857,18 +947,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>
@@ -879,7 +961,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Perform Auto-Type</source>
<translation>Provést samočinné vyplnění</translation>
<translation>Provést automatické vyplnění</translation>
</message>
<message>
<source>Open URL</source>
@@ -913,6 +995,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>Zkopírovat uživatelské jméno</translation>
</message>
<message>
<source>Copy password</source>
<translation>Zkopírovat heslo</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Exportovat do CSV souboru</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -942,15 +1040,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>
@@ -969,11 +1067,11 @@ Uložit změny?</translation>
</message>
<message>
<source>Unknown option &apos;%1&apos;.</source>
<translation>Neznámá volba %1.</translation>
<translation>Neznámá předvolba %1.</translation>
</message>
<message>
<source>Unknown options: %1.</source>
<translation>Neznámé volby: %1.</translation>
<translation>Neznámé předvolby: %1.</translation>
</message>
<message>
<source>Missing value after &apos;%1&apos;.</source>
@@ -985,7 +1083,7 @@ Uložit změny?</translation>
</message>
<message>
<source>[options]</source>
<translation>[volby]</translation>
<translation>[předvolby]</translation>
</message>
<message>
<source>Usage: %1</source>
@@ -993,7 +1091,7 @@ Uložit změny?</translation>
</message>
<message>
<source>Options:</source>
<translation>Volby:</translation>
<translation>Předvolby:</translation>
</message>
<message>
<source>Arguments:</source>
@@ -1004,7 +1102,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 +1110,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 +1121,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>Došlo k chybě při zápisu na zařízení, na kterém se nachází:</translation>
</message>
<message>
<source>Error opening underlying device: </source>
<translation>Chyba při otevírání zařízení:</translation>
<translation>Došlo k chybě při otevírání zařízení, na kterém se nachází:</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
<translation>Chyba při čtení dat ze zařízení:</translation>
<translation>Došlo k chybě při čtení dat ze zařízení, na kterém se nachází:</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
@@ -1042,7 +1140,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,39 +1185,35 @@ 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á samočinně uložit</translation>
<translation>ed ukončem aplikace automaticky uložit případné změny</translation>
</message>
<message>
<source>Automatically save after every change</source>
<translation>Po každé změně okamžitě samočinně uložit</translation>
<translation>Po každé změně hned automaticky uložit</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í údaje do schránky automaticky minimalizovat okno KeePassX (do popředí se tak dostane okno, do kterého se zkopírovaný údaj bude vkládat)</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
<translation>Při vytváření položky použít ikonu skupiny</translation>
<translation>Pro vytvářenou položku použít ikonu skupiny, do které spadá</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é automatické vyplňování</translation>
</message>
<message>
<source>Use entry title to match windows for global auto-type</source>
<translation>Použít titulek položky pro porovnání s okny pro všeobecné samočinné vyplňování</translation>
<translation>Všeobecné automatické vyplňování provádět na základě shody titulku položky s titulkem okna.</translation>
</message>
<message>
<source>Language</source>
@@ -1127,22 +1221,26 @@ 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 systémového panelu</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 systémového panelu</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Pamatovat si nedávno otevřené soubory s klíči</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
<message>
<source>Clear clipboard after</source>
<translation>Vyčistit schránku po uplynutí</translation>
<translation>Vymazat obsah schránky po uplynutí</translation>
</message>
<message>
<source> sec</source>
<translation>sek</translation>
<translation>sek.</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
@@ -1150,11 +1248,11 @@ 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>
<translation>Před provedením samočinného vyplnění se vždy dotázat</translation>
<translation>Před provedením automatického vyplnění se vždy dotázat</translation>
</message>
</context>
<context>
@@ -1163,14 +1261,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,20 +1273,16 @@ 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>
<translation>umístění souboru s vlastními nastaveními</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>heslo databáze (NEBEZPEČNÉ!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>soubor s klíčem k databázi</translation>

View File

@@ -9,12 +9,20 @@
<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 distribueres under betingelserne i GNU General Public License (GPL) version 2 eller (efter eget valg) version 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revision</translation>
</message>
<message>
<source>Using:</source>
<translation>Bruger:</translation>
</message>
</context>
<context>
<name>AutoType</name>
<message>
<source>Auto-Type - KeePassX</source>
<translation type="unfinished"/>
<translation>Auto-indsæt - KeePassX</translation>
</message>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
@@ -40,26 +48,26 @@
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassX</source>
<translation type="unfinished"/>
<translation>Auto-indsæt - KeePassX</translation>
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation type="unfinished"/>
<translation>Vælg post til Auto-Indsæt:</translation>
</message>
</context>
<context>
<name>ChangeMasterKeyWidget</name>
<message>
<source>Password</source>
<translation>Adgangskode</translation>
<translation>Kodeord</translation>
</message>
<message>
<source>Enter password:</source>
<translation>Indtast adgangskode</translation>
<translation>Indtast kodeord</translation>
</message>
<message>
<source>Repeat password:</source>
<translation>Gentag adgangskode</translation>
<translation>Gentag kodeord</translation>
</message>
<message>
<source>Key file</source>
@@ -103,18 +111,28 @@
</message>
<message>
<source>Do you really want to use an empty string as password?</source>
<translation>Vil du virkelig bruge en tom streng som adgangskode?</translation>
<translation>Vil du virkelig bruge en tom streng som kodeord?</translation>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Andre adgangskoder leveret.</translation>
<translation>Andre kodeord 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>
@@ -122,7 +140,7 @@
</message>
<message>
<source>Password:</source>
<translation>Adgangskode:</translation>
<translation>Kodeord:</translation>
</message>
<message>
<source>Browse</source>
@@ -165,7 +183,7 @@
</message>
<message>
<source>Transform rounds:</source>
<translation type="unfinished"/>
<translation>Transformationsrunder:</translation>
</message>
<message>
<source>Default username:</source>
@@ -185,18 +203,18 @@
</message>
<message>
<source>Max. history items:</source>
<translation type="unfinished"/>
<translation>Maks. posthistorik:</translation>
</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 +252,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 +259,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 +282,66 @@ 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 på 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>&quot;%1&quot; er i redigeringstilstand.
Kassér ændringer og luk alligevel?</translation>
</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>
<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>Databasen som du prøver at gemme er låst af en anden instans af KeePassX.
Vil du alligevel gemme?</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 +349,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 +357,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 +365,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 +373,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>
@@ -328,7 +404,7 @@ Save changes?</source>
</message>
<message>
<source>Auto-Type</source>
<translation type="unfinished"/>
<translation>Auto-Indsæt</translation>
</message>
<message>
<source>Properties</source>
@@ -340,7 +416,7 @@ Save changes?</source>
</message>
<message>
<source>Entry history</source>
<translation type="unfinished"/>
<translation>Indtastningshistorik</translation>
</message>
<message>
<source>Add entry</source>
@@ -356,7 +432,7 @@ Save changes?</source>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Andre adgangskoder leveret.</translation>
<translation>Andre kodeord leveret.</translation>
</message>
<message>
<source>New attribute</source>
@@ -377,7 +453,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,20 +498,24 @@ Save changes?</source>
<source>Save</source>
<translation>Gem</translation>
</message>
<message>
<source>Open</source>
<translation>Åben</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
<translation type="unfinished"/>
<translation>Aktivér Auto-Indsæt for denne post</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the group</source>
<translation type="unfinished"/>
<translation>Nedarv standard Auto-Indsæt sekvens fra gruppe</translation>
</message>
<message>
<source>Use custom Auto-Type sequence:</source>
<translation type="unfinished"/>
<translation>Brug brugerdefineret Auto-indsæt sekvens:</translation>
</message>
<message>
<source>+</source>
@@ -451,11 +531,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>
@@ -489,7 +569,7 @@ Save changes?</source>
</message>
<message>
<source>Password:</source>
<translation>Adgangskode:</translation>
<translation>Kodeord:</translation>
</message>
<message>
<source>Repeat:</source>
@@ -497,7 +577,7 @@ Save changes?</source>
</message>
<message>
<source>Gen.</source>
<translation type="unfinished"/>
<translation>Generer</translation>
</message>
<message>
<source>URL:</source>
@@ -509,7 +589,7 @@ Save changes?</source>
</message>
<message>
<source>Presets</source>
<translation type="unfinished"/>
<translation>Predefinerede</translation>
</message>
<message>
<source>Notes:</source>
@@ -571,7 +651,15 @@ Save changes?</source>
</message>
<message>
<source>Auto-type</source>
<translation type="unfinished"/>
<translation>Auto-indsæt</translation>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>Brug standard Auto-Indsæt sekvens fra forældregruppe</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Definér standard auto-indsæt sekvens</translation>
</message>
</context>
<context>
@@ -610,7 +698,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,14 +807,18 @@ 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>
<name>KeePass2Reader</name>
<message>
<source>Not a KeePass database.</source>
<translation>Det er ikke en KeePass database.</translation>
<translation>Dette er ikke en KeePass database.</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
@@ -736,6 +828,20 @@ 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>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Den valgte fil er en gammel KeePass 1 databasefil (.kdb).
Du kan importere den ved at klikke Database &gt; &apos;Importér KeePass 1 database&apos;.
Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den importerede database med den gamle KeePassX 0.4 version.</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -774,10 +880,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 +938,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,21 +956,13 @@ 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>
<translation>Kopiér kodeord til udklipsholder</translation>
</message>
<message>
<source>Settings</source>
@@ -876,7 +970,7 @@ Save changes?</source>
</message>
<message>
<source>Perform Auto-Type</source>
<translation type="unfinished"/>
<translation>Udfør Auto-indsæt</translation>
</message>
<message>
<source>Open URL</source>
@@ -910,12 +1004,28 @@ 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 brugernavn</translation>
</message>
<message>
<source>Copy password</source>
<translation>Kopiér kodeord</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Eksportér til CSV-fil</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
<message>
<source>Password:</source>
<translation>Adgangskode:</translation>
<translation>Kodeord:</translation>
</message>
<message>
<source>Length:</source>
@@ -923,7 +1033,7 @@ Save changes?</source>
</message>
<message>
<source>Character Types</source>
<translation type="unfinished"/>
<translation>Tegntyper</translation>
</message>
<message>
<source>Upper Case Letters</source>
@@ -931,7 +1041,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 +1049,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 dit kodeord indeholder tegn fra alle grupper</translation>
</message>
<message>
<source>Accept</source>
@@ -1020,11 +1130,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 +1142,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 +1164,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 +1172,7 @@ Save changes?</source>
</message>
<message>
<source>Root group</source>
<translation type="unfinished"/>
<translation>Rodgruppe</translation>
</message>
</context>
<context>
@@ -1073,7 +1183,7 @@ Save changes?</source>
</message>
<message>
<source>General</source>
<translation type="unfinished"/>
<translation>Generelt</translation>
</message>
<message>
<source>Security</source>
@@ -1084,15 +1194,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,15 +1214,15 @@ 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>
<translation type="unfinished"/>
<translation>Global Auto-Indsæt genvej</translation>
</message>
<message>
<source>Use entry title to match windows for global auto-type</source>
<translation type="unfinished"/>
<translation>Brug titel post til at matche global aito-indsæt</translation>
</message>
<message>
<source>Language</source>
@@ -1130,6 +1236,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,15 +1253,15 @@ 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 kodeord i klartekst som standard</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
<translation type="unfinished"/>
<translation>Spørg altid før auto-indsæt</translation>
</message>
</context>
<context>
@@ -1160,14 +1270,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>
@@ -1180,7 +1282,7 @@ Save changes?</source>
<name>main</name>
<message>
<source>KeePassX - cross-platform password manager</source>
<translation type="unfinished"/>
<translation>KeePassX - cross-platform password manager</translation>
</message>
<message>
<source>filename of the password database to open (*.kdbx)</source>
@@ -1188,11 +1290,7 @@ Save changes?</source>
</message>
<message>
<source>path to a custom config file</source>
<translation type="unfinished"/>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>adgangskode til databasen (FAARLIGT!)</translation>
<translation>sti til brugerdefineret indstillingsfil</translation>
</message>
<message>
<source>key file of the database</source>

View File

@@ -7,7 +7,11 @@
</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>
<message>
<source>Revision</source>
<translation>Überarbeitung</translation>
</message>
</context>
<context>
@@ -109,6 +113,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 +247,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 +277,59 @@ 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>
<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>Die Datenbank, die gespeichert werden soll, ist von einer anderen Instanz von KeePassX blockiert.
Soll sie dennoch gespeichert werden? </translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -313,6 +373,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 +492,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 +647,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 +803,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 +822,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 +864,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 +940,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 +988,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 +1184,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 +1220,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>
@@ -1149,7 +1241,7 @@ Save changes?</source>
</message>
<message>
<source>Show passwords in cleartext by default</source>
<translation>Passwort standartmäßig in Klartext anzeigen</translation>
<translation>Passwörter standardmäßig in Klartext anzeigen</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
@@ -1162,14 +1254,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>
@@ -1192,10 +1276,6 @@ Save changes?</source>
<source>path to a custom config file</source>
<translation>Pfad zu einer benutzerdefinierten Konfigurationsdatei</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>Passwort der Datenbank (GEFÄHRLICH!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>Schlüsseldatei der Datenbank</translation>

File diff suppressed because it is too large Load Diff

View File

@@ -11,6 +11,14 @@
<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>
<message>
<source>Using:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -164,6 +172,42 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Success</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -316,6 +360,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>
@@ -824,6 +873,13 @@ Discard changes and close anyway?</source>
<source>Unable to calculate master key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; &apos;Import KeePass 1 database&apos;.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Main</name>
@@ -1002,6 +1058,30 @@ Discard changes and close anyway?</source>
<source>Export to CSV file</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Repair database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save repaired database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1274,10 +1354,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

@@ -9,6 +9,14 @@
<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 est distribué selon les conditions de la GNU General Public License (GPL) version 2 ou (à votre choix) version 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Version</translation>
</message>
<message>
<source>Using:</source>
<translation>Utilise :</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -25,7 +33,7 @@
<name>AutoTypeAssociationsModel</name>
<message>
<source>Window</source>
<translation>Fenêtre </translation>
<translation>Fenêtre</translation>
</message>
<message>
<source>Sequence</source>
@@ -63,7 +71,7 @@
</message>
<message>
<source>Key file</source>
<translation>Fichier de clé</translation>
<translation>Fichier-clé</translation>
</message>
<message>
<source>Browse</source>
@@ -75,7 +83,7 @@
</message>
<message>
<source>Key files</source>
<translation>Fichiers de clé</translation>
<translation>Fichiers-clés</translation>
</message>
<message>
<source>All files</source>
@@ -83,7 +91,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 +99,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 +117,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 +156,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 +164,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>
@@ -177,7 +195,7 @@
</message>
<message>
<source> MiB</source>
<translation>MiB</translation>
<translation> MiB</translation>
</message>
<message>
<source>Benchmark</source>
@@ -208,7 +226,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>
@@ -216,7 +234,7 @@
</message>
<message>
<source>File not found!</source>
<translation>Fichier introuvable!</translation>
<translation>Fichier introuvable !</translation>
</message>
<message>
<source>Open KeePass 1 database</source>
@@ -232,13 +250,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>
@@ -256,7 +268,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Une erreur s&apos;est produite lors de l&apos;écriture de la base de données. </translation>
<translation>Une erreur s&apos;est produite lors de l&apos;écriture de la base de données.</translation>
</message>
<message>
<source>Save database as</source>
@@ -270,12 +282,66 @@ 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>Verrouiller 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 été 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 été 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>
<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>La base de données que vous essayez de sauvegarder a été verrouillée par une autre instance de KeePassX.
Voulez-vous quand même la sauvegarder ?</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 +377,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 +396,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Advanced</source>
<translation>Avancées</translation>
<translation>Avancé</translation>
</message>
<message>
<source>Icon</source>
@@ -330,11 +404,11 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Auto-Type</source>
<translation>Auto-Type</translation>
<translation>Remplissage automatique</translation>
</message>
<message>
<source>Properties</source>
<translation>Propriétés </translation>
<translation>Propriétés</translation>
</message>
<message>
<source>History</source>
@@ -379,7 +453,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 +470,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>
@@ -423,22 +497,26 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Save</source>
<translation>Enregistrer le fichier </translation>
<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 +528,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 +536,14 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Set custom sequence:</source>
<translation type="unfinished"/>
<translation>Définir une séquence personnalisée :</translation>
</message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
<message>
<source>Show</source>
<translation>Exposer</translation>
<translation>Afficher</translation>
</message>
<message>
<source>Restore</source>
@@ -484,19 +562,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>Nom 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 +582,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>URL:</source>
<translation>URL:</translation>
<translation>URL :</translation>
</message>
<message>
<source>Expires</source>
@@ -516,7 +594,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Notes:</source>
<translation>Notes:</translation>
<translation>Notes :</translation>
</message>
</context>
<context>
@@ -531,15 +609,15 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Properties</source>
<translation>Propriétés </translation>
<translation>Propriétés</translation>
</message>
<message>
<source>Add group</source>
<translation>Ajouter un groupe. </translation>
<translation>Ajouter un groupe</translation>
</message>
<message>
<source>Edit group</source>
<translation>Modifie le groupe</translation>
<translation>Modifier le groupe</translation>
</message>
<message>
<source>Enable</source>
@@ -566,7 +644,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Expires</source>
<translation>Expires</translation>
<translation>Expiration</translation>
</message>
<message>
<source>Search</source>
@@ -574,7 +652,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 +691,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 +718,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Uuid:</source>
<translation>Uuid:</translation>
<translation>Uuid :</translation>
</message>
</context>
<context>
@@ -673,7 +759,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Username</source>
<translation>Non d&apos;utilisateur</translation>
<translation>Nom d&apos;utilisateur</translation>
</message>
<message>
<source>URL</source>
@@ -684,14 +770,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,18 +785,18 @@ 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>
<translation>Ce n&apos;est pas une base de donnée KeePass.</translation>
<translation>Ce n&apos;est pas une base de données KeePass.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
@@ -718,26 +804,44 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Version de base de donnée KeePass non supportée.</translation>
<translation>Version de base de données KeePass non supportée.</translation>
</message>
<message>
<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>
<message>
<source>Not a KeePass database.</source>
<translation>Ce n&apos;est pas une base de donnée KeePass.</translation>
<translation>Ce n&apos;est pas une base de données KeePass.</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Version de base de donnée KeePass non supportée.</translation>
<translation>Version de base de données KeePass non supportée.</translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation>Mauvaise clé ou fichier de base de donnée corrompu.</translation>
<translation>Mauvaise clé ou fichier de base de données corrompu.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Impossible de calculer la clé maître</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Le fichier sélectionné est une ancienne base de données pour KeePass 1 (.kdb).
Vous pouvez l&apos;importer en cliquant sur &quot;Base de données&quot; &gt; &quot;Importer une base de données KeePass 1&quot;.
Ceci est une migration à sens unique. Vous ne serez plus en mesure d&apos;ouvrir la base de données importée avec l&apos;ancienne version KeePassX version 0.4.</translation>
</message>
</context>
<context>
@@ -771,16 +875,12 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Copy attribute to clipboard</source>
<translation>Copier l&apos;attribut dans le presse-papiers</translation>
<translation>Copier l&apos;attribut dans le presse-papier</translation>
</message>
<message>
<source>Groups</source>
<translation>Groupes</translation>
</message>
<message>
<source>Extras</source>
<translation>Extras</translation>
</message>
<message>
<source>View</source>
<translation>Vue</translation>
@@ -795,19 +895,19 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Open database</source>
<translation>Ouvrir une base de donnée</translation>
<translation>Ouvrir une base de données</translation>
</message>
<message>
<source>Save database</source>
<translation>Enregistrer la base de donnée</translation>
<translation>Enregistrer la base de données</translation>
</message>
<message>
<source>Close database</source>
<translation>Fermer la base de donnée</translation>
<translation>Fermer la base de données</translation>
</message>
<message>
<source>New database</source>
<translation>Nouvelle base de donnée</translation>
<translation>Nouvelle base de données</translation>
</message>
<message>
<source>Add new entry</source>
@@ -835,7 +935,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Save database as</source>
<translation>Enregistrer la base de donnée sous</translation>
<translation>Enregistrer la base de données sous</translation>
</message>
<message>
<source>Change master key</source>
@@ -843,11 +943,11 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Database settings</source>
<translation>Paramètre de la base de donnée</translation>
<translation>Paramètres de la base de données</translation>
</message>
<message>
<source>Import KeePass 1 database</source>
<translation>Importer une base de donnée KeePass 1</translation>
<translation>Importer une base de données KeePass 1</translation>
</message>
<message>
<source>Clone entry</source>
@@ -857,21 +957,13 @@ 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>
<translation>Copier le nom d&apos;utilisateur dans le presse-papier</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Copier le mot de passe dans le presse-papiers</translation>
<translation>Copier le mot de passe dans le presse-papier</translation>
</message>
<message>
<source>Settings</source>
@@ -879,7 +971,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 +1005,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>
@@ -926,7 +1034,7 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>Character Types</source>
<translation>Types de caractère</translation>
<translation>Types de caractères</translation>
</message>
<message>
<source>Upper Case Letters</source>
@@ -961,7 +1069,7 @@ Enregistrer les modifications ?</translation>
<name>QCommandLineParser</name>
<message>
<source>Displays version information.</source>
<translation>Afficher les informations de version</translation>
<translation>Afficher les informations de version.</translation>
</message>
<message>
<source>Displays this help.</source>
@@ -1023,15 +1131,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>
@@ -1072,7 +1180,7 @@ Enregistrer les modifications ?</translation>
<name>SettingsWidget</name>
<message>
<source>Application Settings</source>
<translation>Paramètre de l&apos;application</translation>
<translation>Paramètres de l&apos;application</translation>
</message>
<message>
<source>General</source>
@@ -1091,23 +1199,19 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<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"/>
<translation>Ouvrir les bases de données précédentes au démarrage</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Sauvegarde automatiquement à la sortie</translation>
<translation>Sauvegarder automatiquement à la sortie</translation>
</message>
<message>
<source>Automatically save after every change</source>
<translation>Sauvegarde automatiquement après chaque modification</translation>
<translation>Sauvegarder automatiquement après chaque modification</translation>
</message>
<message>
<source>Minimize when copying to clipboard</source>
<translation type="unfinished"/>
<translation>Réduire lors de la copie dans le presse-papier</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
@@ -1115,11 +1219,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,26 +1231,30 @@ 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>
<name>SettingsWidgetSecurity</name>
<message>
<source>Clear clipboard after</source>
<translation>Vider le presse-papiers après</translation>
<translation>Vider le presse-papier après</translation>
</message>
<message>
<source> sec</source>
<translation>s</translation>
<translation> s</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
<translation>Verrouiller les bases de donnée après une inactivité de</translation>
<translation>Verrouiller les bases de données après une inactivité de</translation>
</message>
<message>
<source>Show passwords in cleartext by default</source>
@@ -1154,22 +1262,14 @@ 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>
<name>UnlockDatabaseWidget</name>
<message>
<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>
<translation>Déverrouiller la base de données</translation>
</message>
</context>
<context>
@@ -1187,19 +1287,15 @@ Enregistrer les modifications ?</translation>
</message>
<message>
<source>filename of the password database to open (*.kdbx)</source>
<translation>Nom de fichier de la base de donnée de mot de pass à ouvrir (*.kdbx)</translation>
<translation>Nom de fichier de la base de données de mot de passe à ouvrir (*.kdbx)</translation>
</message>
<message>
<source>path to a custom config file</source>
<translation>Chemin vers un fichier de configuration personnalisé</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>Mot de passe de la base de donnée (DANGEREUX !)</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

@@ -7,7 +7,15 @@
</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 type="unfinished"/>
<translation>KeePassX disebarluaskan dibawah ketentuan dari Lisensi Publik Umum GNU (GPL) versi 2 atau (sesuai pilihan Anda) versi 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revisi</translation>
</message>
<message>
<source>Using:</source>
<translation>Menggunakan:</translation>
</message>
</context>
<context>
@@ -18,7 +26,7 @@
</message>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
<translation>Tidak dapat menemukan entri yang cocok dengan judul jendela</translation>
<translation>Tidak bisa menemukan entri yang cocok dengan judul jendela:</translation>
</message>
</context>
<context>
@@ -51,15 +59,15 @@
<name>ChangeMasterKeyWidget</name>
<message>
<source>Password</source>
<translation>Kata Sandi</translation>
<translation>Sandi</translation>
</message>
<message>
<source>Enter password:</source>
<translation>Masukan kata sandi:</translation>
<translation>Masukkan sandi:</translation>
</message>
<message>
<source>Repeat password:</source>
<translation>Ulangi kata sandi:</translation>
<translation>Ulangi sandi:</translation>
</message>
<message>
<source>Key file</source>
@@ -75,7 +83,7 @@
</message>
<message>
<source>Key files</source>
<translation>Berkas Kunci</translation>
<translation>Berkas kunci</translation>
</message>
<message>
<source>All files</source>
@@ -91,11 +99,11 @@
</message>
<message>
<source>Unable to create Key File : </source>
<translation>Tidak dapat membuat Berkas Kunci :</translation>
<translation>Tidak bisa membuat Berkas Kunci :</translation>
</message>
<message>
<source>Select a key file</source>
<translation>Pilih sebuah berkas kunci</translation>
<translation>Pilih berkas kunci</translation>
</message>
<message>
<source>Question</source>
@@ -103,18 +111,28 @@
</message>
<message>
<source>Do you really want to use an empty string as password?</source>
<translation>Apakah anda ingin menggunakan string kosong sebagai kata sandi?</translation>
<translation>Apakah Anda benar-benar ingin menggunakan lema kosong sebagai sandi?</translation>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Kata sandi yang berbeda diberikan.</translation>
<translation>Sandi berbeda.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>Gagal menetapkan berkas kunci</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Gagal menetapkan %1 sebagai berkas Kunci:
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
<message>
<source>Enter master key</source>
<translation>Masukan kunci utama</translation>
<translation>Masukkan kunci utama</translation>
</message>
<message>
<source>Key File:</source>
@@ -122,7 +140,7 @@
</message>
<message>
<source>Password:</source>
<translation>Kata sandi:</translation>
<translation>Sandi:</translation>
</message>
<message>
<source>Browse</source>
@@ -134,11 +152,11 @@
</message>
<message>
<source>Unable to open the database.</source>
<translation>Tidak dapat membuka basis data</translation>
<translation>Tidak bisa membuka basis data.</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Tidak dapat membuka berkas kunci</translation>
<translation>Tidak bisa membuka berkas kunci</translation>
</message>
<message>
<source>All files</source>
@@ -173,7 +191,7 @@
</message>
<message>
<source>Use recycle bin:</source>
<translation type="unfinished"/>
<translation>Gunakan tong sampah:</translation>
</message>
<message>
<source> MiB</source>
@@ -196,7 +214,7 @@
<name>DatabaseTabWidget</name>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation>Root</translation>
</message>
<message>
<source>KeePass 2 Database</source>
@@ -234,12 +252,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>
@@ -256,7 +268,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Menulis basis data gagal.</translation>
<translation>Gagal membuat basis data.</translation>
</message>
<message>
<source>Save database as</source>
@@ -270,6 +282,60 @@ 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>Basis data yang Anda coba buka terkunci oleh KeePassX lain yang sedang berjalan.
Apakah Anda tetap ingin membukanya? Alternatif lain buka basis data baca-saja.</translation>
</message>
<message>
<source>Lock database</source>
<translation>Kunci basis data</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>Tidak bisa mengunci basis data karena Anda sedang menyuntingnya.
Harap tekan batal untuk menyelesaikan ubahan Anda atau membuangnya.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Basis data ini belum pernah disimpan.
Anda bisa menyimpan basis data atau berhenti menguncinya.</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>Basis data ini telah dimodifikasi.
Apakah Anda ingin menyimpan basis data sebelum menguncinya?
Kalau tidak, ubahan Anda akan hilang.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>&quot;%1&quot; dalam mode penyuntingan.
Tetap buang ubahan dan tutup?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Ekspor basis data ke berkas CSV</translation>
</message>
<message>
<source>CSV file</source>
<translation>Berkas CSV</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Gagal membuat berkas CSV.</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>Basis data yang Anda coba buka terkunci oleh KeePassX lain yang sedang berjalan.
Apakah Anda tetap ingin menyimpannya?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -283,7 +349,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Do you really want to delete the entry &quot;%1&quot; for good?</source>
<translation>Apakah anda ingin menghapus entri &quot;%1&quot; untuk selamanya?</translation>
<translation>Apakah Anda benar-benar ingin menghapus entri &quot;%1&quot; untuk selamanya?</translation>
</message>
<message>
<source>Delete entries?</source>
@@ -291,15 +357,15 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Do you really want to delete %1 entries for good?</source>
<translation>Apakah anda ingin menghapus entri %1 untuk selamanya?</translation>
<translation>Apakah Anda benar-benar ingin menghapus entri %1 untuk selamanya?</translation>
</message>
<message>
<source>Move entries to recycle bin?</source>
<translation type="unfinished"/>
<translation>Pindah entri ke tong sampah?</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></translation>
<translation><numerusform>Apakah Anda benar-benar ingin memindahkan %n entri ke tong sampah?</numerusform></translation>
</message>
<message>
<source>Delete group?</source>
@@ -307,12 +373,20 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Do you really want to delete the group &quot;%1&quot; for good?</source>
<translation>Apakah anda ingin menghapus grup &quot;%1&quot; untuk selamanya?</translation>
<translation>Apakah Anda benar-benar ingin menghapus grup &quot;%1&quot; untuk selamanya?</translation>
</message>
<message>
<source>Current group</source>
<translation>Grup saat ini</translation>
</message>
<message>
<source>Error</source>
<translation>Galat</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Tidak bisa mengkalkulasi kunci utama</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -342,7 +416,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Entry history</source>
<translation>Entri riwayat</translation>
<translation>Riwayat entri</translation>
</message>
<message>
<source>Add entry</source>
@@ -358,7 +432,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Kata sandi yang berbeda diberikan.</translation>
<translation>Sandi berbeda.</translation>
</message>
<message>
<source>New attribute</source>
@@ -370,7 +444,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Unable to open file</source>
<translation>Tidak dapat membuka berkas</translation>
<translation>Tidak bisa membuka berkas</translation>
</message>
<message>
<source>Save attachment</source>
@@ -379,7 +453,7 @@ Simpan perubahan?</translation>
<message>
<source>Unable to save the attachment:
</source>
<translation>Tidak dapat menyimpan lampiran:
<translation>Tidak bisa menyimpan lampiran:
</translation>
</message>
<message>
@@ -388,11 +462,11 @@ Simpan perubahan?</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>%n minggu(s)</numerusform></translation>
<translation><numerusform>%n minggu</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
<translation><numerusform>%n bulan(s)</numerusform></translation>
<translation><numerusform>%n bulan</numerusform></translation>
</message>
<message>
<source>1 year</source>
@@ -415,7 +489,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Remove</source>
<translation>Hapus</translation>
<translation>Buang</translation>
</message>
<message>
<source>Attachments</source>
@@ -425,6 +499,10 @@ Simpan perubahan?</translation>
<source>Save</source>
<translation>Simpan</translation>
</message>
<message>
<source>Open</source>
<translation>Buka</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -434,11 +512,11 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the group</source>
<translation type="unfinished"/>
<translation>Mengikuti urutan Ketik-Otomatis baku grup</translation>
</message>
<message>
<source>Use custom Auto-Type sequence:</source>
<translation type="unfinished"/>
<translation>Gunakan urutan Ketik-Otomatis ubahsuai:</translation>
</message>
<message>
<source>+</source>
@@ -458,7 +536,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Set custom sequence:</source>
<translation>Tetapkan urutan kustom:</translation>
<translation>Tetapkan urutan ubahsuai:</translation>
</message>
</context>
<context>
@@ -492,7 +570,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Password:</source>
<translation>Kata sandi:</translation>
<translation>Sandi:</translation>
</message>
<message>
<source>Repeat:</source>
@@ -508,11 +586,11 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Expires</source>
<translation>Kadaluarsa</translation>
<translation>Kedaluwarsa</translation>
</message>
<message>
<source>Presets</source>
<translation type="unfinished"/>
<translation>Prasetel</translation>
</message>
<message>
<source>Notes:</source>
@@ -551,7 +629,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Inherit from parent group (%1)</source>
<translation type="unfinished"/>
<translation>Mengikuti grup induk (%1)</translation>
</message>
</context>
<context>
@@ -566,7 +644,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Expires</source>
<translation>Kadaluarsa</translation>
<translation>Kedaluwarsa</translation>
</message>
<message>
<source>Search</source>
@@ -576,6 +654,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>Gunakan urutan ketik-otomatis baku grup induk</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Tetapkan urutan ketik-otomatis baku</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -585,15 +671,15 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Use custom icon</source>
<translation>Gunakan ikon kustom</translation>
<translation>Gunakan ikon ubahsuai</translation>
</message>
<message>
<source>Add custom icon</source>
<translation>Tambah ikon kustom</translation>
<translation>Tambah ikon ubahsuai</translation>
</message>
<message>
<source>Delete custom icon</source>
<translation>Hapus ikon kustom</translation>
<translation>Hapus ikon ubahsuai</translation>
</message>
<message>
<source>Images</source>
@@ -609,11 +695,11 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Can&apos;t delete icon!</source>
<translation>Tidak dapat menghapus ikon!</translation>
<translation>Tidak bisa menghapus ikon!</translation>
</message>
<message numerus="yes">
<source>Can&apos;t delete icon. Still used by %n item(s).</source>
<translation><numerusform>Can&apos;t delete icon. Still used by %n item(s).</numerusform></translation>
<translation><numerusform>Tidak bisa menghapus ikon. Masih digunakan oleh %n item.</numerusform></translation>
</message>
</context>
<context>
@@ -684,7 +770,7 @@ Simpan perubahan?</translation>
<name>Group</name>
<message>
<source>Recycle Bin</source>
<translation type="unfinished"/>
<translation>Tong Sampah</translation>
</message>
</context>
<context>
@@ -699,52 +785,70 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Tidak dapat membuka basis data</translation>
<translation>Tidak bisa membuka basis data.</translation>
</message>
</context>
<context>
<name>KeePass1Reader</name>
<message>
<source>Unable to read keyfile.</source>
<translation>Tidak dapat membaca berkas kunci.</translation>
<translation>Tidak bisa membaca berkas kunci.</translation>
</message>
<message>
<source>Not a KeePass database.</source>
<translation>Bukan basis data KeePass</translation>
<translation>Bukan basis data KeePass.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
<translation>Algoritma enkripsi tidak didukung</translation>
<translation>Algoritma enkripsi tidak didukung.</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Versi Basis data KeePass tidak didukung</translation>
<translation>Versi basis data KeePass tidak didukung.</translation>
</message>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation>Root</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Tidak bisa mengkalkulasi kunci utama</translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
<message>
<source>Not a KeePass database.</source>
<translation>Bukan basis data KeePass</translation>
<translation>Bukan basis data KeePass.</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Versi basis data KeePass tidak didukung</translation>
<translation>Versi basis data KeePass tidak didukung.</translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation>Kunci salah atau berkas basis data korup.</translation>
<translation>Kunci salah atau berkas basis data rusak.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Tidak bisa mengkalkulasi kunci utama</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Berkas yang dipilih adalah basis data KeePass 1 yang lama (.kdb).
Anda bisa mengimpornya dengan mengklik Basis Data &gt; &apos;Impor basis data KeePass 1&apos;.
Ini adalah migrasi satu arah. Anda tidak akan bisa lagi membuka basis data yang diimpor dengan versi lama KeePassX 0.4.</translation>
</message>
</context>
<context>
<name>Main</name>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
<translation type="unfinished"/>
<translation>Galat saat menguji fungsi kriptografi.</translation>
</message>
<message>
<source>KeePassX - Error</source>
@@ -759,7 +863,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Recent databases</source>
<translation type="unfinished"/>
<translation>Basis data baru-baru ini</translation>
</message>
<message>
<source>Help</source>
@@ -777,13 +881,9 @@ 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"/>
<translation>Lihat</translation>
</message>
<message>
<source>Quit</source>
@@ -815,7 +915,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>View/Edit entry</source>
<translation>Tampil/Sunting entri</translation>
<translation>Lihat/Sunting entri</translation>
</message>
<message>
<source>Delete entry</source>
@@ -851,27 +951,19 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Clone entry</source>
<translation type="unfinished"/>
<translation>Duplikat entri</translation>
</message>
<message>
<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>
<translation>Salin sandi ke papan klip</translation>
</message>
<message>
<source>Settings</source>
@@ -879,7 +971,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Perform Auto-Type</source>
<translation>Melakukan Ketik-Otomatis</translation>
<translation>Lakukan Ketik-Otomatis</translation>
</message>
<message>
<source>Open URL</source>
@@ -907,18 +999,34 @@ Simpan perubahan?</translation>
</message>
<message>
<source>read-only</source>
<translation>hanya-baca</translation>
<translation>baca-saja</translation>
</message>
<message>
<source>Toggle window</source>
<translation type="unfinished"/>
<translation>Jungkit jendela</translation>
</message>
<message>
<source>Tools</source>
<translation>Perkakas</translation>
</message>
<message>
<source>Copy username</source>
<translation>Salin nama pengguna</translation>
</message>
<message>
<source>Copy password</source>
<translation>Salin sandi</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Ekspor ke berkas CSV</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
<message>
<source>Password:</source>
<translation>Kata sandi:</translation>
<translation>Sandi:</translation>
</message>
<message>
<source>Length:</source>
@@ -926,15 +1034,15 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Character Types</source>
<translation>Tipe karakter</translation>
<translation>Tipe Karakter</translation>
</message>
<message>
<source>Upper Case Letters</source>
<translation type="unfinished"/>
<translation>Huruf Besar</translation>
</message>
<message>
<source>Lower Case Letters</source>
<translation type="unfinished"/>
<translation>Huruf Kecil</translation>
</message>
<message>
<source>Numbers</source>
@@ -946,11 +1054,11 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation type="unfinished"/>
<translation>Kecualikan karakter mirip</translation>
</message>
<message>
<source>Ensure that the password contains characters from every group</source>
<translation>Pastikan kata sandi berisi karakter dari setiap grup</translation>
<translation>Pastikan sandi berisi karakter dari setiap grup</translation>
</message>
<message>
<source>Accept</source>
@@ -961,11 +1069,11 @@ Simpan perubahan?</translation>
<name>QCommandLineParser</name>
<message>
<source>Displays version information.</source>
<translation>Tampilkan informasi versi</translation>
<translation>Tampilkan informasi versi.</translation>
</message>
<message>
<source>Displays this help.</source>
<translation>Tampilkan bantuan ini</translation>
<translation>Tampilkan bantuan ini.</translation>
</message>
<message>
<source>Unknown option &apos;%1&apos;.</source>
@@ -997,29 +1105,29 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Arguments:</source>
<translation>Argumen</translation>
<translation>Argumen:</translation>
</message>
</context>
<context>
<name>QSaveFile</name>
<message>
<source>Existing file %1 is not writable</source>
<translation>Berkas yang ada %1 tidak dapat ditulis</translation>
<translation>Berkas yang ada %1 tidak bisa ditulis</translation>
</message>
<message>
<source>Writing canceled by application</source>
<translation>Menulis dibatalkan oleh aplikasi</translation>
<translation>Penulisan dibatalkan oleh aplikasi</translation>
</message>
<message>
<source>Partial write. Partition full?</source>
<translation type="unfinished"/>
<translation>Penulisan parsial. Partisi penuh?</translation>
</message>
</context>
<context>
<name>QtIOCompressor</name>
<message>
<source>Internal zlib error when compressing: </source>
<translation>Galat zlib internal ketika mengkompress: </translation>
<translation>Galat zlib internal ketika memampatkan:</translation>
</message>
<message>
<source>Error writing to underlying device: </source>
@@ -1035,7 +1143,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
<translation>Galat zlib internal ketika dekompress</translation>
<translation>Galat zlib internal ketika dekompres:</translation>
</message>
</context>
<context>
@@ -1057,15 +1165,15 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Case sensitive</source>
<translation type="unfinished"/>
<translation>Sensitif besar kecil huruf</translation>
</message>
<message>
<source>Current group</source>
<translation type="unfinished"/>
<translation>Grup saat ini</translation>
</message>
<message>
<source>Root group</source>
<translation type="unfinished"/>
<translation>Grup root</translation>
</message>
</context>
<context>
@@ -1093,10 +1201,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>
@@ -1107,7 +1211,7 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Minimize when copying to clipboard</source>
<translation>Kecilkan ketika menyalin ke papan klip</translation>
<translation>Minimalkan ketika menyalin ke papan klip</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
@@ -1115,11 +1219,11 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
<translation>Jalan pintas global Ketik-Otomatis</translation>
<translation>Pintasan global Ketik-Otomatis</translation>
</message>
<message>
<source>Use entry title to match windows for global auto-type</source>
<translation type="unfinished"/>
<translation>Gunakan judul entri untuk mencocokkan jendela untuk ketik-otomatis global</translation>
</message>
<message>
<source>Language</source>
@@ -1127,18 +1231,22 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Show a system tray icon</source>
<translation>Tampilkan sebuah ikon baki sistem</translation>
<translation>Tampilkan ikon baki sistem</translation>
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation>Sembunyikan jendela ke baki sistem ketika dikecilkan</translation>
<translation>Sembunyikan jendela ke baki sistem ketika diminimalkan</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Ingat berkas kunci terakhir</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
<message>
<source>Clear clipboard after</source>
<translation>Bersihkan papan klip setelaj</translation>
<translation>Kosongkan papan klip setelah</translation>
</message>
<message>
<source> sec</source>
@@ -1146,56 +1254,44 @@ Simpan perubahan?</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
<translation type="unfinished"/>
<translation>Kunci basis data setelah tidak aktif selama</translation>
</message>
<message>
<source>Show passwords in cleartext by default</source>
<translation type="unfinished"/>
<translation>Tampilkan teks sandi secara baku</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
<translation type="unfinished"/>
<translation>Selalu tanya sebelum melakukan ketik-otomatis</translation>
</message>
</context>
<context>
<name>UnlockDatabaseWidget</name>
<message>
<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>
<translation>Buka kunci basis data</translation>
</message>
</context>
<context>
<name>WelcomeWidget</name>
<message>
<source>Welcome!</source>
<translation>Selamat Datang.</translation>
<translation>Selamat datang!</translation>
</message>
</context>
<context>
<name>main</name>
<message>
<source>KeePassX - cross-platform password manager</source>
<translation>KeePassX - manajer kata sandi cross-platform</translation>
<translation>KeePassX - pengelola sandi lintas platform</translation>
</message>
<message>
<source>filename of the password database to open (*.kdbx)</source>
<translation>nama berkasi dari basis data kata sandi untuk dibuka (*.kdbx)</translation>
<translation>nama berkas dari basis data sandi untuk dibuka (*.kdbx)</translation>
</message>
<message>
<source>path to a custom config file</source>
<translation type="unfinished"/>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>kata sandi dari basis data (BERBAHAYA!)</translation>
<translation>jalur ke berkas konfig ubahsuai</translation>
</message>
<message>
<source>key file of the database</source>

View File

@@ -3,12 +3,19 @@
<name>AboutDialog</name>
<message>
<source>About KeePassX</source>
<translation>A proposito di KeePassX</translation>
<translation>Informazioni su 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>
<translation>KeePassX è distribuito sotto i termini della licenza
GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</translation>
<translation>KeePassX è distribuito sotto i termini della licenza GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revisione</translation>
</message>
<message>
<source>Using:</source>
<translation>In uso:</translation>
</message>
</context>
<context>
@@ -19,7 +26,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>
@@ -45,7 +52,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation>Selezionare una voce per Auto-Type:</translation>
<translation>Seleziona una voce per Auto-Type:</translation>
</message>
</context>
<context>
@@ -56,11 +63,11 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Enter password:</source>
<translation>Inserire password:</translation>
<translation>Inserisci password:</translation>
</message>
<message>
<source>Repeat password:</source>
<translation>Ripetere password:</translation>
<translation>Ripeti password:</translation>
</message>
<message>
<source>Key file</source>
@@ -68,11 +75,11 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Browse</source>
<translation>Sfogliare</translation>
<translation>Sfoglia</translation>
</message>
<message>
<source>Create</source>
<translation>Creare</translation>
<translation>Crea</translation>
</message>
<message>
<source>Key files</source>
@@ -84,7 +91,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Create Key File...</source>
<translation>Creare file chiave...</translation>
<translation>Crea file chiave...</translation>
</message>
<message>
<source>Error</source>
@@ -96,7 +103,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Select a key file</source>
<translation>Selezionare file chiave</translation>
<translation>Seleziona il file chiave</translation>
</message>
<message>
<source>Question</source>
@@ -112,23 +119,24 @@ 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 chiave</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation type="unfinished"/>
<translation>Impossibile impostare %1 come file chiave:
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
<message>
<source>Enter master key</source>
<translation>Inserire password</translation>
<translation>Inserisci la chiave principale</translation>
</message>
<message>
<source>Key File:</source>
<translation>File Chiave:</translation>
<translation>File chiave:</translation>
</message>
<message>
<source>Password:</source>
@@ -136,7 +144,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Browse</source>
<translation>Sfogliare</translation>
<translation>Sfoglia</translation>
</message>
<message>
<source>Error</source>
@@ -160,18 +168,18 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Select key file</source>
<translation>Selezionare file chiave</translation>
<translation>Seleziona file chiave</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
<source>Database name:</source>
<translation>Nome database:</translation>
<translation>Nome del database:</translation>
</message>
<message>
<source>Database description:</source>
<translation>Descrizione database:</translation>
<translation>Descrizione del database:</translation>
</message>
<message>
<source>Transform rounds:</source>
@@ -183,7 +191,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Use recycle bin:</source>
<translation>Utilizzare cestino:</translation>
<translation>Utilizza cestino:</translation>
</message>
<message>
<source> MiB</source>
@@ -191,7 +199,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Benchmark</source>
<translation>Benchmark</translation>
<translation>Prestazione</translation>
</message>
<message>
<source>Max. history items:</source>
@@ -218,7 +226,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Open database</source>
<translation>Aprire database</translation>
<translation>Apri database</translation>
</message>
<message>
<source>Warning</source>
@@ -230,7 +238,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Open KeePass 1 database</source>
<translation>Aprire database KeePass 1</translation>
<translation>Apri database KeePass 1</translation>
</message>
<message>
<source>KeePass 1 database</source>
@@ -244,12 +252,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>
@@ -257,7 +259,7 @@ Chiudere comunque?</translation>
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
<translation>&quot;%1&quot; è stata modificata.
<translation>&quot;%1&quot; è stata modificato.
Salvare le modifiche?</translation>
</message>
<message>
@@ -266,11 +268,11 @@ Salvare le modifiche?</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Scrittura del database fallita.</translation>
<translation>Scrittura del database non riuscita.</translation>
</message>
<message>
<source>Save database as</source>
<translation>Salvare database come</translation>
<translation>Salva database come</translation>
</message>
<message>
<source>New database</source>
@@ -283,34 +285,63 @@ 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 istanza di KeePassX.
Vuoi aprirlo comunque? Altrimenti il database verrà aperto in sola lettura.</translation>
</message>
<message>
<source>Lock database</source>
<translation type="unfinished"/>
<translation>Blocca 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 dato che lo stai modificando.
Premere Annulla per completare 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 è mai stato salvato.
È possibile salvare il database o interrompere il blocco.</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 non riuscita.</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>Il database che stai tentando di salvare è bloccato da un&apos;altra istanza di KeePassX.
Vuoi salvare comunque?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Change master key</source>
<translation>Cambiare password principale</translation>
<translation>Cambia chiave principale</translation>
</message>
<message>
<source>Delete entry?</source>
@@ -350,11 +381,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 principale</translation>
</message>
</context>
<context>
@@ -409,7 +440,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Select file</source>
<translation>Selezionare file</translation>
<translation>Seleziona file</translation>
</message>
<message>
<source>Unable to open file</source>
@@ -422,7 +453,7 @@ Otherwise your changes are lost.</source>
<message>
<source>Unable to save the attachment:
</source>
<translation>Impossibile salvare l&apos;allegato
<translation>Impossibile salvare l&apos;allegato:
</translation>
</message>
<message>
@@ -431,15 +462,15 @@ Otherwise your changes are lost.</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>%n settimana(e)</numerusform><numerusform>%n settimana(e)</numerusform></translation>
<translation><numerusform>%n settimana</numerusform><numerusform>%n settimane</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
<translation><numerusform>%n mese(i)</numerusform><numerusform>%n mese(i)</numerusform></translation>
<translation><numerusform>%n mese</numerusform><numerusform>%n mesi</numerusform></translation>
</message>
<message>
<source>1 year</source>
<translation>1 anno</translation>
<translation>Un anno</translation>
</message>
</context>
<context>
@@ -450,15 +481,15 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Add</source>
<translation>Aggiungere</translation>
<translation>Aggiungi</translation>
</message>
<message>
<source>Edit</source>
<translation>Modificare</translation>
<translation>Modifica</translation>
</message>
<message>
<source>Remove</source>
<translation>Rimuovere</translation>
<translation>Rimuovi</translation>
</message>
<message>
<source>Attachments</source>
@@ -466,26 +497,26 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Save</source>
<translation>Salvare</translation>
<translation>Salva</translation>
</message>
<message>
<source>Open</source>
<translation type="unfinished"/>
<translation>Apri</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
<translation>Abilitare Auto-Type per questa voce</translation>
<translation>Abilita Auto-Type per questa voce</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the group</source>
<translation>Ereditare la sequenza predefinita di Auto-Type dal gruppo</translation>
<translation>Eredita la sequenza predefinita di Auto-Type dal gruppo</translation>
</message>
<message>
<source>Use custom Auto-Type sequence:</source>
<translation>Usare sequenza personalizzata di Auto-Type:</translation>
<translation>Usa sequenza personalizzata di Auto-Type:</translation>
</message>
<message>
<source>+</source>
@@ -501,30 +532,30 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Use default sequence</source>
<translation>Usare sequenza predefinita</translation>
<translation>Usa sequenza predefinita</translation>
</message>
<message>
<source>Set custom sequence:</source>
<translation>Impostare sequenza personalizzata:</translation>
<translation>Imposta sequenza personalizzata:</translation>
</message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
<message>
<source>Show</source>
<translation>Mostrare</translation>
<translation>Mostra</translation>
</message>
<message>
<source>Restore</source>
<translation>Ripristinare</translation>
<translation>Ripristina</translation>
</message>
<message>
<source>Delete</source>
<translation>Eliminare</translation>
<translation>Elimina</translation>
</message>
<message>
<source>Delete all</source>
<translation>Eliminare tutti</translation>
<translation>Elimina tutti</translation>
</message>
</context>
<context>
@@ -543,7 +574,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Repeat:</source>
<translation>Ripetere:</translation>
<translation>Ripeti:</translation>
</message>
<message>
<source>Gen.</source>
@@ -559,7 +590,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Presets</source>
<translation>Programmare</translation>
<translation>Preimpostazioni</translation>
</message>
<message>
<source>Notes:</source>
@@ -582,23 +613,23 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Add group</source>
<translation>Aggiungere gruppo</translation>
<translation>Aggiungi gruppo</translation>
</message>
<message>
<source>Edit group</source>
<translation>Modificare gruppo</translation>
<translation>Modifica gruppo</translation>
</message>
<message>
<source>Enable</source>
<translation>Abilitare</translation>
<translation>Abilita</translation>
</message>
<message>
<source>Disable</source>
<translation>Disabilitare</translation>
<translation>Disabilita</translation>
</message>
<message>
<source>Inherit from parent group (%1)</source>
<translation>Ereditare dal gruppo genitore (%1)</translation>
<translation>Eredita dal gruppo genitore (%1)</translation>
</message>
</context>
<context>
@@ -617,7 +648,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Search</source>
<translation>Cercare</translation>
<translation>Cerca</translation>
</message>
<message>
<source>Auto-type</source>
@@ -625,30 +656,30 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
<translation>Eredita la sequenza predefinita di auto-type dal gruppo</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
<translation>Usa sequenza di auto-type predefinita</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
<message>
<source>Use default icon</source>
<translation>Usare icona predefinita</translation>
<translation>Usa icona predefinita</translation>
</message>
<message>
<source>Use custom icon</source>
<translation>Usare icona personalizzata</translation>
<translation>Usa icona personalizzata</translation>
</message>
<message>
<source>Add custom icon</source>
<translation>Aggiungere icona personalizzata</translation>
<translation>Aggiungi icona personalizzata</translation>
</message>
<message>
<source>Delete custom icon</source>
<translation>Rimuovere icona personalizzata</translation>
<translation>Rimuovi icona personalizzata</translation>
</message>
<message>
<source>Images</source>
@@ -660,26 +691,26 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Select Image</source>
<translation>Selezionare Immagine</translation>
<translation>Seleziona immagine</translation>
</message>
<message>
<source>Can&apos;t delete icon!</source>
<translation>Impossibile eliminare icona!</translation>
<translation>Impossibile eliminare l&apos;icona!</translation>
</message>
<message numerus="yes">
<source>Can&apos;t delete icon. Still used by %n item(s).</source>
<translation><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voce(i).</numerusform><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voce(i).</numerusform></translation>
<translation><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voce.</numerusform><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voci.</numerusform></translation>
</message>
</context>
<context>
<name>EditWidgetProperties</name>
<message>
<source>Created:</source>
<translation>Creato:</translation>
<translation>Creazione:</translation>
</message>
<message>
<source>Modified:</source>
<translation>Modificato:</translation>
<translation>Modifica:</translation>
</message>
<message>
<source>Accessed:</source>
@@ -687,7 +718,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Uuid:</source>
<translation>Uuid:</translation>
<translation>UUID:</translation>
</message>
</context>
<context>
@@ -728,7 +759,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Username</source>
<translation>Nome Utente</translation>
<translation>Nome utente</translation>
</message>
<message>
<source>URL</source>
@@ -739,14 +770,14 @@ Otherwise your changes are lost.</source>
<name>Group</name>
<message>
<source>Recycle Bin</source>
<translation>Cestino (Gruppo)</translation>
<translation>Cestino</translation>
</message>
</context>
<context>
<name>KeePass1OpenWidget</name>
<message>
<source>Import KeePass1 database</source>
<translation>Importare database KeePass1</translation>
<translation>Importa database KeePass1</translation>
</message>
<message>
<source>Error</source>
@@ -761,7 +792,7 @@ Otherwise your changes are lost.</source>
<name>KeePass1Reader</name>
<message>
<source>Unable to read keyfile.</source>
<translation>Impossibile leggere il file chiave.</translation>
<translation>Impossibile leggere il file della chiave.</translation>
</message>
<message>
<source>Not a KeePass database.</source>
@@ -773,15 +804,15 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Versione database non supportata</translation>
<translation>Versione database KeePass non supportata.</translation>
</message>
<message>
<source>Root</source>
<translation>Root (KeePass1Reader)</translation>
<translation>Root</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Impossibile calcolare la chiave principale</translation>
</message>
</context>
<context>
@@ -792,26 +823,36 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Versione database non supportata</translation>
<translation>Versione database KeePass non supportata.</translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation>Password errata o database corrotto.</translation>
<translation>Chiave errata o file del database danneggiato.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Impossibile calcolare la chiave principale</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Il file selezionato è un vecchio database KeePass 1 (.kdb).
Puoi importarlo facendo clic su Database &gt; &apos;Importa database KeePass 1&apos;.
Questa è una migrazione in una sola direzione. Non potrai aprire il database importato con la vecchia versione 0.4 di KeePassX. </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>
@@ -834,7 +875,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Copy attribute to clipboard</source>
<translation>Copiare attributi negli appunti</translation>
<translation>Copia attributi negli appunti</translation>
</message>
<message>
<source>Groups</source>
@@ -842,27 +883,27 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>View</source>
<translation>Visualizzare</translation>
<translation>Visualizza</translation>
</message>
<message>
<source>Quit</source>
<translation>Uscire</translation>
<translation>Esci</translation>
</message>
<message>
<source>About</source>
<translation>A Proposito</translation>
<translation>Informazioni</translation>
</message>
<message>
<source>Open database</source>
<translation>Aprire database</translation>
<translation>Apri database</translation>
</message>
<message>
<source>Save database</source>
<translation>Salvare database</translation>
<translation>Salva database</translation>
</message>
<message>
<source>Close database</source>
<translation>Chiudere database</translation>
<translation>Chiudi database</translation>
</message>
<message>
<source>New database</source>
@@ -870,35 +911,35 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Add new entry</source>
<translation>Aggiungere nuova voce</translation>
<translation>Aggiungi nuova voce</translation>
</message>
<message>
<source>View/Edit entry</source>
<translation>Visualizzare/Modificare voce</translation>
<translation>Visualizza/modifica voce</translation>
</message>
<message>
<source>Delete entry</source>
<translation>Eliminare voce</translation>
<translation>Elimina voce</translation>
</message>
<message>
<source>Add new group</source>
<translation>Aggiungere nuovo gruppo</translation>
<translation>Aggiungi nuovo gruppo</translation>
</message>
<message>
<source>Edit group</source>
<translation>Modificare gruppo</translation>
<translation>Modifica gruppo</translation>
</message>
<message>
<source>Delete group</source>
<translation>Eliminare gruppo</translation>
<translation>Elimina gruppo</translation>
</message>
<message>
<source>Save database as</source>
<translation>Salvare database come</translation>
<translation>Salva database come</translation>
</message>
<message>
<source>Change master key</source>
<translation>Cambiare password principale</translation>
<translation>Cambia chiave principale</translation>
</message>
<message>
<source>Database settings</source>
@@ -906,7 +947,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Import KeePass 1 database</source>
<translation>Importare database KeePass 1</translation>
<translation>Importa database KeePass 1</translation>
</message>
<message>
<source>Clone entry</source>
@@ -914,23 +955,15 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Find</source>
<translation>Trovare</translation>
</message>
<message>
<source>Username</source>
<translation>Nome Utente</translation>
<translation>Trova</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Copiare nome utente negli appunti</translation>
</message>
<message>
<source>Password</source>
<translation>Password</translation>
<translation>Copia nome utente negli appunti</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Copiare password negli appunti</translation>
<translation>Copia password negli appunti</translation>
</message>
<message>
<source>Settings</source>
@@ -938,15 +971,15 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Perform Auto-Type</source>
<translation>Eseguire Auto-Type</translation>
<translation>Esegui Auto-Type</translation>
</message>
<message>
<source>Open URL</source>
<translation>Aprire URL</translation>
<translation>Apri URL</translation>
</message>
<message>
<source>Lock databases</source>
<translation>Bloccare database</translation>
<translation>Blocca database</translation>
</message>
<message>
<source>Title</source>
@@ -962,7 +995,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Show toolbar</source>
<translation>Mostrare barra degli strumenti</translation>
<translation>Mostra barra degli strumenti</translation>
</message>
<message>
<source>read-only</source>
@@ -970,11 +1003,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>
@@ -1009,26 +1054,26 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation>Escludere caratteri simili</translation>
<translation>Escludi caratteri simili</translation>
</message>
<message>
<source>Ensure that the password contains characters from every group</source>
<translation>Assicurare che la password contenga caratteri di ogni gruppo</translation>
<translation>Verifica che la password contenga caratteri di ogni gruppo</translation>
</message>
<message>
<source>Accept</source>
<translation>Accettare</translation>
<translation>Accetta</translation>
</message>
</context>
<context>
<name>QCommandLineParser</name>
<message>
<source>Displays version information.</source>
<translation>Mostrare informazioni sulla versione.</translation>
<translation>Mostra informazioni sulla versione.</translation>
</message>
<message>
<source>Displays this help.</source>
<translation>Mostrare questo aiuto.</translation>
<translation>Mostra questo aiuto.</translation>
</message>
<message>
<source>Unknown option &apos;%1&apos;.</source>
@@ -1071,7 +1116,7 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Writing canceled by application</source>
<translation>Scrittura cancellata dall&apos;applicazione</translation>
<translation>Scrittura annullata dall&apos;applicazione</translation>
</message>
<message>
<source>Partial write. Partition full?</source>
@@ -1116,11 +1161,11 @@ Otherwise your changes are lost.</source>
<name>SearchWidget</name>
<message>
<source>Find:</source>
<translation>Trovare:</translation>
<translation>Trova:</translation>
</message>
<message>
<source>Case sensitive</source>
<translation>Case sensitive</translation>
<translation>Riconoscimento di maiuscole e minuscole</translation>
</message>
<message>
<source>Current group</source>
@@ -1150,27 +1195,27 @@ Otherwise your changes are lost.</source>
<name>SettingsWidgetGeneral</name>
<message>
<source>Remember last databases</source>
<translation>Ricordare ultimo database</translation>
<translation>Ricorda ultimo database</translation>
</message>
<message>
<source>Open previous databases on startup</source>
<translation>Aprire precedente database all&apos;avvio</translation>
<translation>Apri il database precedente all&apos;avvio</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Salvare automaticamente all&apos;uscita</translation>
<translation>Salva automaticamente all&apos;uscita</translation>
</message>
<message>
<source>Automatically save after every change</source>
<translation>Salvare automaticamente dopo ogni modifica</translation>
<translation>Salva automaticamente dopo ogni modifica</translation>
</message>
<message>
<source>Minimize when copying to clipboard</source>
<translation>Minimizzare quando si copia negli appunti</translation>
<translation>Minimizza quando si copia negli appunti</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
<translation>Usare l&apos;icona del gruppo alla creazione di una voce</translation>
<translation>Usa l&apos;icona del gruppo alla creazione di una voce</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
@@ -1178,30 +1223,30 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Use entry title to match windows for global auto-type</source>
<translation>Utilizzare il titolo della voce per abbinare la finestra per auto-type globale</translation>
<translation>Utilizza il titolo della voce per abbinare la finestra per auto-type globale</translation>
</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 minimizzata</translation>
</message>
<message>
<source>Remember last key files</source>
<translation type="unfinished"/>
<translation>Ricorda gli ultimi file di chiavi</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
<message>
<source>Clear clipboard after</source>
<translation>Pulire appunti dopo</translation>
<translation>Pulisci appunti dopo</translation>
</message>
<message>
<source> sec</source>
@@ -1209,49 +1254,45 @@ Otherwise your changes are lost.</source>
</message>
<message>
<source>Lock databases after inactivity of</source>
<translation>Bloccare database dopo un&apos;inattività di</translation>
<translation>Blocca i database dopo un&apos;inattività di</translation>
</message>
<message>
<source>Show passwords in cleartext by default</source>
<translation>Mostrare la password in chiaro in maniera predefinita</translation>
<translation>Mostra la password in chiaro in maniera predefinita</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
<translation>Chiedere sempre prima di eseguire auto-type</translation>
<translation>Chiedi sempre prima di eseguire auto-type</translation>
</message>
</context>
<context>
<name>UnlockDatabaseWidget</name>
<message>
<source>Unlock database</source>
<translation>Sbloccare database</translation>
<translation>Sblocca database</translation>
</message>
</context>
<context>
<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>
<translation>nome del file del database da aprire (*.kdbx)</translation>
<translation>nome del file di database da aprire (*.kdbx)</translation>
</message>
<message>
<source>path to a custom config file</source>
<translation>percorso ad un file di configurazione personalizzato</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>password del database (PERICOLOSO!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>file chiave del database</translation>

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>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,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>KeePassX wordt verspreid onder de bepalingen van de GNU General Public License (GPL) versie 2 of (als u wenst) versie 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revisie</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -109,6 +113,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 +248,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 +278,60 @@ 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>
<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>De database die u op probeert te slaan is vergrendeld door een andere instantie van KeePassX.
Wilt u toch doorgaan met opslaan?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -313,6 +375,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 +495,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 +650,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 +806,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 +825,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 +867,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 +943,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 +991,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 +1187,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 +1223,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 +1257,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>
@@ -1193,10 +1279,6 @@ Opslaan?</translation>
<source>path to a custom config file</source>
<translation>pad naar een configuratiebestand</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>wachtwoord van de database (GEVAARLIJK!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>sleutelbestand van de database</translation>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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

@@ -9,6 +9,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>KeePassX распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Ревизия</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -44,7 +48,7 @@
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation>Выберете запись для автоввода:</translation>
<translation>Выберите запись для автоввода:</translation>
</message>
</context>
<context>
@@ -103,12 +107,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 +164,7 @@
</message>
<message>
<source>Select key file</source>
<translation>Выберете файл-ключ</translation>
<translation>Выберите файл-ключ</translation>
</message>
</context>
<context>
@@ -169,7 +183,7 @@
</message>
<message>
<source>Default username:</source>
<translation>Имя пользователя по-умолчанию:</translation>
<translation>Имя пользователя по умолчанию:</translation>
</message>
<message>
<source>Use recycle bin:</source>
@@ -234,12 +248,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 +276,65 @@ 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>Хранилище, которое Вы хотите открыть, заблокировано другой запущенной копией 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 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>Хранилище было изменено.
Вы хотите сохранить его перед тем, как заблокировать?
В противном случае все изменения будут потеряны.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>&quot;%1&quot; в режиме редактирования.
Отменить изменения и всё равно закрыть?</translation>
</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>Не удалось записать CSV файл.</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>Данное хранилище заблокировано другой запущенной копией KeePassX.
Вы уверены, что хотите продолжить сохранение?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Change master key</source>
<translation>Сменить мастер-пароль</translation>
<translation>Изменить мастер-пароль</translation>
</message>
<message>
<source>Delete entry?</source>
@@ -313,6 +372,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 +393,7 @@ Save changes?</source>
</message>
<message>
<source>Icon</source>
<translation>Иконка</translation>
<translation>Значок</translation>
</message>
<message>
<source>Auto-Type</source>
@@ -425,6 +492,10 @@ Save changes?</source>
<source>Save</source>
<translation>Сохранить</translation>
</message>
<message>
<source>Open</source>
<translation>Открыть</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -527,7 +598,7 @@ Save changes?</source>
</message>
<message>
<source>Icon</source>
<translation>Иконка</translation>
<translation>Значок</translation>
</message>
<message>
<source>Properties</source>
@@ -574,26 +645,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 +688,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 +803,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 +822,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 +864,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 +940,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 +988,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 +1041,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 +1114,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 +1184,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 +1220,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 +1241,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 +1254,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>
@@ -1193,10 +1276,6 @@ Save changes?</source>
<source>path to a custom config file</source>
<translation>путь к своему файлу настроек</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>пароль от хранилища (ОПАСНО!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>файл-ключ хранилища</translation>

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,14 @@
<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 distribueras enligt villkoren i GNU General Public License (GPL) version 2 eller (om du vill) version 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revision</translation>
</message>
<message>
<source>Using:</source>
<translation>Använder:</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -109,6 +117,16 @@
<source>Different passwords supplied.</source>
<translation>Olika lösenord angivna</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation>Kunde inte sätta nyckel-fil</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Kunde inte sätta %1 som nyckel-fil:
%2</translation>
</message>
</context>
<context>
<name>DatabaseOpenWidget</name>
@@ -234,12 +252,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 +282,60 @@ 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>Databasen som du försöker öppna är låst av en annan instans av KeePassX.
Vill du öppna den ändå? Databasen kommer att öppnas skrivskyddad.</translation>
</message>
<message>
<source>Lock database</source>
<translation>Lås databasen</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 inte låsa databasen eftersom du håller på att redigera den.
Tryck avbryt för att ansluta dina ändringar alternativt kasta dem.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Databasen has aldrig sparats.
Spara databasen eller sluta lås den.</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>Databasen har ändrats.
Vill du spara databasen innen du låser den?
I annat fall försvinner ändringarna.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation>&quot;%1&quot; är i redigeringsläge.
Kasta ändringarna och stäng endå?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Exportera databasen till en CSV-fil</translation>
</message>
<message>
<source>CSV file</source>
<translation>CSV-fil</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Kunde inte skriva till CSV-filen</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>Databasen du försöker spara som är låst av en annan instans av KeePassX.
Vill du spara endå?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -313,6 +379,14 @@ Spara ändringarna?</translation>
<source>Current group</source>
<translation>Nuvarande grupp</translation>
</message>
<message>
<source>Error</source>
<translation>Fel</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Kunde inte räkna nu master-nyckeln</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -425,6 +499,10 @@ Spara ändringarna?</translation>
<source>Save</source>
<translation>Spara</translation>
</message>
<message>
<source>Open</source>
<translation>Öppna</translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -576,6 +654,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>Använd standard auto-skriv sekvensen från föräldergruppen</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Ange standard auto-skriv sekvens</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
@@ -724,6 +810,10 @@ Spara ändringarna?</translation>
<source>Root</source>
<translation>Root</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Kunde inte räkna nu master-nyckeln</translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -739,6 +829,17 @@ 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>Kunde inte räkna nu master-nyckeln</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>Main</name>
@@ -759,7 +860,7 @@ Spara ändringarna?</translation>
</message>
<message>
<source>Recent databases</source>
<translation>Senast använda databser</translation>
<translation>Senast använda databaser</translation>
</message>
<message>
<source>Help</source>
@@ -777,10 +878,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 +954,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 +1002,22 @@ Spara ändringarna?</translation>
<source>Toggle window</source>
<translation>Visa/dölj fönster</translation>
</message>
<message>
<source>Tools</source>
<translation>Verktyg</translation>
</message>
<message>
<source>Copy username</source>
<translation>Kopiera användarnamn</translation>
</message>
<message>
<source>Copy password</source>
<translation>Kopiera lösenord</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation>Exportera till CSV-fil</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1091,15 +1196,11 @@ Spara ändringarna?</translation>
</message>
<message>
<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>
<translation>Öppna senaste databasen r programmet startar</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Spara automatiskt är applikationen anslutas</translation>
<translation>Spara automatiskt r applikationen anslutas</translation>
</message>
<message>
<source>Automatically save after every change</source>
@@ -1133,6 +1234,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>Komihåg senaste nyckel-filen</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
@@ -1163,14 +1268,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>
@@ -1193,10 +1290,6 @@ Spara ändringarna?</translation>
<source>path to a custom config file</source>
<translation>Sökväg till egen konfigurations-fil</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>lösenord för databasen (FARLIGT!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>nyckel-fil för databas</translation>

File diff suppressed because it is too large Load Diff

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

@@ -9,6 +9,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>KeePassX 使 2 GNU ( 3 )</translation>
</message>
<message>
<source>Revision</source>
<translation></translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -109,6 +113,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 +248,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 +277,60 @@ 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>&quot;%1&quot;
</translation>
</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> CSV </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> KeePassX
</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -311,6 +374,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 +494,10 @@ Save changes?</source>
<source>Save</source>
<translation></translation>
</message>
<message>
<source>Open</source>
<translation></translation>
</message>
</context>
<context>
<name>EditEntryWidgetAutoType</name>
@@ -574,6 +649,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 +805,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 +824,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 +866,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 +942,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 +990,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>
@@ -1091,10 +1186,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 +1222,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 +1256,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>
@@ -1191,10 +1278,6 @@ Save changes?</source>
<source>path to a custom config file</source>
<translation></translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>()</translation>
</message>
<message>
<source>key file of the database</source>
<translation></translation>

View File

@@ -78,6 +78,7 @@ set(keepassx_SOURCES
format/KeePass2.h
format/KeePass2RandomStream.cpp
format/KeePass2Reader.cpp
format/KeePass2Repair.cpp
format/KeePass2Writer.cpp
format/KeePass2XmlReader.cpp
format/KeePass2XmlWriter.cpp
@@ -86,6 +87,7 @@ set(keepassx_SOURCES
gui/ChangeMasterKeyWidget.cpp
gui/Clipboard.cpp
gui/DatabaseOpenWidget.cpp
gui/DatabaseRepairWidget.cpp
gui/DatabaseSettingsWidget.cpp
gui/DatabaseTabWidget.cpp
gui/DatabaseWidget.cpp
@@ -180,6 +182,7 @@ set(keepassx_MOC
gui/ChangeMasterKeyWidget.h
gui/Clipboard.h
gui/DatabaseOpenWidget.h
gui/DatabaseRepairWidget.h
gui/DatabaseSettingsWidget.h
gui/DatabaseTabWidget.h
gui/DatabaseWidget.h

View File

@@ -79,9 +79,16 @@ void AutoType::loadPlugin(const QString& pluginPath)
QObject* pluginInstance = m_pluginLoader->instance();
if (pluginInstance) {
m_plugin = qobject_cast<AutoTypePlatformInterface*>(pluginInstance);
m_executor = Q_NULLPTR;
if (m_plugin) {
m_executor = m_plugin->createExecutor();
connect(pluginInstance, SIGNAL(globalShortcutTriggered()), SIGNAL(globalShortcutTriggered()));
if (m_plugin->isAvailable()) {
m_executor = m_plugin->createExecutor();
connect(pluginInstance, SIGNAL(globalShortcutTriggered()), SIGNAL(globalShortcutTriggered()));
}
else {
unloadPlugin();
}
}
}
@@ -218,6 +225,8 @@ void AutoType::performAutoTypeFromGlobal(Entry* entry, const QString& sequence)
{
Q_ASSERT(m_inAutoType);
m_plugin->raiseWindow(m_windowFromGlobal);
m_inAutoType = false;
performAutoType(entry, Q_NULLPTR, sequence, m_windowFromGlobal);
}
@@ -566,7 +575,7 @@ bool AutoType::windowMatches(const QString& windowTitle, const QString& windowPa
{
if (windowPattern.startsWith("//") && windowPattern.endsWith("//") && windowPattern.size() >= 4) {
QRegExp regExp(windowPattern.mid(2, windowPattern.size() - 4), Qt::CaseInsensitive, QRegExp::RegExp2);
return regExp.exactMatch(windowTitle);
return (regExp.indexIn(windowTitle) != -1);
}
else {
return WildcardMatcher(windowTitle).match(windowPattern);

View File

@@ -26,6 +26,7 @@ class AutoTypePlatformInterface
{
public:
virtual ~AutoTypePlatformInterface() {}
virtual bool isAvailable() = 0;
virtual QStringList windowTitles() = 0;
virtual WId activeWindow() = 0;
virtual QString activeWindowTitle() = 0;
@@ -33,6 +34,7 @@ public:
virtual void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) = 0;
virtual int platformEventFilter(void* event) = 0;
virtual int initialTimeout() = 0;
virtual bool raiseWindow(WId window) = 0;
virtual void unload() {}
virtual AutoTypeExecutor* createExecutor() = 0;

View File

@@ -33,6 +33,8 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
, m_entryActivatedEmitted(false)
{
setAttribute(Qt::WA_DeleteOnClose);
// Places the window on the active (virtual) desktop instead of where the main window is.
setAttribute(Qt::WA_X11BypassTransientForHint);
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
setWindowTitle(tr("Auto-Type - KeePassX"));
setWindowIcon(filePath()->applicationIcon());
@@ -41,7 +43,7 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
resize(size);
// move dialog to the center of the screen
QPoint screenCenter = QApplication::desktop()->screenGeometry(QCursor::pos()).center();
QPoint screenCenter = QApplication::desktop()->availableGeometry(QCursor::pos()).center();
move(screenCenter.x() - (size.width() / 2), screenCenter.y() - (size.height() / 2));
QVBoxLayout* layout = new QVBoxLayout(this);

View File

@@ -1,10 +1,11 @@
if(Q_WS_X11)
find_package(X11)
if(PRINT_SUMMARY)
add_feature_info(libXi X11_Xi_FOUND "The X11 Xi Protocol library is required for auto-type")
add_feature_info(libXtest X11_XTest_FOUND "The X11 XTEST Protocol library is required for auto-type")
endif()
if(X11_FOUND AND X11_XTest_FOUND)
if(X11_FOUND AND X11_Xi_FOUND AND X11_XTest_FOUND)
add_subdirectory(x11)
endif()
endif()

View File

@@ -17,6 +17,11 @@
#include "AutoTypeTest.h"
bool AutoTypePlatformTest::isAvailable()
{
return true;
}
QString AutoTypePlatformTest::keyToString(Qt::Key key)
{
return QString("[Key0x%1]").arg(key, 0, 16);
@@ -103,6 +108,13 @@ int AutoTypePlatformTest::initialTimeout()
return 0;
}
bool AutoTypePlatformTest::raiseWindow(WId window)
{
Q_UNUSED(window);
return false;
}
AutoTypeExecturorTest::AutoTypeExecturorTest(AutoTypePlatformTest* platform)
: m_platform(platform)
{

View File

@@ -33,22 +33,24 @@ class AutoTypePlatformTest : public QObject,
Q_INTERFACES(AutoTypePlatformInterface AutoTypeTestInterface)
public:
QString keyToString(Qt::Key key);
QString keyToString(Qt::Key key) Q_DECL_OVERRIDE;
QStringList windowTitles();
WId activeWindow();
QString activeWindowTitle();
bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
int platformEventFilter(void* event);
int initialTimeout();
AutoTypeExecutor* createExecutor();
bool isAvailable() Q_DECL_OVERRIDE;
QStringList windowTitles() Q_DECL_OVERRIDE;
WId activeWindow() Q_DECL_OVERRIDE;
QString activeWindowTitle() Q_DECL_OVERRIDE;
bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
int platformEventFilter(void* event) Q_DECL_OVERRIDE;
int initialTimeout() Q_DECL_OVERRIDE;
bool raiseWindow(WId window) Q_DECL_OVERRIDE;
AutoTypeExecutor* createExecutor() Q_DECL_OVERRIDE;
void setActiveWindowTitle(const QString& title);
void setActiveWindowTitle(const QString& title) Q_DECL_OVERRIDE;
QString actionChars();
int actionCount();
void clearActions();
QString actionChars() Q_DECL_OVERRIDE;
int actionCount() Q_DECL_OVERRIDE;
void clearActions() Q_DECL_OVERRIDE;
void addActionChar(AutoTypeChar* action);
void addActionKey(AutoTypeKey* action);
@@ -67,8 +69,8 @@ class AutoTypeExecturorTest : public AutoTypeExecutor
public:
explicit AutoTypeExecturorTest(AutoTypePlatformTest* platform);
void execChar(AutoTypeChar* action);
void execKey(AutoTypeKey* action);
void execChar(AutoTypeChar* action) Q_DECL_OVERRIDE;
void execKey(AutoTypeKey* action) Q_DECL_OVERRIDE;
private:
AutoTypePlatformTest* const m_platform;

View File

@@ -30,11 +30,12 @@ AutoTypePlatformX11::AutoTypePlatformX11()
m_dpy = QX11Info::display();
m_rootWindow = QX11Info::appRootWindow();
m_atomWmState = XInternAtom(m_dpy, "WM_STATE", true);
m_atomWmName = XInternAtom(m_dpy, "WM_NAME", true);
m_atomNetWmName = XInternAtom(m_dpy, "_NET_WM_NAME", true);
m_atomString = XInternAtom(m_dpy, "STRING", true);
m_atomUtf8String = XInternAtom(m_dpy, "UTF8_STRING", true);
m_atomWmState = XInternAtom(m_dpy, "WM_STATE", True);
m_atomWmName = XInternAtom(m_dpy, "WM_NAME", True);
m_atomNetWmName = XInternAtom(m_dpy, "_NET_WM_NAME", True);
m_atomString = XInternAtom(m_dpy, "STRING", True);
m_atomUtf8String = XInternAtom(m_dpy, "UTF8_STRING", True);
m_atomNetActiveWindow = XInternAtom(m_dpy, "_NET_ACTIVE_WINDOW", True);
m_classBlacklist << "desktop_window" << "gnome-panel"; // Gnome
m_classBlacklist << "kdesktop" << "kicker"; // KDE 3
@@ -56,6 +57,31 @@ AutoTypePlatformX11::AutoTypePlatformX11()
updateKeymap();
}
bool AutoTypePlatformX11::isAvailable()
{
int ignore;
if (!XQueryExtension(m_dpy, "XInputExtension", &ignore, &ignore, &ignore)) {
return false;
}
if (!XQueryExtension(m_dpy, "XTEST", &ignore, &ignore, &ignore)) {
return false;
}
if (!m_xkb) {
XkbDescPtr kbd = getKeyboard();
if (!kbd) {
return false;
}
XkbFreeKeyboard(kbd, XkbAllComponentsMask, True);
}
return true;
}
void AutoTypePlatformX11::unload()
{
// Restore the KeyboardMapping to its original state.
@@ -116,12 +142,12 @@ bool AutoTypePlatformX11::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifi
uint nativeModifiers = qtToNativeModifiers(modifiers);
startCatchXErrors();
XGrabKey(m_dpy, keycode, nativeModifiers, m_rootWindow, true, GrabModeAsync, GrabModeAsync);
XGrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask, m_rootWindow, true, GrabModeAsync,
XGrabKey(m_dpy, keycode, nativeModifiers, m_rootWindow, True, GrabModeAsync, GrabModeAsync);
XGrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask, m_rootWindow, True, GrabModeAsync,
GrabModeAsync);
XGrabKey(m_dpy, keycode, nativeModifiers | LockMask, m_rootWindow, true, GrabModeAsync,
XGrabKey(m_dpy, keycode, nativeModifiers | LockMask, m_rootWindow, True, GrabModeAsync,
GrabModeAsync);
XGrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask | LockMask, m_rootWindow, true,
XGrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask | LockMask, m_rootWindow, True,
GrabModeAsync, GrabModeAsync);
stopCatchXErrors();
@@ -160,7 +186,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);
@@ -182,7 +208,7 @@ int AutoTypePlatformX11::platformEventFilter(void* event)
&& m_currentGlobalKey
&& xevent->xkey.keycode == m_currentGlobalKeycode
&& (xevent->xkey.state & m_modifierMask) == m_currentGlobalNativeModifiers
&& !QApplication::focusWidget()
&& (!QApplication::activeWindow() || QApplication::activeWindow()->isMinimized())
&& m_loaded) {
if (xevent->type == KeyPress) {
Q_EMIT globalShortcutTriggered();
@@ -214,7 +240,7 @@ QString AutoTypePlatformX11::windowTitle(Window window, bool useBlacklist)
// the window manager spec says we should read _NET_WM_NAME first, then fall back to WM_NAME
int retVal = XGetWindowProperty(m_dpy, window, m_atomNetWmName, 0, 1000, false, m_atomUtf8String,
int retVal = XGetWindowProperty(m_dpy, window, m_atomNetWmName, 0, 1000, False, m_atomUtf8String,
&type, &format, &nitems, &after, &data);
if ((retVal == 0) && data) {
@@ -337,7 +363,7 @@ bool AutoTypePlatformX11::isTopLevelWindow(Window window)
unsigned long nitems;
unsigned long after;
unsigned char* data = Q_NULLPTR;
int retVal = XGetWindowProperty(m_dpy, window, m_atomWmState, 0, 0, false, AnyPropertyType, &type, &format,
int retVal = XGetWindowProperty(m_dpy, window, m_atomWmState, 0, 0, False, AnyPropertyType, &type, &format,
&nitems, &after, &data);
if (data) {
XFree(data);
@@ -436,21 +462,10 @@ void AutoTypePlatformX11::updateKeymap()
int mod_index, mod_key;
XModifierKeymap *modifiers;
if (m_xkb != NULL) XkbFreeKeyboard(m_xkb, XkbAllComponentsMask, True);
XDeviceInfo* devices;
int num_devices;
XID keyboard_id = XkbUseCoreKbd;
devices = XListInputDevices(m_dpy, &num_devices);
for (int i = 0; i < num_devices; i++) {
if (QString(devices[i].name) == "Virtual core XTEST keyboard") {
keyboard_id = devices[i].id;
break;
}
if (m_xkb) {
XkbFreeKeyboard(m_xkb, XkbAllComponentsMask, True);
}
m_xkb = XkbGetKeyboard(m_dpy, XkbCompatMapMask | XkbGeometryMask, keyboard_id);
m_xkb = getKeyboard();
XDisplayKeycodes(m_dpy, &m_minKeycode, &m_maxKeycode);
if (m_keysymTable != NULL) XFree(m_keysymTable);
@@ -519,7 +534,7 @@ void AutoTypePlatformX11::stopCatchXErrors()
{
Q_ASSERT(m_catchXErrors);
XSync(m_dpy, false);
XSync(m_dpy, False);
XSetErrorHandler(m_oldXErrorHandler);
m_catchXErrors = false;
}
@@ -536,6 +551,27 @@ int AutoTypePlatformX11::x11ErrorHandler(Display* display, XErrorEvent* error)
return 1;
}
XkbDescPtr AutoTypePlatformX11::getKeyboard()
{
int num_devices;
XID keyboard_id = XkbUseCoreKbd;
XDeviceInfo* devices = XListInputDevices(m_dpy, &num_devices);
if (!devices) {
return Q_NULLPTR;
}
for (int i = 0; i < num_devices; i++) {
if (QString(devices[i].name) == "Virtual core XTEST keyboard") {
keyboard_id = devices[i].id;
break;
}
}
XFreeDeviceList(devices);
return XkbGetKeyboard(m_dpy, XkbCompatMapMask | XkbGeometryMask, keyboard_id);
}
// --------------------------------------------------------------------------
// The following code is taken from xvkbd 3.0 and has been slightly modified.
// --------------------------------------------------------------------------
@@ -568,11 +604,18 @@ int AutoTypePlatformX11::AddKeysym(KeySym keysym)
*/
void AutoTypePlatformX11::SendEvent(XKeyEvent* event, int event_type)
{
XSync(event->display, FALSE);
XSync(event->display, False);
int (*oldHandler) (Display*, XErrorEvent*) = XSetErrorHandler(MyErrorHandler);
event->type = event_type;
XTestFakeKeyEvent(event->display, event->keycode, event->type == KeyPress, 0);
Bool press;
if (event->type == KeyPress) {
press = True;
}
else {
press = False;
}
XTestFakeKeyEvent(event->display, event->keycode, press, 0);
XFlush(event->display);
XSetErrorHandler(oldHandler);
@@ -770,4 +813,38 @@ int AutoTypePlatformX11::initialTimeout()
return 500;
}
bool AutoTypePlatformX11::raiseWindow(WId window)
{
if (m_atomNetActiveWindow == None) {
return false;
}
XRaiseWindow(m_dpy, window);
XEvent event;
event.xclient.type = ClientMessage;
event.xclient.serial = 0;
event.xclient.send_event = True;
event.xclient.window = window;
event.xclient.message_type = m_atomNetActiveWindow;
event.xclient.format = 32;
event.xclient.data.l[0] = 1; // FromApplication
event.xclient.data.l[1] = QX11Info::appUserTime();
QWidget* activeWindow = QApplication::activeWindow();
if (activeWindow) {
event.xclient.data.l[2] = activeWindow->internalWinId();
}
else {
event.xclient.data.l[2] = 0;
}
event.xclient.data.l[3] = 0;
event.xclient.data.l[4] = 0;
XSendEvent(m_dpy, m_rootWindow, False,
SubstructureRedirectMask | SubstructureNotifyMask,
&event);
XFlush(m_dpy);
return true;
}
Q_EXPORT_PLUGIN2(keepassx-autotype-x11, AutoTypePlatformX11)

View File

@@ -42,15 +42,17 @@ class AutoTypePlatformX11 : public QObject, public AutoTypePlatformInterface
public:
AutoTypePlatformX11();
bool isAvailable() Q_DECL_OVERRIDE;
void unload() Q_DECL_OVERRIDE;
QStringList windowTitles();
WId activeWindow();
QString activeWindowTitle();
bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
int platformEventFilter(void* event);
int initialTimeout();
AutoTypeExecutor* createExecutor();
QStringList windowTitles() Q_DECL_OVERRIDE;
WId activeWindow() Q_DECL_OVERRIDE;
QString activeWindowTitle() Q_DECL_OVERRIDE;
bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
int platformEventFilter(void* event) Q_DECL_OVERRIDE;
int initialTimeout() Q_DECL_OVERRIDE;
bool raiseWindow(WId window) Q_DECL_OVERRIDE;
AutoTypeExecutor* createExecutor() Q_DECL_OVERRIDE;
KeySym charToKeySym(const QChar& ch);
KeySym keyToKeySym(Qt::Key key);
@@ -71,6 +73,7 @@ private:
void stopCatchXErrors();
static int x11ErrorHandler(Display* display, XErrorEvent* error);
XkbDescPtr getKeyboard();
void updateKeymap();
bool isRemapKeycodeValid();
int AddKeysym(KeySym keysym);
@@ -89,6 +92,7 @@ private:
Atom m_atomNetWmName;
Atom m_atomString;
Atom m_atomUtf8String;
Atom m_atomNetActiveWindow;
QSet<QString> m_classBlacklist;
Qt::Key m_currentGlobalKey;
Qt::KeyboardModifiers m_currentGlobalModifiers;
@@ -120,8 +124,8 @@ class AutoTypeExecturorX11 : public AutoTypeExecutor
public:
explicit AutoTypeExecturorX11(AutoTypePlatformX11* platform);
void execChar(AutoTypeChar* action);
void execKey(AutoTypeKey* action);
void execChar(AutoTypeChar* action) Q_DECL_OVERRIDE;
void execKey(AutoTypeKey* action) Q_DECL_OVERRIDE;
private:
AutoTypePlatformX11* const m_platform;

View File

@@ -11,7 +11,7 @@ set(autotype_X11_MOC
qt4_wrap_cpp(autotype_X11_SOURCES ${autotype_X11_MOC})
add_library(keepassx-autotype-x11 MODULE ${autotype_X11_SOURCES})
target_link_libraries(keepassx-autotype-x11 ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${X11_X11_LIB} ${X11_XTest_LIB})
target_link_libraries(keepassx-autotype-x11 ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
install(TARGETS keepassx-autotype-x11
BUNDLE DESTINATION . COMPONENT Runtime
LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)

View File

@@ -114,13 +114,25 @@ QPixmap Entry::iconPixmap() const
else {
Q_ASSERT(database());
QPixmap pixmap;
if (database() && !QPixmapCache::find(m_pixmapCacheKey, &pixmap)) {
pixmap = QPixmap::fromImage(database()->metadata()->customIcon(m_data.customIcon));
m_pixmapCacheKey = QPixmapCache::insert(pixmap);
if (database()) {
return database()->metadata()->customIconPixmap(m_data.customIcon);
}
else {
return QPixmap();
}
}
}
return pixmap;
QPixmap Entry::iconScaledPixmap() const
{
if (m_data.customIcon.isNull()) {
// built-in icons are 16x16 so don't need to be scaled
return databaseIcons()->iconPixmap(m_data.iconNumber);
}
else {
Q_ASSERT(database());
return database()->metadata()->customIconScaledPixmap(m_data.customIcon);
}
}
@@ -248,8 +260,6 @@ void Entry::setIcon(int iconNumber)
m_data.iconNumber = iconNumber;
m_data.customIcon = Uuid();
m_pixmapCacheKey = QPixmapCache::Key();
Q_EMIT modified();
emitDataChanged();
}
@@ -263,8 +273,6 @@ void Entry::setIcon(const Uuid& uuid)
m_data.customIcon = uuid;
m_data.iconNumber = 0;
m_pixmapCacheKey = QPixmapCache::Key();
Q_EMIT modified();
emitDataChanged();
}

View File

@@ -22,7 +22,6 @@
#include <QImage>
#include <QMap>
#include <QPixmap>
#include <QPixmapCache>
#include <QPointer>
#include <QSet>
#include <QUrl>
@@ -61,6 +60,7 @@ public:
Uuid uuid() const;
QImage icon() const;
QPixmap iconPixmap() const;
QPixmap iconScaledPixmap() const;
int iconNumber() const;
Uuid iconUuid() const;
QColor foregroundColor() const;
@@ -169,7 +169,6 @@ private:
Entry* m_tmpHistoryItem;
bool m_modifiedSinceBegin;
QPointer<Group> m_group;
mutable QPixmapCache::Key m_pixmapCacheKey;
bool m_updateTimeinfo;
};

View File

@@ -113,7 +113,7 @@ QIcon FilePath::icon(const QString& category, const QString& name, bool fromThem
icon.addFile(filename, QSize(size, size));
}
}
filename = QString("%1/icons/application/scalable/%3.svgz").arg(m_dataPath, combinedName);
filename = QString("%1/icons/application/scalable/%2.svgz").arg(m_dataPath, combinedName);
if (QFile::exists(filename)) {
icon.addFile(filename);
}
@@ -158,7 +158,7 @@ QIcon FilePath::onOffIcon(const QString& category, const QString& name)
icon.addFile(filename, QSize(size, size), QIcon::Normal, state);
}
}
filename = QString("%1/icons/application/scalable/%3-%4.svgz").arg(m_dataPath, combinedName, stateName);
filename = QString("%1/icons/application/scalable/%2-%3.svgz").arg(m_dataPath, combinedName, stateName);
if (QFile::exists(filename)) {
icon.addFile(filename, QSize(), QIcon::Normal, state);
}

View File

@@ -134,13 +134,30 @@ QPixmap Group::iconPixmap() const
else {
Q_ASSERT(m_db);
QPixmap pixmap;
if (m_db && !QPixmapCache::find(m_pixmapCacheKey, &pixmap)) {
pixmap = QPixmap::fromImage(m_db->metadata()->customIcon(m_data.customIcon));
m_pixmapCacheKey = QPixmapCache::insert(pixmap);
if (m_db) {
return m_db->metadata()->customIconPixmap(m_data.customIcon);
}
else {
return QPixmap();
}
}
}
return pixmap;
QPixmap Group::iconScaledPixmap() const
{
if (m_data.customIcon.isNull()) {
// built-in icons are 16x16 so don't need to be scaled
return databaseIcons()->iconPixmap(m_data.iconNumber);
}
else {
Q_ASSERT(m_db);
if (m_db) {
return m_db->metadata()->customIconScaledPixmap(m_data.customIcon);
}
else {
return QPixmap();
}
}
}
@@ -214,8 +231,6 @@ void Group::setIcon(int iconNumber)
m_data.iconNumber = iconNumber;
m_data.customIcon = Uuid();
m_pixmapCacheKey = QPixmapCache::Key();
updateTimeinfo();
Q_EMIT modified();
Q_EMIT dataChanged(this);
@@ -230,8 +245,6 @@ void Group::setIcon(const Uuid& uuid)
m_data.customIcon = uuid;
m_data.iconNumber = 0;
m_pixmapCacheKey = QPixmapCache::Key();
updateTimeinfo();
Q_EMIT modified();
Q_EMIT dataChanged(this);

View File

@@ -58,6 +58,7 @@ public:
QString notes() const;
QImage icon() const;
QPixmap iconPixmap() const;
QPixmap iconScaledPixmap() const;
int iconNumber() const;
Uuid iconUuid() const;
TimeInfo timeInfo() const;
@@ -155,7 +156,6 @@ private:
QList<Entry*> m_entries;
QPointer<Group> m_parent;
mutable QPixmapCache::Key m_pixmapCacheKey;
bool m_updateTimeinfo;

View File

@@ -167,6 +167,43 @@ QImage Metadata::customIcon(const Uuid& uuid) const
return m_customIcons.value(uuid);
}
QPixmap Metadata::customIconPixmap(const Uuid& uuid) const
{
QPixmap pixmap;
if (!m_customIcons.contains(uuid)) {
return pixmap;
}
QPixmapCache::Key& cacheKey = m_customIconCacheKeys[uuid];
if (!QPixmapCache::find(cacheKey, &pixmap)) {
pixmap = QPixmap::fromImage(m_customIcons.value(uuid));
cacheKey = QPixmapCache::insert(pixmap);
}
return pixmap;
}
QPixmap Metadata::customIconScaledPixmap(const Uuid& uuid) const
{
QPixmap pixmap;
if (!m_customIcons.contains(uuid)) {
return pixmap;
}
QPixmapCache::Key& cacheKey = m_customIconScaledCacheKeys[uuid];
if (!QPixmapCache::find(cacheKey, &pixmap)) {
QImage image = m_customIcons.value(uuid).scaled(16, 16, Qt::KeepAspectRatio, Qt::SmoothTransformation);
pixmap = QPixmap::fromImage(image);
cacheKey = QPixmapCache::insert(pixmap);
}
return pixmap;
}
bool Metadata::containsCustomIcon(const Uuid& uuid) const
{
return m_customIcons.contains(uuid);
@@ -177,6 +214,17 @@ QHash<Uuid, QImage> Metadata::customIcons() const
return m_customIcons;
}
QHash<Uuid, QPixmap> Metadata::customIconsScaledPixmaps() const
{
QHash<Uuid, QPixmap> result;
Q_FOREACH (const Uuid& uuid, m_customIconsOrder) {
result.insert(uuid, customIconScaledPixmap(uuid));
}
return result;
}
QList<Uuid> Metadata::customIconsOrder() const
{
return m_customIconsOrder;
@@ -338,6 +386,9 @@ void Metadata::addCustomIcon(const Uuid& uuid, const QImage& icon)
Q_ASSERT(!m_customIcons.contains(uuid));
m_customIcons.insert(uuid, icon);
// reset cache in case there is also an icon with that uuid
m_customIconCacheKeys[uuid] = QPixmapCache::Key();
m_customIconScaledCacheKeys[uuid] = QPixmapCache::Key();
m_customIconsOrder.append(uuid);
Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count());
Q_EMIT modified();
@@ -365,6 +416,10 @@ void Metadata::removeCustomIcon(const Uuid& uuid)
Q_ASSERT(m_customIcons.contains(uuid));
m_customIcons.remove(uuid);
QPixmapCache::remove(m_customIconCacheKeys.value(uuid));
m_customIconCacheKeys.remove(uuid);
QPixmapCache::remove(m_customIconScaledCacheKeys.value(uuid));
m_customIconScaledCacheKeys.remove(uuid);
m_customIconsOrder.removeAll(uuid);
Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count());
Q_EMIT modified();

View File

@@ -22,6 +22,8 @@
#include <QDateTime>
#include <QHash>
#include <QImage>
#include <QPixmap>
#include <QPixmapCache>
#include <QPointer>
#include "core/Global.h"
@@ -78,10 +80,13 @@ public:
bool protectNotes() const;
// bool autoEnableVisualHiding() const;
QImage customIcon(const Uuid& uuid) const;
QPixmap customIconPixmap(const Uuid& uuid) const;
QPixmap customIconScaledPixmap(const Uuid& uuid) const;
bool containsCustomIcon(const Uuid& uuid) const;
QHash<Uuid, QImage> customIcons() const;
QList<Uuid> customIconsOrder() const;
bool recycleBinEnabled() const;
QHash<Uuid, QPixmap> customIconsScaledPixmaps() const;
Group* recycleBin();
const Group* recycleBin() const;
QDateTime recycleBinChanged() const;
@@ -153,6 +158,8 @@ private:
MetadataData m_data;
QHash<Uuid, QImage> m_customIcons;
mutable QHash<Uuid, QPixmapCache::Key> m_customIconCacheKeys;
mutable QHash<Uuid, QPixmapCache::Key> m_customIconScaledCacheKeys;
QList<Uuid> m_customIconsOrder;
QPointer<Group> m_recycleBin;

View File

@@ -30,7 +30,7 @@
#endif
#ifdef Q_OS_WIN
#include <windows.h> // for Sleep()
#include <windows.h> // for Sleep(), SetDllDirectoryA() and SetSearchPathMode()
#endif
#ifdef Q_OS_UNIX
@@ -160,6 +160,16 @@ bool isHex(const QByteArray& ba)
return true;
}
bool isBase64(const QByteArray& ba)
{
QRegExp regexp("^(?:[a-z0-9+/]{4})*(?:[a-z0-9+/]{3}=|[a-z0-9+/]{2}==)?$",
Qt::CaseInsensitive, QRegExp::RegExp2);
QString base64 = QString::fromLatin1(ba.constData(), ba.size());
return regexp.exactMatch(base64);
}
void sleep(int ms)
{
Q_ASSERT(ms >= 0);
@@ -249,4 +259,13 @@ void disableCoreDumps()
}
}
void setupSearchPaths()
{
#ifdef Q_OS_WIN
// Make sure Windows doesn't load DLLs from the current working directory
SetDllDirectoryA("");
SetSearchPathMode(BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE);
#endif
}
} // namespace Tools

View File

@@ -35,10 +35,12 @@ bool readAllFromDevice(QIODevice* device, QByteArray& data);
QDateTime currentDateTimeUtc();
QString imageReaderFilter();
bool isHex(const QByteArray& ba);
bool isBase64(const QByteArray& ba);
void sleep(int ms);
void wait(int ms);
QString platform();
void disableCoreDumps();
void setupSearchPaths();
} // namespace Tools

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

@@ -27,6 +27,7 @@
bool Crypto::m_initalized(false);
QString Crypto::m_errorStr;
QString Crypto::m_backendVersion;
#if !defined(GCRYPT_VERSION_NUMBER) || (GCRYPT_VERSION_NUMBER < 0x010600)
static int gcry_qt_mutex_init(void** p_sys)
@@ -80,7 +81,7 @@ bool Crypto::init()
#if !defined(GCRYPT_VERSION_NUMBER) || (GCRYPT_VERSION_NUMBER < 0x010600)
gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_qt);
#endif
gcry_check_version(0);
m_backendVersion = QString::fromLocal8Bit(gcry_check_version(0));
gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
if (!checkAlgorithms()) {
@@ -108,6 +109,11 @@ QString Crypto::errorString()
return m_errorStr;
}
QString Crypto::backendVersion()
{
return QString("libgcrypt ").append(m_backendVersion);
}
bool Crypto::backendSelfTest()
{
return (gcry_control(GCRYCTL_SELFTEST) == 0);

View File

@@ -29,6 +29,7 @@ public:
static bool initalized();
static bool backendSelfTest();
static QString errorString();
static QString backendVersion();
private:
Crypto();
@@ -43,6 +44,7 @@ private:
static bool m_initalized;
static QString m_errorStr;
static QString m_backendVersion;
};
#endif // KEEPASSX_CRYPTO_H

View File

@@ -901,10 +901,10 @@ bool KeePass1Reader::parseCustomIcons4(const QByteArray& data)
QByteArray entryUuid = data.mid(pos, 16);
pos += 16;
int iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
quint32 iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
pos += 4;
if (m_entryUuids.contains(entryUuid) && (iconId < iconUuids.size())) {
if (m_entryUuids.contains(entryUuid) && (iconId < static_cast<quint32>(iconUuids.size()))) {
m_entryUuids[entryUuid]->setIcon(iconUuids[iconId]);
}
}
@@ -917,10 +917,10 @@ bool KeePass1Reader::parseCustomIcons4(const QByteArray& data)
quint32 groupId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
pos += 4;
int iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
quint32 iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
pos += 4;
if (m_groupIds.contains(groupId) && (iconId < iconUuids.size())) {
if (m_groupIds.contains(groupId) && (iconId < static_cast<quint32>(iconUuids.size()))) {
m_groupIds[groupId]->setIcon(iconUuids[iconId]);
}
}

View File

@@ -24,6 +24,7 @@
#include "core/Database.h"
#include "core/Endian.h"
#include "crypto/CryptoHash.h"
#include "format/KeePass1.h"
#include "format/KeePass2.h"
#include "format/KeePass2RandomStream.h"
#include "format/KeePass2XmlReader.h"
@@ -42,7 +43,7 @@ KeePass2Reader::KeePass2Reader()
{
}
Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& key)
Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase)
{
QScopedPointer<Database> db(new Database());
m_db = db.data();
@@ -70,7 +71,14 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
}
quint32 signature2 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok);
if (!ok || signature2 != KeePass2::SIGNATURE_2) {
if (ok && signature2 == KeePass1::SIGNATURE_2) {
raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n"
"You can import it by clicking on Database > 'Import KeePass 1 database'.\n"
"This is a one-way migration. You won't be able to open the imported "
"database with the old KeePassX 0.4 version."));
return Q_NULLPTR;
}
else if (!ok || signature2 != KeePass2::SIGNATURE_2) {
raiseError(tr("Not a KeePass database."));
return Q_NULLPTR;
}
@@ -170,7 +178,12 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
if (xmlReader.hasError()) {
raiseError(xmlReader.errorString());
return Q_NULLPTR;
if (keepDatabase) {
return db.take();
}
else {
return Q_NULLPTR;
}
}
Q_ASSERT(version < 0x00030001 || !xmlReader.headerHash().isEmpty());
@@ -224,6 +237,11 @@ QByteArray KeePass2Reader::xmlData()
return m_xmlData;
}
QByteArray KeePass2Reader::streamKey()
{
return m_protectedStreamKey;
}
void KeePass2Reader::raiseError(const QString& errorMessage)
{
m_error = true;

View File

@@ -31,12 +31,13 @@ class KeePass2Reader
public:
KeePass2Reader();
Database* readDatabase(QIODevice* device, const CompositeKey& key);
Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false);
Database* readDatabase(const QString& filename, const CompositeKey& key);
bool hasError();
QString errorString();
void setSaveXml(bool save);
QByteArray xmlData();
QByteArray streamKey();
private:
void raiseError(const QString& errorMessage);

View File

@@ -0,0 +1,107 @@
/*
* Copyright (C) 2016 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 "KeePass2Repair.h"
#include <QBuffer>
#include <QRegExp>
#include "format/KeePass2RandomStream.h"
#include "format/KeePass2Reader.h"
#include "format/KeePass2XmlReader.h"
KeePass2Repair::KeePass2Repair()
: m_db(Q_NULLPTR)
{
}
KeePass2Repair::RepairResult KeePass2Repair::repairDatabase(QIODevice* device, const CompositeKey& key)
{
m_db = Q_NULLPTR;
m_errorStr.clear();
KeePass2Reader reader;
reader.setSaveXml(true);
Database* db = reader.readDatabase(device, key, true);
if (!reader.hasError()) {
delete db;
return NothingTodo;
}
QByteArray xmlData = reader.xmlData();
if (!db || xmlData.isEmpty()) {
delete db;
m_errorStr = reader.errorString();
return UnableToOpen;
}
bool repairAction = false;
QString xmlStart = QString::fromLatin1(xmlData.constData(), qMin(100, xmlData.size()));
QRegExp encodingRegExp("encoding=\"([^\"]+)\"", Qt::CaseInsensitive, QRegExp::RegExp2);
if (encodingRegExp.indexIn(xmlStart) != -1) {
if (encodingRegExp.cap(1).compare("utf-8", Qt::CaseInsensitive) != 0
&& encodingRegExp.cap(1).compare("utf8", Qt::CaseInsensitive) != 0)
{
// database is not utf-8 encoded, we don't support repairing that
delete db;
return RepairFailed;
}
}
// try to fix broken databases because of bug #392
for (int i = (xmlData.size() - 1); i >= 0; i--) {
char ch = xmlData.at(i);
if (ch < 0x20 && ch != 0x09 && ch != 0x0A && ch != 0x0D) {
xmlData.remove(i, 1);
repairAction = true;
}
}
if (!repairAction) {
// we were unable to find the problem
delete db;
return RepairFailed;
}
KeePass2RandomStream randomStream;
randomStream.init(reader.streamKey());
KeePass2XmlReader xmlReader;
QBuffer buffer(&xmlData);
buffer.open(QIODevice::ReadOnly);
xmlReader.readDatabase(&buffer, db, &randomStream);
if (xmlReader.hasError()) {
delete db;
return RepairFailed;
}
else {
m_db = db;
return RepairSuccess;
}
}
Database* KeePass2Repair::database() const
{
return m_db;
}
QString KeePass2Repair::errorString() const
{
return m_errorStr;
}

View File

@@ -0,0 +1,50 @@
/*
* Copyright (C) 2016 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_KEEPASS2REPAIR_H
#define KEEPASSX_KEEPASS2REPAIR_H
#include <QCoreApplication>
#include <QIODevice>
#include "core/Database.h"
#include "keys/CompositeKey.h"
class KeePass2Repair
{
Q_DECLARE_TR_FUNCTIONS(KeePass2Repair)
public:
enum RepairResult
{
NothingTodo,
UnableToOpen,
RepairSuccess,
RepairFailed
};
KeePass2Repair();
RepairResult repairDatabase(QIODevice* device, const CompositeKey& key);
Database* database() const;
QString errorString() const;
private:
Database* m_db;
QString m_errorStr;
};
#endif // KEEPASSX_KEEPASS2REPAIR_H

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

@@ -523,6 +523,7 @@ Group* KeePass2XmlReader::parseGroup()
if (m_strictMode) {
raiseError("Invalid group icon number");
}
iconId = 0;
}
else {
if (iconId >= DatabaseIcons::IconCount) {
@@ -702,6 +703,7 @@ Entry* KeePass2XmlReader::parseEntry(bool history)
if (m_strictMode) {
raiseError("Invalid entry icon number");
}
iconId = 0;
}
else {
entry->setIcon(iconId);

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)
@@ -368,7 +374,7 @@ void KeePass2XmlWriter::writeEntry(const Entry* entry)
}
if (!value.isEmpty()) {
m_xml.writeCharacters(value);
m_xml.writeCharacters(stripInvalidXml10Chars(value));
}
m_xml.writeEndElement();
@@ -439,7 +445,7 @@ void KeePass2XmlWriter::writeString(const QString& qualifiedName, const QString&
m_xml.writeEmptyElement(qualifiedName);
}
else {
m_xml.writeTextElement(qualifiedName, string);
m_xml.writeTextElement(qualifiedName, stripInvalidXml10Chars(string));
}
}
@@ -543,6 +549,23 @@ QString KeePass2XmlWriter::colorPartToString(int value)
return str;
}
QString KeePass2XmlWriter::stripInvalidXml10Chars(QString str)
{
for (int i = str.size() - 1; i >= 0; i--) {
const ushort uc = str.at(i).unicode();
if ((uc < 0x20 && uc != 0x09 && uc != 0x0A && uc != 0x0D)
|| (uc > 0xD7FF && uc < 0xE000)
|| (uc > 0xFFFD))
{
qWarning("Stripping invalid XML 1.0 codepoint %x", uc);
str.remove(i, 1);
}
}
return str;
}
void KeePass2XmlWriter::raiseError(const QString& errorMessage)
{
m_error = true;

View File

@@ -73,6 +73,7 @@ private:
void writeColor(const QString& qualifiedName, const QColor& color);
void writeTriState(const QString& qualifiedName, Group::TriState triState);
QString colorPartToString(int value);
QString stripInvalidXml10Chars(QString str);
void raiseError(const QString& errorMessage);

View File

@@ -21,6 +21,7 @@
#include "config-keepassx.h"
#include "version.h"
#include "core/FilePath.h"
#include "crypto/Crypto.h"
AboutDialog::AboutDialog(QWidget* parent)
: QDialog(parent)
@@ -49,6 +50,12 @@ AboutDialog::AboutDialog(QWidget* parent)
m_ui->label_git->setText(labelText);
}
QString libs = QString("%1\n- Qt %2\n- %3")
.arg(m_ui->label_libs->text())
.arg(QString::fromLocal8Bit(qVersion()))
.arg(Crypto::backendVersion());
m_ui->label_libs->setText(libs);
setAttribute(Qt::WA_DeleteOnClose);
connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(close()));
}

View File

@@ -14,10 +14,20 @@
<string>About KeePassX</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="iconLabel"/>
<widget class="QLabel" name="iconLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="nameLabel">
@@ -36,6 +46,12 @@
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true">&lt;a href=&quot;http://www.keepassx.org/&quot;&gt;http://www.keepassx.org/&lt;/a&gt;</string>
</property>
@@ -46,6 +62,12 @@
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</string>
</property>
@@ -64,6 +86,13 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_libs">
<property name="text">
<string>Using:</string>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">

View File

@@ -24,9 +24,15 @@
Application::Application(int& argc, char** argv)
: QApplication(argc, argv)
, m_mainWindow(Q_NULLPTR)
{
}
void Application::setMainWindow(QWidget* mainWindow)
{
m_mainWindow = mainWindow;
}
bool Application::event(QEvent* event)
{
// Handle Apple QFileOpenEvent from finder (double click on .kdbx file)
@@ -34,6 +40,16 @@ bool Application::event(QEvent* event)
Q_EMIT openFile(static_cast<QFileOpenEvent*>(event)->file());
return true;
}
#ifdef Q_OS_MAC
// restore main window when clicking on the docker icon
else if ((event->type() == QEvent::ApplicationActivate) && m_mainWindow) {
m_mainWindow->ensurePolished();
m_mainWindow->setWindowState(m_mainWindow->windowState() & ~Qt::WindowMinimized);
m_mainWindow->show();
m_mainWindow->raise();
m_mainWindow->activateWindow();
}
#endif
return QApplication::event(event);
}

View File

@@ -29,6 +29,7 @@ class Application : public QApplication
public:
Application(int& argc, char** argv);
void setMainWindow(QWidget* mainWindow);
bool event(QEvent* event) Q_DECL_OVERRIDE;
#ifdef Q_WS_X11
@@ -37,6 +38,9 @@ public:
Q_SIGNALS:
void openFile(const QString& filename);
private:
QWidget* m_mainWindow;
};
#endif // KEEPASSX_APPLICATION_H

View File

@@ -31,7 +31,7 @@ Clipboard::Clipboard(QObject* parent)
{
m_timer->setSingleShot(true);
connect(m_timer, SIGNAL(timeout()), SLOT(clearClipboard()));
connect(qApp, SIGNAL(aboutToQuit()), SLOT(cleanup()));
connect(qApp, SIGNAL(aboutToQuit()), SLOT(clearCopiedText()));
}
void Clipboard::setText(const QString& text)
@@ -52,6 +52,14 @@ void Clipboard::setText(const QString& text)
}
}
void Clipboard::clearCopiedText()
{
if (m_timer->isActive()) {
m_timer->stop();
clearClipboard();
}
}
void Clipboard::clearClipboard()
{
QClipboard* clipboard = QApplication::clipboard();
@@ -73,14 +81,6 @@ void Clipboard::clearClipboard()
m_lastCopied.clear();
}
void Clipboard::cleanup()
{
if (m_timer->isActive()) {
m_timer->stop();
clearClipboard();
}
}
Clipboard* Clipboard::instance()
{
if (!m_instance) {

View File

@@ -33,9 +33,11 @@ public:
static Clipboard* instance();
public Q_SLOTS:
void clearCopiedText();
private Q_SLOTS:
void clearClipboard();
void cleanup();
private:
explicit Clipboard(QObject* parent = Q_NULLPTR);

View File

@@ -49,10 +49,6 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
connect(m_ui->editPassword, SIGNAL(textChanged(QString)), SLOT(activatePassword()));
connect(m_ui->comboKeyFile, SIGNAL(editTextChanged(QString)), SLOT(activateKeyFile()));
connect(m_ui->checkPassword, SIGNAL(toggled(bool)), SLOT(setOkButtonEnabled()));
connect(m_ui->checkKeyFile, SIGNAL(toggled(bool)), SLOT(setOkButtonEnabled()));
connect(m_ui->comboKeyFile, SIGNAL(editTextChanged(QString)), SLOT(setOkButtonEnabled()));
connect(m_ui->buttonBox, SIGNAL(accepted()), SLOT(openDatabase()));
connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(reject()));
}
@@ -75,6 +71,7 @@ void DatabaseOpenWidget::load(const QString& filename)
}
}
m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
m_ui->editPassword->setFocus();
}
@@ -99,9 +96,6 @@ void DatabaseOpenWidget::openDatabase()
{
KeePass2Reader reader;
CompositeKey masterKey = databaseKey();
if (masterKey.isEmpty()) {
return;
}
QFile file(m_filename);
if (!file.open(QIODevice::ReadOnly)) {
@@ -172,14 +166,6 @@ void DatabaseOpenWidget::activateKeyFile()
m_ui->checkKeyFile->setChecked(true);
}
void DatabaseOpenWidget::setOkButtonEnabled()
{
bool enable = m_ui->checkPassword->isChecked()
|| (m_ui->checkKeyFile->isChecked() && !m_ui->comboKeyFile->currentText().isEmpty());
m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(enable);
}
void DatabaseOpenWidget::browseKeyFile()
{
QString filters = QString("%1 (*);;%2 (*.key)").arg(tr("All files"), tr("Key files"));

View File

@@ -54,7 +54,6 @@ protected Q_SLOTS:
private Q_SLOTS:
void activatePassword();
void activateKeyFile();
void setOkButtonEnabled();
void browseKeyFile();
protected:

View File

@@ -0,0 +1,104 @@
/*
* Copyright (C) 2016 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 "DatabaseRepairWidget.h"
#include <QFile>
#include <QFileInfo>
#include "ui_DatabaseOpenWidget.h"
#include "core/Database.h"
#include "core/Metadata.h"
#include "format/KeePass2Repair.h"
#include "gui/MessageBox.h"
#include "keys/FileKey.h"
#include "keys/PasswordKey.h"
DatabaseRepairWidget::DatabaseRepairWidget(QWidget* parent)
: DatabaseOpenWidget(parent)
{
m_ui->labelHeadline->setText(tr("Repair database"));
connect(this, SIGNAL(editFinished(bool)), this, SLOT(processEditFinished(bool)));
}
void DatabaseRepairWidget::openDatabase()
{
CompositeKey masterKey;
if (m_ui->checkPassword->isChecked()) {
masterKey.addKey(PasswordKey(m_ui->editPassword->text()));
}
if (m_ui->checkKeyFile->isChecked()) {
FileKey key;
QString keyFilename = m_ui->comboKeyFile->currentText();
QString errorMsg;
if (!key.load(keyFilename, &errorMsg)) {
MessageBox::warning(this, tr("Error"), tr("Can't open key file").append(":\n").append(errorMsg));
Q_EMIT editFinished(false);
return;
}
masterKey.addKey(key);
}
KeePass2Repair repair;
QFile file(m_filename);
if (!file.open(QIODevice::ReadOnly)) {
// TODO: error message
Q_EMIT editFinished(false);
return;
}
if (m_db) {
delete m_db;
}
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
KeePass2Repair::RepairResult repairResult = repair.repairDatabase(&file, masterKey);
QApplication::restoreOverrideCursor();
switch (repairResult) {
case KeePass2Repair::NothingTodo:
MessageBox::information(this, tr("Error"), tr("Database opened fine. Nothing to do."));
Q_EMIT editFinished(false);
return;
case KeePass2Repair::UnableToOpen:
MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n")
.append(repair.errorString()));
Q_EMIT editFinished(false);
return;
case KeePass2Repair::RepairSuccess:
m_db = repair.database();
MessageBox::warning(this, tr("Success"), tr("The database has been successfully repaired\nYou can now save it."));
Q_EMIT editFinished(true);
return;
case KeePass2Repair::RepairFailed:
MessageBox::warning(this, tr("Error"), tr("Unable to repair the database."));
Q_EMIT editFinished(false);
return;
}
}
void DatabaseRepairWidget::processEditFinished(bool result)
{
if (result) {
Q_EMIT success();
}
else {
Q_EMIT error();
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2016 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_DATABASEREPAIRWIDGET_H
#define KEEPASSX_DATABASEREPAIRWIDGET_H
#include "gui/DatabaseOpenWidget.h"
class DatabaseRepairWidget : public DatabaseOpenWidget
{
Q_OBJECT
public:
explicit DatabaseRepairWidget(QWidget* parent = Q_NULLPTR);
Q_SIGNALS:
void success();
void error();
protected:
void openDatabase() Q_DECL_OVERRIDE;
private Q_SLOTS:
void processEditFinished(bool result);
};
#endif // KEEPASSX_DATABASEREPAIRWIDGET_H

View File

@@ -27,6 +27,7 @@
#include "core/Metadata.h"
#include "core/qsavefile.h"
#include "format/CsvExporter.h"
#include "gui/Clipboard.h"
#include "gui/DatabaseWidget.h"
#include "gui/DatabaseWidgetStateSync.h"
#include "gui/DragTabBar.h"
@@ -295,24 +296,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 +327,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 +375,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 +452,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;
}
@@ -622,6 +633,8 @@ bool DatabaseTabWidget::hasLockableDatabases() const
void DatabaseTabWidget::lockDatabases()
{
clipboard()->clearCopiedText();
for (int i = 0; i < count(); i++) {
DatabaseWidget* dbWidget = static_cast<DatabaseWidget*>(widget(i));
Database* db = databaseFromDatabaseWidget(dbWidget);

View File

@@ -23,6 +23,7 @@
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QKeyEvent>
#include <QSplitter>
#include <QTimer>
#include <QProcess>
@@ -88,6 +89,7 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent)
m_searchUi->closeSearchButton->setShortcut(Qt::Key_Escape);
m_searchWidget->hide();
m_searchUi->caseSensitiveCheckBox->setVisible(false);
m_searchUi->searchEdit->installEventFilter(this);
QVBoxLayout* vLayout = new QVBoxLayout(rightHandSideWidget);
vLayout->setMargin(0);
@@ -889,8 +891,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);
@@ -973,3 +984,34 @@ bool DatabaseWidget::currentEntryHasNotes()
}
return !currentEntry->notes().isEmpty();
}
bool DatabaseWidget::eventFilter(QObject* object, QEvent* event)
{
if (object == m_searchUi->searchEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->matches(QKeySequence::Copy)) {
// If Control+C is pressed in the search edit when no
// text is selected, copy the password of the current
// entry.
Entry* currentEntry = m_entryView->currentEntry();
if (currentEntry && !m_searchUi->searchEdit->hasSelectedText()) {
setClipboardTextAndMinimize(currentEntry->password());
return true;
}
}
else if (keyEvent->matches(QKeySequence::MoveToNextLine)) {
// If Down is pressed at EOL in the search edit, move
// the focus to the entry view.
if (!m_searchUi->searchEdit->hasSelectedText()
&& m_searchUi->searchEdit->cursorPosition() == m_searchUi->searchEdit->text().size()) {
m_entryView->setFocus();
return true;
}
}
}
}
return false;
}

View File

@@ -102,6 +102,9 @@ Q_SIGNALS:
void splitterSizesChanged();
void entryColumnSizesChanged();
protected:
bool eventFilter(QObject* object, QEvent* event) Q_DECL_OVERRIDE;
public Q_SLOTS:
void createEntry();
void cloneEntry();

View File

@@ -98,7 +98,7 @@ void EditWidgetIcons::load(Uuid currentUuid, Database* database, IconStruct icon
m_database = database;
m_currentUuid = currentUuid;
m_customIconModel->setIcons(database->metadata()->customIcons(),
m_customIconModel->setIcons(database->metadata()->customIconsScaledPixmaps(),
database->metadata()->customIconsOrder());
Uuid iconUuid = iconStruct.uuid;
@@ -133,7 +133,7 @@ void EditWidgetIcons::addCustomIcon()
if (!image.isNull()) {
Uuid uuid = Uuid::random();
m_database->metadata()->addCustomIconScaled(uuid, image);
m_customIconModel->setIcons(m_database->metadata()->customIcons(),
m_customIconModel->setIcons(m_database->metadata()->customIconsScaledPixmaps(),
m_database->metadata()->customIconsOrder());
QModelIndex index = m_customIconModel->indexFromUuid(uuid);
m_ui->customIconsView->setCurrentIndex(index);
@@ -183,7 +183,7 @@ void EditWidgetIcons::removeCustomIcon()
}
m_database->metadata()->removeCustomIcon(iconUuid);
m_customIconModel->setIcons(m_database->metadata()->customIcons(),
m_customIconModel->setIcons(m_database->metadata()->customIconsScaledPixmaps(),
m_database->metadata()->customIconsOrder());
if (m_customIconModel->rowCount() > 0) {
m_ui->customIconsView->setCurrentIndex(m_customIconModel->index(0, 0));

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,30 @@ 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)
Q_UNUSED(defaultExtension);
// 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

@@ -54,7 +54,7 @@ CustomIconModel::CustomIconModel(QObject* parent)
{
}
void CustomIconModel::setIcons(const QHash<Uuid, QImage>& icons, const QList<Uuid>& iconsOrder)
void CustomIconModel::setIcons(const QHash<Uuid, QPixmap>& icons, const QList<Uuid>& iconsOrder)
{
beginResetModel();

View File

@@ -19,7 +19,7 @@
#define KEEPASSX_ICONMODELS_H
#include <QAbstractListModel>
#include <QImage>
#include <QPixmap>
#include "core/Global.h"
#include "core/Uuid.h"
@@ -44,12 +44,12 @@ public:
virtual int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
void setIcons(const QHash<Uuid, QImage>& icons, const QList<Uuid>& iconsOrder);
void setIcons(const QHash<Uuid, QPixmap>& icons, const QList<Uuid>& iconsOrder);
Uuid uuidFromIndex(const QModelIndex& index) const;
QModelIndex indexFromUuid(const Uuid& uuid) const;
private:
QHash<Uuid, QImage> m_icons;
QHash<Uuid, QPixmap> m_icons;
QList<Uuid> m_iconsOrder;
};

View File

@@ -20,14 +20,19 @@
#include <QCloseEvent>
#include <QShortcut>
#include <QTimer>
#include "autotype/AutoType.h"
#include "core/Config.h"
#include "core/FilePath.h"
#include "core/InactivityTimer.h"
#include "core/Metadata.h"
#include "format/KeePass2Writer.h"
#include "gui/AboutDialog.h"
#include "gui/DatabaseWidget.h"
#include "gui/DatabaseRepairWidget.h"
#include "gui/FileDialog.h"
#include "gui/MessageBox.h"
const QString MainWindow::BaseWindowTitle = "KeePassX";
@@ -92,9 +97,7 @@ MainWindow::MainWindow()
m_ui->actionEntryOpenUrl->setShortcut(Qt::CTRL + Qt::Key_U);
m_ui->actionEntryCopyURL->setShortcut(Qt::CTRL + Qt::ALT + Qt::Key_U);
#ifdef Q_OS_MAC
new QShortcut(Qt::CTRL + Qt::Key_M, this, SLOT(showMinimized()));
#endif
m_ui->actionDatabaseNew->setIcon(filePath()->icon("actions", "document-new"));
m_ui->actionDatabaseOpen->setIcon(filePath()->icon("actions", "document-open"));
@@ -164,6 +167,8 @@ MainWindow::MainWindow()
SLOT(changeDatabaseSettings()));
connect(m_ui->actionImportKeePass1, SIGNAL(triggered()), m_ui->tabWidget,
SLOT(importKeePass1Database()));
connect(m_ui->actionRepairDatabase, SIGNAL(triggered()), this,
SLOT(repairDatabase()));
connect(m_ui->actionExportCsv, SIGNAL(triggered()), m_ui->tabWidget,
SLOT(exportToCsv()));
connect(m_ui->actionLockDatabases, SIGNAL(triggered()), m_ui->tabWidget,
@@ -367,6 +372,7 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
m_ui->actionDatabaseOpen->setEnabled(inDatabaseTabWidgetOrWelcomeWidget);
m_ui->menuRecentDatabases->setEnabled(inDatabaseTabWidgetOrWelcomeWidget);
m_ui->actionImportKeePass1->setEnabled(inDatabaseTabWidgetOrWelcomeWidget);
m_ui->actionRepairDatabase->setEnabled(inDatabaseTabWidgetOrWelcomeWidget);
m_ui->actionLockDatabases->setEnabled(m_ui->tabWidget->hasLockableDatabases());
}
@@ -447,10 +453,11 @@ void MainWindow::closeEvent(QCloseEvent* event)
void MainWindow::changeEvent(QEvent *event)
{
if ((event->type() == QEvent::WindowStateChange) && isMinimized()
&& isTrayIconEnabled() && config()->get("GUI/MinimizeToTray").toBool())
&& isTrayIconEnabled() && m_trayIcon && m_trayIcon->isVisible()
&& config()->get("GUI/MinimizeToTray").toBool())
{
event->ignore();
hide();
QTimer::singleShot(0, this, SLOT(hide()));
}
else {
QMainWindow::changeEvent(event);
@@ -512,6 +519,7 @@ void MainWindow::updateTrayIcon()
}
else {
if (m_trayIcon) {
m_trayIcon->hide();
delete m_trayIcon;
m_trayIcon = Q_NULLPTR;
}
@@ -575,10 +583,12 @@ void MainWindow::trayIconTriggered(QSystemTrayIcon::ActivationReason reason)
void MainWindow::toggleWindow()
{
if (QApplication::activeWindow() == this) {
if ((QApplication::activeWindow() == this) && isVisible() && !isMinimized()) {
hide();
}
else {
ensurePolished();
setWindowState(windowState() & ~Qt::WindowMinimized);
show();
raise();
activateWindow();
@@ -595,8 +605,43 @@ void MainWindow::lockDatabasesAfterInactivity()
m_ui->tabWidget->lockDatabases();
}
void MainWindow::repairDatabase()
{
QString filter = QString("%1 (*.kdbx);;%2 (*)").arg(tr("KeePass 2 Database"), tr("All files"));
QString fileName = fileDialog()->getOpenFileName(this, tr("Open database"), QString(),
filter);
if (fileName.isEmpty()) {
return;
}
QScopedPointer<QDialog> dialog(new QDialog(this));
DatabaseRepairWidget* dbRepairWidget = new DatabaseRepairWidget(dialog.data());
connect(dbRepairWidget, SIGNAL(success()), dialog.data(), SLOT(accept()));
connect(dbRepairWidget, SIGNAL(error()), dialog.data(), SLOT(reject()));
dbRepairWidget->load(fileName);
if (dialog->exec() == QDialog::Accepted && dbRepairWidget->database()) {
QString saveFileName = fileDialog()->getSaveFileName(this, tr("Save repaired database"), QString(),
tr("KeePass 2 Database").append(" (*.kdbx)"),
Q_NULLPTR, 0, "kdbx");
if (!saveFileName.isEmpty()) {
KeePass2Writer writer;
writer.writeDatabase(saveFileName, dbRepairWidget->database());
if (writer.hasError()) {
MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ writer.errorString());
}
}
}
}
bool MainWindow::isTrayIconEnabled() const
{
#ifdef Q_OS_MAC
// systray not useful on OS X
return false;
#else
return config()->get("GUI/ShowTrayIcon").toBool()
&& QSystemTrayIcon::isSystemTrayAvailable();
#endif
}

View File

@@ -66,6 +66,7 @@ private Q_SLOTS:
void trayIconTriggered(QSystemTrayIcon::ActivationReason reason);
void toggleWindow();
void lockDatabasesAfterInactivity();
void repairDatabase();
private:
static void setShortcut(QAction* action, QKeySequence::StandardKey standard, int fallback = 0);

View File

@@ -121,6 +121,7 @@
<addaction name="separator"/>
<addaction name="actionImportKeePass1"/>
<addaction name="actionExportCsv"/>
<addaction name="actionRepairDatabase"/>
<addaction name="separator"/>
<addaction name="actionQuit"/>
</widget>
@@ -422,6 +423,11 @@
<string>Export to CSV file</string>
</property>
</action>
<action name="actionRepairDatabase">
<property name="text">
<string>Repair database</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View File

@@ -41,6 +41,11 @@ SettingsWidget::SettingsWidget(QWidget* parent)
m_generalUi->autoTypeShortcutWidget->setVisible(autoType()->isAvailable());
m_generalUi->autoTypeShortcutLabel->setVisible(autoType()->isAvailable());
#ifdef Q_OS_MAC
// systray not useful on OS X
m_generalUi->systrayShowCheckBox->setVisible(false);
m_generalUi->systrayMinimizeToTrayCheckBox->setVisible(false);
#endif
connect(this, SIGNAL(accepted()), SLOT(saveSettings()));
connect(this, SIGNAL(rejected()), SLOT(reject()));

View File

@@ -33,5 +33,6 @@ void UnlockDatabaseWidget::clearForms()
m_ui->comboKeyFile->clear();
m_ui->checkPassword->setChecked(false);
m_ui->checkKeyFile->setChecked(false);
m_ui->buttonTogglePassword->setChecked(false);
m_db = Q_NULLPTR;
}

View File

@@ -294,6 +294,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore)
m_mainUi->expireDatePicker->setReadOnly(m_history);
m_mainUi->notesEdit->setReadOnly(m_history);
m_mainUi->tooglePasswordGeneratorButton->setChecked(false);
m_mainUi->tooglePasswordGeneratorButton->setDisabled(m_history);
m_mainUi->passwordGenerator->reset();
m_advancedUi->addAttachmentButton->setEnabled(!m_history);
updateAttachmentButtonsEnabled(m_advancedUi->attachmentsView->currentIndex());
@@ -671,6 +672,14 @@ void EditEntryWidget::openAttachment(const QModelIndex& index)
return;
}
if (!file->flush()) {
MessageBox::warning(this, tr("Error"),
tr("Unable to save the attachment:\n").append(file->errorString()));
return;
}
file->close();
QDesktopServices::openUrl(QUrl::fromLocalFile(file->fileName()));
}

View File

@@ -146,7 +146,7 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const
switch (index.column()) {
case ParentGroup:
if (entry->group()) {
return entry->group()->iconPixmap();
return entry->group()->iconScaledPixmap();
}
break;
case Title:
@@ -154,7 +154,7 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const
return databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex);
}
else {
return entry->iconPixmap();
return entry->iconScaledPixmap();
}
}
}
@@ -239,7 +239,7 @@ QMimeData* EntryModel::mimeData(const QModelIndexList& indexes) const
return Q_NULLPTR;
}
else {
data->setData(mimeTypes().first(), encoded);
data->setData(mimeTypes().at(0), encoded);
return data;
}
}

View File

@@ -136,7 +136,7 @@ QVariant GroupModel::data(const QModelIndex& index, int role) const
return databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex);
}
else {
return group->iconPixmap();
return group->iconScaledPixmap();
}
}
else if (role == Qt::FontRole) {
@@ -357,7 +357,7 @@ QMimeData* GroupModel::mimeData(const QModelIndexList& indexes) const
return Q_NULLPTR;
}
else {
data->setData(mimeTypes().first(), encoded);
data->setData(mimeTypes().at(0), encoded);
return data;
}
}

View File

@@ -35,8 +35,8 @@ public:
QModelIndex index(Group* group) const;
Group* groupFromIndex(const QModelIndex& index) const;
int rowCount(const QModelIndex& parent = QModelIndex()) const;
int columnCount(const QModelIndex& parent = QModelIndex()) const;
int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
QModelIndex parent(const QModelIndex& index) const Q_DECL_OVERRIDE;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;

View File

@@ -49,7 +49,7 @@ private Q_SLOTS:
void modelReset();
protected:
void dragMoveEvent(QDragMoveEvent* event);
void dragMoveEvent(QDragMoveEvent* event) Q_DECL_OVERRIDE;
private:
void recInitExpanded(Group* group);

View File

@@ -211,7 +211,10 @@ QByteArray FileKey::loadXmlKey(QXmlStreamReader& xmlReader)
while (!xmlReader.error() && xmlReader.readNextStartElement()) {
if (xmlReader.name() == "Data") {
// TODO: do we need to enforce a specific data.size()?
data = QByteArray::fromBase64(xmlReader.readElementText().toLatin1());
QByteArray rawData = xmlReader.readElementText().toLatin1();
if (Tools::isBase64(rawData)) {
data = QByteArray::fromBase64(rawData);
}
}
}

View File

@@ -32,6 +32,7 @@ int main(int argc, char** argv)
#ifdef QT_NO_DEBUG
Tools::disableCoreDumps();
#endif
Tools::setupSearchPaths();
Application app(argc, argv);
Application::setApplicationName("keepassx");
@@ -82,6 +83,7 @@ int main(int argc, char** argv)
MainWindow mainWindow;
mainWindow.show();
app.setMainWindow(&mainWindow);
QObject::connect(&app, SIGNAL(openFile(QString)), &mainWindow, SLOT(openDatabase(QString)));

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

@@ -31,8 +31,8 @@ public:
HashedBlockStream(QIODevice* baseDevice, qint32 blockSize);
~HashedBlockStream();
bool reset();
void close();
bool reset() Q_DECL_OVERRIDE;
void close() Q_DECL_OVERRIDE;
protected:
qint64 readData(char* data, qint64 maxSize) Q_DECL_OVERRIDE;

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

@@ -38,7 +38,6 @@ void TestAutoType::initTestCase()
QVERIFY(Crypto::init());
Config::createTempFileInstance();
AutoType::createTestInstance();
config()->set("AutoTypeEntryTitleMatch", false);
config()->set("security/autotypeask", false);
QPluginLoader loader(filePath()->pluginPath("keepassx-autotype-test"));
@@ -56,6 +55,7 @@ void TestAutoType::initTestCase()
void TestAutoType::init()
{
config()->set("AutoTypeEntryTitleMatch", false);
m_test->clearActions();
m_db = new Database();
@@ -64,11 +64,12 @@ void TestAutoType::init()
m_group = new Group();
m_db->setRootGroup(m_group);
AutoTypeAssociations::Association association;
m_entry1 = new Entry();
m_entry1->setGroup(m_group);
m_entry1->setUsername("myuser");
m_entry1->setPassword("mypass");
AutoTypeAssociations::Association association;
association.window = "custom window";
association.sequence = "{username}association{password}";
m_entry1->autoTypeAssociations()->add(association);
@@ -77,6 +78,19 @@ void TestAutoType::init()
m_entry2->setGroup(m_group);
m_entry2->setPassword("myuser");
m_entry2->setTitle("entry title");
m_entry3 = new Entry();
m_entry3->setGroup(m_group);
m_entry3->setPassword("regex");
association.window = "//REGEX1//";
association.sequence = "regex1";
m_entry3->autoTypeAssociations()->add(association);
association.window = "//^REGEX2$//";
association.sequence = "regex2";
m_entry3->autoTypeAssociations()->add(association);
association.window = "//^REGEX3-([rd]\\d){2}$//";
association.sequence = "regex3";
m_entry3->autoTypeAssociations()->add(association);
}
void TestAutoType::cleanup()
@@ -147,12 +161,36 @@ void TestAutoType::testGlobalAutoTypeTitleMatch()
void TestAutoType::testGlobalAutoTypeTitleMatchDisabled()
{
config()->set("AutoTypeEntryTitleMatch", false);
m_test->setActiveWindowTitle("An Entry Title!");
MessageBox::setNextAnswer(QMessageBox::Ok);
m_autoType->performGlobalAutoType(m_dbList);
QCOMPARE(m_test->actionChars(), QString());
}
void TestAutoType::testGlobalAutoTypeRegExp()
{
// substring matches are ok
m_test->setActiveWindowTitle("lorem REGEX1 ipsum");
m_autoType->performGlobalAutoType(m_dbList);
QCOMPARE(m_test->actionChars(), QString("regex1"));
m_test->clearActions();
// should be case-insensitive
m_test->setActiveWindowTitle("lorem regex1 ipsum");
m_autoType->performGlobalAutoType(m_dbList);
QCOMPARE(m_test->actionChars(), QString("regex1"));
m_test->clearActions();
// exact match
m_test->setActiveWindowTitle("REGEX2");
m_autoType->performGlobalAutoType(m_dbList);
QCOMPARE(m_test->actionChars(), QString("regex2"));
m_test->clearActions();
// a bit more complicated regex
m_test->setActiveWindowTitle("REGEX3-R2D2");
m_autoType->performGlobalAutoType(m_dbList);
QCOMPARE(m_test->actionChars(), QString("regex3"));
m_test->clearActions();
}

View File

@@ -43,6 +43,7 @@ private Q_SLOTS:
void testGlobalAutoTypeWithOneMatch();
void testGlobalAutoTypeTitleMatch();
void testGlobalAutoTypeTitleMatchDisabled();
void testGlobalAutoTypeRegExp();
private:
AutoTypePlatformInterface* m_platform;
@@ -53,6 +54,7 @@ private:
Group* m_group;
Entry* m_entry1;
Entry* m_entry2;
Entry* m_entry3;
};
#endif // KEEPASSX_TESTAUTOTYPE_H

View File

@@ -120,6 +120,6 @@ void TestEntry::testClone()
QCOMPARE(entryCloneNone->uuid(), entryOrg->uuid());
QCOMPARE(entryCloneHistory->title(), QString("New Title"));
QCOMPARE(entryCloneHistory->historyItems().size(), 1);
QCOMPARE(entryCloneHistory->historyItems().first()->title(), QString("Original Title"));
QCOMPARE(entryCloneHistory->historyItems().at(0)->title(), QString("Original Title"));
QCOMPARE(entryCloneHistory->timeInfo().creationTime(), entryOrg->timeInfo().creationTime());
}

View File

@@ -210,17 +210,16 @@ void TestEntryModel::testCustomIconModel()
QCOMPARE(model->rowCount(), 0);
QHash<Uuid, QImage> icons;
QHash<Uuid, QPixmap> icons;
QList<Uuid> iconsOrder;
Uuid iconUuid(QByteArray(16, '2'));
QImage icon;
icons.insert(iconUuid, icon);
icons.insert(iconUuid, QPixmap());
iconsOrder << iconUuid;
Uuid iconUuid2(QByteArray(16, '1'));
QImage icon2;
icons.insert(iconUuid2, icon2);
icons.insert(iconUuid2, QPixmap());
iconsOrder << iconUuid2;
model->setIcons(icons, iconsOrder);

Some files were not shown because too many files have changed in this diff Show More