Compare commits

..

37 Commits

Author SHA1 Message Date
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
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
66 changed files with 9853 additions and 459 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,15 @@
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)
=========================

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 2")
set(KEEPASSX_VERSION_NUM "1.9.92")
set(KEEPASSX_VERSION "2.0")
set(KEEPASSX_VERSION_NUM "2.0")
if("${CMAKE_C_COMPILER}" MATCHES "clang$" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_COMPILER_IS_CLANG 1)
@@ -101,20 +100,6 @@ 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")

View File

@@ -9,16 +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 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, kterou se bude samočinně vyplňovat:</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>
@@ -107,7 +111,7 @@
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Nepodařilo se vám zadat heslo tak, aby jeho znění bylo stejné v obou políčkách.</translation>
<translation>Nepodařilo se vám zadat heslo do obou kolonek stejně.</translation>
</message>
<message>
<source>Failed to set key file</source>
@@ -144,7 +148,7 @@
</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>
@@ -183,7 +187,7 @@
</message>
<message>
<source>Use recycle bin:</source>
<translation>Mazat do Koše:</translation>
<translation>Namísto mazání přesouvat do Koše:</translation>
</message>
<message>
<source> MiB</source>
@@ -210,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>
@@ -230,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>
@@ -298,7 +302,7 @@ Pokud chcete změny dokončit, klikněte na Zrušit. V opačném případě změ
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Tato databáze doposud ještě nebyla uložena.
Buď ji můžete uložit, nebo neuzamknout.</translation>
Buď ji můžete uložit, nebo neuzamykat.</translation>
</message>
<message>
<source>This database has been modified.
@@ -306,24 +310,31 @@ Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation>Tato databáze byla upravena.
Chcete ji před uzamčením uložit?
Pokud ne, změny budou ztraceny.</translation>
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 type="unfinished"/>
<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 type="unfinished"/>
<translation>Exportovat databázi do CSV souboru</translation>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
<translation>CSV soubor</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
<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>
@@ -374,7 +385,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Nebylo možné vypočítat hlavní klíč</translation>
<translation>Nepodařilo se spočítat hlavní klíč</translation>
</message>
</context>
<context>
@@ -393,7 +404,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Auto-Type</source>
<translation>Samočinné vyplňování</translation>
<translation>Automatické vyplňování</translation>
</message>
<message>
<source>Properties</source>
@@ -433,7 +444,7 @@ Discard changes and close anyway?</source>
</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>
@@ -442,7 +453,7 @@ Discard changes and close anyway?</source>
<message>
<source>Unable to save the attachment:
</source>
<translation>Přílohu nelze uložit:
<translation>Přílohu se nedaří uložit:
</translation>
</message>
<message>
@@ -497,15 +508,15 @@ Discard changes and close anyway?</source>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
<translation>Zapnout samočinné vyplňování 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>
@@ -618,7 +629,7 @@ Discard changes and close anyway?</source>
</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>
@@ -641,15 +652,15 @@ Discard changes and close anyway?</source>
</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 samočinného vyplňování z nadřazené skupiny</translation>
<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 samočinného vyplňování</translation>
<translation>Nastavit výchozí posloupnost automatického vyplňování</translation>
</message>
</context>
<context>
@@ -660,15 +671,15 @@ Discard changes and close anyway?</source>
</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>
@@ -688,7 +699,7 @@ Discard changes and close anyway?</source>
</message>
<message numerus="yes">
<source>Can&apos;t delete icon. Still used by %n item(s).</source>
<translation><numerusform>Ikonu není možné smazat. Je používána %n položkou.</numerusform><numerusform>Ikonu není možné smazat. Je používána %n položkami.</numerusform><numerusform>Ikonu není možné smazat. Je používána %n položek</numerusform></translation>
<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>
@@ -699,15 +710,15 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Modified:</source>
<translation>Okamžik poslední úpravy:</translation>
<translation>Okamžik minulé úpravy:</translation>
</message>
<message>
<source>Accessed:</source>
<translation>Okamžik posledního přístupu:</translation>
<translation>Okamžik minulého přístupu:</translation>
</message>
<message>
<source>Uuid:</source>
<translation>Jedinečný identifikátor uživatele:</translation>
<translation>Univerzálně jedinečný identifikátor:</translation>
</message>
</context>
<context>
@@ -721,7 +732,7 @@ Discard changes and close anyway?</source>
<name>EntryHistoryModel</name>
<message>
<source>Last modified</source>
<translation>Okamžik poslední změny</translation>
<translation>Okamžik minulé změny</translation>
</message>
<message>
<source>Title</source>
@@ -766,7 +777,7 @@ Discard changes and close anyway?</source>
<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>
@@ -801,7 +812,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Nelze spočítat hlavní klíč</translation>
<translation>Nedaří se spočítat hlavní klíč</translation>
</message>
</context>
<context>
@@ -820,7 +831,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Nelze spočítat hlavní klíč</translation>
<translation>Nedaří se spočítat hlavní klíč</translation>
</message>
</context>
<context>
@@ -926,7 +937,7 @@ Discard changes and close anyway?</source>
</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>
@@ -950,7 +961,7 @@ Discard changes and close anyway?</source>
</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>
@@ -990,15 +1001,15 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
<translation>Zkopírovat uživatelské jméno</translation>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
<translation>Zkopírovat heslo</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
<translation>Exportovat do CSV souboru</translation>
</message>
</context>
<context>
@@ -1056,11 +1067,11 @@ Discard changes and close anyway?</source>
</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>
@@ -1072,7 +1083,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>[options]</source>
<translation>[volby]</translation>
<translation>[předvolby]</translation>
</message>
<message>
<source>Usage: %1</source>
@@ -1080,7 +1091,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Options:</source>
<translation>Volby:</translation>
<translation>Předvolby:</translation>
</message>
<message>
<source>Arguments:</source>
@@ -1110,15 +1121,15 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Error writing to underlying device: </source>
<translation>Při zápisu na zařízení, na kterém se nachází, došlo k chybě:</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>Při otevírání zařízení, na kterém se nachází, došlo k chybě:</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>Při čtení dat ze zařízení, na kterém se nachází, došlo k chybě:</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>
@@ -1182,27 +1193,27 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Před ukončením aplikace provést samočinné uložení případných změn v otevřených databázích</translation>
<translation>Před ukončením 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í atributu do schránky samočinně minimalizovat okno KeePassX (do popředí se tak dostane okno, do kterého se zkopírovaný atribut bude vkládat)</translation>
<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>Klávesová zkratka pro všeobecné 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>
@@ -1210,11 +1221,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Show a system tray icon</source>
<translation>Zobrazit ikonu v oznamovací oblasti hlavního panelu prostředí</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 okno aplikace do oznamovací oblasti hlavního panelu prostředí</translation>
<translation>Minimalizovat okno aplikace do oznamovací oblasti systémového panelu</translation>
</message>
<message>
<source>Remember last key files</source>
@@ -1225,7 +1236,7 @@ Discard changes and close anyway?</source>
<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>
@@ -1241,7 +1252,7 @@ Discard changes and close anyway?</source>
</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>
@@ -1272,10 +1283,6 @@ Discard changes and close anyway?</source>
<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 k databázi (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,16 @@
<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>
</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 +44,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,11 +107,11 @@
</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>
@@ -132,7 +136,7 @@
</message>
<message>
<source>Password:</source>
<translation>Adgangskode:</translation>
<translation>Kodeord:</translation>
</message>
<message>
<source>Browse</source>
@@ -175,7 +179,7 @@
</message>
<message>
<source>Transform rounds:</source>
<translation type="unfinished"/>
<translation>Transformationsrunder:</translation>
</message>
<message>
<source>Default username:</source>
@@ -195,7 +199,7 @@
</message>
<message>
<source>Max. history items:</source>
<translation type="unfinished"/>
<translation>Maks. posthistorik:</translation>
</message>
<message>
<source>Max. history size:</source>
@@ -307,7 +311,8 @@ Ellers mister du dine ændringer.</translation>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
<translation>&quot;%1&quot; er i redigeringstilstand.
Kassér ændringer og luk alligevel?</translation>
</message>
<message>
<source>Export database to CSV file</source>
@@ -321,6 +326,12 @@ Discard changes and close anyway?</source>
<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>
@@ -389,7 +400,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Auto-Type</source>
<translation type="unfinished"/>
<translation>Auto-Indsæt</translation>
</message>
<message>
<source>Properties</source>
@@ -401,7 +412,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Entry history</source>
<translation type="unfinished"/>
<translation>Indtastningshistorik</translation>
</message>
<message>
<source>Add entry</source>
@@ -417,7 +428,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Andre adgangskoder leveret.</translation>
<translation>Andre kodeord leveret.</translation>
</message>
<message>
<source>New attribute</source>
@@ -492,15 +503,15 @@ Discard changes and close anyway?</source>
<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>
@@ -554,7 +565,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Password:</source>
<translation>Adgangskode:</translation>
<translation>Kodeord:</translation>
</message>
<message>
<source>Repeat:</source>
@@ -562,7 +573,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Gen.</source>
<translation type="unfinished"/>
<translation>Generer</translation>
</message>
<message>
<source>URL:</source>
@@ -636,15 +647,15 @@ Discard changes and close anyway?</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 type="unfinished"/>
<translation>Brug standard Auto-Indsæt sekvens fra forældregruppe</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
<translation>Definér standard auto-indsæt sekvens</translation>
</message>
</context>
<context>
@@ -803,7 +814,7 @@ Discard changes and close anyway?</source>
<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>
@@ -937,7 +948,7 @@ Discard changes and close anyway?</source>
</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>
@@ -945,7 +956,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Perform Auto-Type</source>
<translation type="unfinished"/>
<translation>Udfør Auto-indsæt</translation>
</message>
<message>
<source>Open URL</source>
@@ -985,11 +996,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Copy username</source>
<translation>Kopiér adgangskode</translation>
<translation>Kopiér brugernavn</translation>
</message>
<message>
<source>Copy password</source>
<translation>Kopiér adgangskode</translation>
<translation>Kopiér kodeord</translation>
</message>
<message>
<source>Export to CSV file</source>
@@ -1000,7 +1011,7 @@ Discard changes and close anyway?</source>
<name>PasswordGeneratorWidget</name>
<message>
<source>Password:</source>
<translation>Adgangskode:</translation>
<translation>Kodeord:</translation>
</message>
<message>
<source>Length:</source>
@@ -1008,7 +1019,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Character Types</source>
<translation type="unfinished"/>
<translation>Tegntyper</translation>
</message>
<message>
<source>Upper Case Letters</source>
@@ -1032,7 +1043,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Ensure that the password contains characters from every group</source>
<translation>Vær sikker at din adgangskode indeholder tegn fra alle grupper</translation>
<translation>Vær sikker at dit kodeord indeholder tegn fra alle grupper</translation>
</message>
<message>
<source>Accept</source>
@@ -1193,11 +1204,11 @@ Discard changes and close anyway?</source>
</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>
@@ -1232,11 +1243,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Show passwords in cleartext by default</source>
<translation>Vis adgangskoder i klartekst som standard</translation>
<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>
@@ -1257,7 +1268,7 @@ Discard changes and close anyway?</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>
@@ -1267,10 +1278,6 @@ Discard changes and close anyway?</source>
<source>path to a custom config file</source>
<translation>sti til brugerdefineret indstillingsfil</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>adgangskode til databasen (FAARLIGT!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>databasens nøglefil</translation>

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 steht unter der GNU General Public License (GPL) version 2 (version 3).</translation>
</message>
<message>
<source>Revision</source>
<translation>Überarbeitung</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -320,6 +324,12 @@ Discard changes and close anyway?</source>
<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>
@@ -1231,7 +1241,7 @@ Discard changes and close anyway?</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>
@@ -1266,10 +1276,6 @@ Discard changes and close anyway?</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

@@ -15,6 +15,10 @@
<source>Revision</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Using:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -833,6 +837,13 @@ Do you want to save it 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>

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 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>
</context>
<context>
<name>AutoType</name>
@@ -25,7 +29,7 @@
<name>AutoTypeAssociationsModel</name>
<message>
<source>Window</source>
<translation>Fenêtre </translation>
<translation>Fenêtre</translation>
</message>
<message>
<source>Sequence</source>
@@ -187,7 +191,7 @@
</message>
<message>
<source> MiB</source>
<translation>MiB</translation>
<translation> MiB</translation>
</message>
<message>
<source>Benchmark</source>
@@ -226,7 +230,7 @@
</message>
<message>
<source>File not found!</source>
<translation>Fichier introuvable!</translation>
<translation>Fichier introuvable !</translation>
</message>
<message>
<source>Open KeePass 1 database</source>
@@ -260,7 +264,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>
@@ -322,6 +326,12 @@ Ignorer les changements et fermer ?</translation>
<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 é verrouillée par une autre instance de KeePassX.
Voulez-vous quand même la sauvegarder ?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -394,7 +404,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Properties</source>
<translation>Propriétés </translation>
<translation>Propriétés</translation>
</message>
<message>
<source>History</source>
@@ -463,7 +473,7 @@ Ignorer les changements et fermer ?</translation>
<name>EditEntryWidgetAdvanced</name>
<message>
<source>Additional attributes</source>
<translation>Attributs supplémentaires </translation>
<translation>Attributs supplémentaires</translation>
</message>
<message>
<source>Add</source>
@@ -483,7 +493,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Save</source>
<translation>Enregistrer le fichier </translation>
<translation>Enregistrer le fichier</translation>
</message>
<message>
<source>Open</source>
@@ -595,11 +605,11 @@ Ignorer les changements et fermer ?</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>
@@ -1199,7 +1209,7 @@ Ignorer les changements et fermer ?</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 le remplissage automatique 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>
@@ -1226,7 +1236,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source> sec</source>
<translation>s</translation>
<translation> s</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
@@ -1269,10 +1279,6 @@ Ignorer les changements et fermer ?</translation>
<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-clé de la base de données</translation>

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 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>
</context>
<context>
@@ -18,7 +22,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 +55,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>
@@ -91,7 +95,7 @@
</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>
@@ -103,27 +107,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 yang berbeda diberikan.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation type="unfinished"/>
<translation>Gagal menetapkan berkas kunci</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation type="unfinished"/>
<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>
@@ -131,7 +136,7 @@
</message>
<message>
<source>Password:</source>
<translation>Kata sandi:</translation>
<translation>Sandi:</translation>
</message>
<message>
<source>Browse</source>
@@ -143,11 +148,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>
@@ -182,7 +187,7 @@
</message>
<message>
<source>Use recycle bin:</source>
<translation type="unfinished"/>
<translation>Gunakan tong sampah:</translation>
</message>
<message>
<source> MiB</source>
@@ -205,7 +210,7 @@
<name>DatabaseTabWidget</name>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation>Root</translation>
</message>
<message>
<source>KeePass 2 Database</source>
@@ -259,7 +264,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>
@@ -276,44 +281,56 @@ Simpan perubahan?</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>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 type="unfinished"/>
<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 type="unfinished"/>
<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 type="unfinished"/>
<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 type="unfinished"/>
<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 type="unfinished"/>
<translation>&quot;%1&quot; dalam mode penyuntingan.
Tetap buang ubahan dan tutup?</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation type="unfinished"/>
<translation>Ekspor basis data ke berkas CSV</translation>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
<translation>Berkas CSV</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
<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>
@@ -328,7 +345,7 @@ Discard changes and close anyway?</source>
</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>
@@ -336,15 +353,15 @@ Discard changes and close anyway?</source>
</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>
@@ -352,7 +369,7 @@ Discard changes and close anyway?</source>
</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>
@@ -360,11 +377,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Error</source>
<translation type="unfinished"/>
<translation>Galat</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Tidak bisa mengkalkulasi kunci utama</translation>
</message>
</context>
<context>
@@ -395,7 +412,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Entry history</source>
<translation>Entri riwayat</translation>
<translation>Riwayat entri</translation>
</message>
<message>
<source>Add entry</source>
@@ -423,7 +440,7 @@ Discard changes and close anyway?</source>
</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>
@@ -432,7 +449,7 @@ Discard changes and close anyway?</source>
<message>
<source>Unable to save the attachment:
</source>
<translation>Tidak dapat menyimpan lampiran:
<translation>Tidak bisa menyimpan lampiran:
</translation>
</message>
<message>
@@ -441,11 +458,11 @@ Discard changes and close anyway?</source>
</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>
@@ -468,7 +485,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Remove</source>
<translation>Hapus</translation>
<translation>Buang</translation>
</message>
<message>
<source>Attachments</source>
@@ -480,7 +497,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Open</source>
<translation type="unfinished"/>
<translation>Buka</translation>
</message>
</context>
<context>
@@ -491,11 +508,11 @@ Discard changes and close anyway?</source>
</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>
@@ -515,7 +532,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Set custom sequence:</source>
<translation>Tetapkan urutan kustom:</translation>
<translation>Tetapkan urutan ubahsuai:</translation>
</message>
</context>
<context>
@@ -549,7 +566,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Password:</source>
<translation>Kata sandi:</translation>
<translation>Sandi:</translation>
</message>
<message>
<source>Repeat:</source>
@@ -565,7 +582,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Expires</source>
<translation>Kadaluarsa</translation>
<translation>Kedaluwarsa</translation>
</message>
<message>
<source>Presets</source>
@@ -608,7 +625,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Inherit from parent group (%1)</source>
<translation type="unfinished"/>
<translation>Mengikuti grup induk (%1)</translation>
</message>
</context>
<context>
@@ -623,7 +640,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Expires</source>
<translation>Kadaluarsa</translation>
<translation>Kedaluwarsa</translation>
</message>
<message>
<source>Search</source>
@@ -635,11 +652,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
<translation>Gunakan urutan ketik-otomatis baku grup induk</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
<translation>Tetapkan urutan ketik-otomatis baku</translation>
</message>
</context>
<context>
@@ -650,15 +667,15 @@ Discard changes and close anyway?</source>
</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>
@@ -674,11 +691,11 @@ Discard changes and close anyway?</source>
</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>
@@ -749,7 +766,7 @@ Discard changes and close anyway?</source>
<name>Group</name>
<message>
<source>Recycle Bin</source>
<translation type="unfinished"/>
<translation>Tong Sampah</translation>
</message>
</context>
<context>
@@ -764,60 +781,60 @@ Discard changes and close anyway?</source>
</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 type="unfinished"/>
<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 type="unfinished"/>
<translation>Tidak bisa mengkalkulasi kunci utama</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>
@@ -832,7 +849,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Recent databases</source>
<translation type="unfinished"/>
<translation>Basis data baru-baru ini</translation>
</message>
<message>
<source>Help</source>
@@ -852,7 +869,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>View</source>
<translation type="unfinished"/>
<translation>Lihat</translation>
</message>
<message>
<source>Quit</source>
@@ -884,7 +901,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>View/Edit entry</source>
<translation>Tampil/Sunting entri</translation>
<translation>Lihat/Sunting entri</translation>
</message>
<message>
<source>Delete entry</source>
@@ -920,7 +937,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Clone entry</source>
<translation type="unfinished"/>
<translation>Duplikat entri</translation>
</message>
<message>
<source>Find</source>
@@ -932,7 +949,7 @@ Discard changes and close anyway?</source>
</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>
@@ -940,7 +957,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Perform Auto-Type</source>
<translation>Melakukan Ketik-Otomatis</translation>
<translation>Lakukan Ketik-Otomatis</translation>
</message>
<message>
<source>Open URL</source>
@@ -968,34 +985,34 @@ Discard changes and close anyway?</source>
</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 type="unfinished"/>
<translation>Perkakas</translation>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
<translation>Salin nama pengguna</translation>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
<translation>Salin sandi</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
<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>
@@ -1003,15 +1020,15 @@ Discard changes and close anyway?</source>
</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>
@@ -1023,11 +1040,11 @@ Discard changes and close anyway?</source>
</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>
@@ -1038,11 +1055,11 @@ Discard changes and close anyway?</source>
<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>
@@ -1074,29 +1091,29 @@ Discard changes and close anyway?</source>
</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>
@@ -1112,7 +1129,7 @@ Discard changes and close anyway?</source>
</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>
@@ -1134,15 +1151,15 @@ Discard changes and close anyway?</source>
</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>
@@ -1180,7 +1197,7 @@ Discard changes and close anyway?</source>
</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>
@@ -1188,11 +1205,11 @@ Discard changes and close anyway?</source>
</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>
@@ -1200,22 +1217,22 @@ Discard changes and close anyway?</source>
</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 type="unfinished"/>
<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>
@@ -1223,48 +1240,44 @@ Discard changes and close anyway?</source>
</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"/>
<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,15 @@
<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>
</context>
<context>
@@ -68,7 +71,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>Create</source>
@@ -96,7 +99,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,12 +115,12 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Failed to set key file</source>
<translation>Impossibile impostare il file della chiave</translation>
<translation>Impossibile impostare il file chiave</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Impossibile impostare %1 come file della Chiave: %2</translation>
<translation>Impossibile impostare %1 come file Chiave: %2</translation>
</message>
</context>
<context>
@@ -156,11 +159,11 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Key files</source>
<translation>File chiave</translation>
<translation>Files chiave</translation>
</message>
<message>
<source>Select key file</source>
<translation>Selezionare file chiave</translation>
<translation>Seleziona file chiave</translation>
</message>
</context>
<context>
@@ -171,11 +174,11 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Database description:</source>
<translation>Descrizione database:</translation>
<translation>Descrizione del database:</translation>
</message>
<message>
<source>Transform rounds:</source>
<translation>Round di trasformazione:</translation>
<translation>Rounds di trasformazione:</translation>
</message>
<message>
<source>Default username:</source>
@@ -191,7 +194,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 +221,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 +233,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>
@@ -278,7 +281,7 @@ Salvare le modifiche?</translation>
<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>Il Database che stai tentando di aprire è bloccato da un&apos;altra esecuzione di KeePassX.
Vuoi aprire comunque il database? In alternativa, il database è aperto in sola lettura.</translation>
Vuoi aprirlo comunque? In alternativa, il database verrà aperto in sola lettura.</translation>
</message>
<message>
<source>Lock database</source>
@@ -287,14 +290,14 @@ Vuoi aprire comunque il database? In alternativa, il database è aperto in sola
<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>Non è possibile bloccare il database ne modo in cui lo stai modificando.
<translation>Non è possibile bloccare il database nel modo in cui lo stai modificando.
Premere annulla per terminare le modifiche o scartarle .</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>Questo database non è ancora stato salvato.
È possibile salvare il database o interrompere bloccandolo.</translation>
<translation>Questo database non è mai stato salvato.
È possibile salvare il database o interrompere il blocco.</translation>
</message>
<message>
<source>This database has been modified.
@@ -307,7 +310,8 @@ Altrimenti le modifiche verranno perse.</translation>
<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>
<translation>&quot;%1&quot; è in modalità modifica.
Annullare le modifiche e chiudere comunque?</translation>
</message>
<message>
<source>Export database to CSV file</source>
@@ -321,12 +325,18 @@ Discard changes and close anyway?</source>
<source>Writing the CSV file failed.</source>
<translation>Scrittura del file CSV fallita.</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 si sta 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 password principale</translation>
</message>
<message>
<source>Delete entry?</source>
@@ -370,7 +380,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Impossibile calcolare la chiave master</translation>
<translation>Impossibile calcolare la chiave principale</translation>
</message>
</context>
<context>
@@ -425,7 +435,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Select file</source>
<translation>Selezionare file</translation>
<translation>Seleziona file</translation>
</message>
<message>
<source>Unable to open file</source>
@@ -438,7 +448,7 @@ Discard changes and close anyway?</source>
<message>
<source>Unable to save the attachment:
</source>
<translation>Impossibile salvare l&apos;allegato
<translation>Impossibile salvare l&apos;allegato:
</translation>
</message>
<message>
@@ -486,7 +496,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Open</source>
<translation>Apri</translation>
<translation>Aprire</translation>
</message>
</context>
<context>
@@ -575,7 +585,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Presets</source>
<translation>Programmare</translation>
<translation>Presets</translation>
</message>
<message>
<source>Notes:</source>
@@ -598,19 +608,19 @@ Discard changes and close anyway?</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>
@@ -645,7 +655,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Usare sequenza predefinita</translation>
<translation>Usare sequenza auto-type predefinita</translation>
</message>
</context>
<context>
@@ -676,11 +686,11 @@ Discard changes and close anyway?</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>
@@ -755,7 +765,7 @@ Discard changes and close anyway?</source>
<name>Group</name>
<message>
<source>Recycle Bin</source>
<translation>Cestino (Gruppo)</translation>
<translation>Cestino</translation>
</message>
</context>
<context>
@@ -789,11 +799,11 @@ Discard changes and close anyway?</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>
@@ -808,11 +818,11 @@ Discard changes and close anyway?</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>Password errata o file database corrotto.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@@ -850,7 +860,7 @@ Discard changes and close anyway?</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>
@@ -858,7 +868,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>View</source>
<translation>Visualizzare</translation>
<translation>Visualizza</translation>
</message>
<message>
<source>Quit</source>
@@ -970,7 +980,7 @@ Discard changes and close anyway?</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>
@@ -1140,7 +1150,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Case sensitive</source>
<translation>Case sensitive</translation>
<translation>Riconoscimento di maiuscole e minuscole</translation>
</message>
<message>
<source>Current group</source>
@@ -1170,7 +1180,7 @@ Discard changes and close anyway?</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>
@@ -1210,11 +1220,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation>Nascondi la finestra nell&apos;area di notifica del sistema quando viene minimizzatala finestra</translation>
<translation>Nascondi la finestra nell&apos;area di notifica del sistema quando viene minimizzata</translation>
</message>
<message>
<source>Remember last key files</source>
<translation>Ricorda gli ultimi files di chiave</translation>
<translation>Ricorda gli ultimi files chiave</translation>
</message>
</context>
<context>
@@ -1229,7 +1239,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Lock databases after inactivity of</source>
<translation>Bloccare database dopo un&apos;inattività di</translation>
<translation>Bloccare i database dopo un&apos;inattività di</translation>
</message>
<message>
<source>Show passwords in cleartext by default</source>
@@ -1268,10 +1278,6 @@ Discard changes and close anyway?</source>
<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>

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>
@@ -322,6 +326,12 @@ Wijzigingen ongedaan maken en doorgaan met sluiten?</translation>
<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>
@@ -1269,10 +1279,6 @@ Wijzigingen ongedaan maken en doorgaan met sluiten?</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

@@ -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>
@@ -277,7 +281,7 @@ Save changes?</source>
<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>Хранилище, которое Вы хотите открыть, заблокировано другой запущенной копией KeePassX. Всё равно открыть? В качестве альтернативы хранилище будет открыто в режиме для чтения.</translation>
</message>
<message>
<source>Lock database</source>
@@ -297,12 +301,15 @@ You can save the database or stop locking it.</source>
<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>Хранилище было изменено.
Вы хотите сохранить его перед тем, как заблокировать?
В противном случае все изменения будут потеряны.</translation>
</message>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
<translation>&quot;%1&quot; в режиме редактирования.
Отменить изменения и всё равно закрыть?</translation>
</message>
<message>
<source>Export database to CSV file</source>
@@ -314,7 +321,13 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
<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>
@@ -1263,10 +1276,6 @@ Discard changes and close anyway?</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,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 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>
</context>
<context>
<name>AutoType</name>
@@ -111,12 +115,13 @@
</message>
<message>
<source>Failed to set key file</source>
<translation type="unfinished"/>
<translation>Kunde inte sätta nyckel-fil</translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation type="unfinished"/>
<translation>Kunde inte sätta %1 som nyckel-fil:
%2</translation>
</message>
</context>
<context>
@@ -276,44 +281,56 @@ Spara ändringarna?</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>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 type="unfinished"/>
<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 type="unfinished"/>
<translation>Kan inte låsa databasen eftersom du håller 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 type="unfinished"/>
<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 type="unfinished"/>
<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 type="unfinished"/>
<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 type="unfinished"/>
<translation>Exportera databasen till en CSV-fil</translation>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
<translation>CSV-fil</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
<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>
@@ -360,11 +377,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Error</source>
<translation type="unfinished"/>
<translation>Fel</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Kunde inte räkna nu master-nyckeln</translation>
</message>
</context>
<context>
@@ -480,7 +497,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Open</source>
<translation type="unfinished"/>
<translation>Öppna</translation>
</message>
</context>
<context>
@@ -635,11 +652,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
<translation>Använd standard auto-skriv sekvensen från föräldergruppen</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
<translation>Ange standard auto-skriv sekvens</translation>
</message>
</context>
<context>
@@ -791,7 +808,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Kunde inte räkna nu master-nyckeln</translation>
</message>
</context>
<context>
@@ -810,7 +827,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Unable to calculate master key</source>
<translation type="unfinished"/>
<translation>Kunde inte räkna nu master-nyckeln</translation>
</message>
</context>
<context>
@@ -976,19 +993,19 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Tools</source>
<translation type="unfinished"/>
<translation>Verktyg</translation>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
<translation>Kopiera användarnamn</translation>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
<translation>Kopiera lösenord</translation>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
<translation>Exportera till CSV-fil</translation>
</message>
</context>
<context>
@@ -1208,7 +1225,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Remember last key files</source>
<translation type="unfinished"/>
<translation>Komihåg senaste nyckel-filen</translation>
</message>
</context>
<context>
@@ -1262,10 +1279,6 @@ Discard changes and close anyway?</source>
<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

@@ -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>
@@ -306,19 +310,26 @@ Otherwise your changes are lost.</source>
<message>
<source>&quot;%1&quot; is in edit mode.
Discard changes and close anyway?</source>
<translation type="unfinished"/>
<translation>&quot;%1&quot;
</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation type="unfinished"/>
<translation> CSV </translation>
</message>
<message>
<source>CSV file</source>
<translation type="unfinished"/>
<translation>CSV </translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation type="unfinished"/>
<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>
@@ -985,15 +996,15 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Copy username</source>
<translation type="unfinished"/>
<translation>使</translation>
</message>
<message>
<source>Copy password</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<source>Export to CSV file</source>
<translation type="unfinished"/>
<translation> CSV </translation>
</message>
</context>
<context>
@@ -1267,10 +1278,6 @@ Discard changes and close anyway?</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

@@ -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();
@@ -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

@@ -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

@@ -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

@@ -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

@@ -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"
@@ -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;
}

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

@@ -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"
@@ -632,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);
@@ -982,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

@@ -67,6 +67,7 @@ QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, QSt
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);

View File

@@ -20,6 +20,7 @@
#include <QCloseEvent>
#include <QShortcut>
#include <QTimer>
#include "autotype/AutoType.h"
#include "core/Config.h"
@@ -92,9 +93,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"));
@@ -447,10 +446,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);
@@ -576,10 +576,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();
@@ -598,6 +600,11 @@ void MainWindow::lockDatabasesAfterInactivity()
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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -60,19 +60,19 @@ void TestExporter::testToDbExporter()
Database* dbExp = ToDbExporter().exportGroup(groupOrg);
QCOMPARE(dbExp->rootGroup()->children().size(), 1);
Group* groupExp = dbExp->rootGroup()->children().first();
Group* groupExp = dbExp->rootGroup()->children().at(0);
QVERIFY(groupExp != groupOrg);
QCOMPARE(groupExp->name(), groupOrg->name());
QCOMPARE(groupExp->entries().size(), 1);
Entry* entryExp = groupExp->entries().first();
Entry* entryExp = groupExp->entries().at(0);
QCOMPARE(entryExp->title(), entryOrg->title());
QCOMPARE(dbExp->metadata()->customIcons().size(), 1);
QVERIFY(dbExp->metadata()->containsCustomIcon(iconUuid));
QCOMPARE(entryExp->iconNumber(), entryOrg->iconNumber());
QCOMPARE(entryExp->historyItems().size(), 1);
QCOMPARE(entryExp->historyItems().first()->iconUuid(), iconUuid);
QCOMPARE(entryExp->historyItems().at(0)->iconUuid(), iconUuid);
delete dbOrg;
delete dbExp;

View File

@@ -71,7 +71,7 @@ void TestKeePass1Reader::testBasic()
QVERIFY(entry11->timeInfo().expires());
QCOMPARE(entry11->timeInfo().expiryTime(), genDT(2012, 5, 9, 10, 32));
QCOMPARE(entry11->attachments()->keys().size(), 1);
QCOMPARE(entry11->attachments()->keys().first(), QString("attachment.txt"));
QCOMPARE(entry11->attachments()->keys().at(0), QString("attachment.txt"));
QCOMPARE(entry11->attachments()->value("attachment.txt"), QByteArray("hello world\n"));
Entry* entry12 = group1->entries().at(1);
@@ -118,7 +118,7 @@ void TestKeePass1Reader::testCustomIcons()
{
QCOMPARE(m_db->metadata()->customIcons().size(), 1);
Entry* entry = m_db->rootGroup()->children().at(1)->entries().first();
Entry* entry = m_db->rootGroup()->children().at(1)->entries().at(0);
QCOMPARE(entry->icon().width(), 16);
QCOMPARE(entry->icon().height(), 16);

View File

@@ -315,7 +315,7 @@ void TestKeePass2XmlReader::testEntry2()
void TestKeePass2XmlReader::testEntryHistory()
{
const Entry* entryMain = m_db->rootGroup()->entries().first();
const Entry* entryMain = m_db->rootGroup()->entries().at(0);
QCOMPARE(entryMain->historyItems().size(), 2);
{

View File

@@ -113,6 +113,7 @@ void TestKeys::testFileKey_data()
{
QTest::addColumn<QString>("type");
QTest::newRow("Xml") << QString("Xml");
QTest::newRow("XmlBrokenBase64") << QString("XmlBrokenBase64");
QTest::newRow("Binary") << QString("Binary");
QTest::newRow("Hex") << QString("Hex");
QTest::newRow("Hashed") << QString("Hashed");

Binary file not shown.

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<KeyFile>
<Meta>
<Version>1.00</Version>
</Meta>
<Key>
<Data>yy</Data>
</Key>
</KeyFile>

View File

@@ -210,6 +210,10 @@ void TestGui::testSearch()
// Search for "some"
QTest::keyClicks(searchEdit, "some");
QTRY_COMPARE(entryView->model()->rowCount(), 4);
// Press Down to focus on the entry view
QVERIFY(!entryView->hasFocus());
QTest::keyClick(searchEdit, Qt::Key_Down);
QVERIFY(entryView->hasFocus());
clickIndex(entryView->model()->index(0, 1), entryView, Qt::LeftButton);
QAction* entryEditAction = m_mainWindow->findChild<QAction*>("actionEntryEdit");