Compare commits

..

80 Commits

Author SHA1 Message Date
Felix Geyer
c8857ac2ba Finalize changelog. 2016-09-04 17:57:47 +02:00
Felix Geyer
367fbbba39 Update translations. 2016-09-04 17:14:15 +02:00
Felix Geyer
abf469f743 Prepare for 2.0.3 release. 2016-09-03 22:05:22 +02:00
Felix Geyer
878995366a Ask the user before moving an entry to the recycle bin.
Closes #447
2016-09-02 12:00:12 +02:00
Felix Geyer
1635a5211f Pass entryFlags to clone() when recursing into sub-groups.
Based on https://github.com/keepassx/keepassx/pull/178 by Mois Moshev <mois@monomon.me>

Closes #525
2016-09-02 11:47:22 +02:00
Felix Geyer
595b1011dd Refresh fileInfo after creating the file.
Fixes canonicalFilePath() returning an empty string.
2016-09-02 11:35:39 +02:00
Felix Geyer
9bb291235d Fix monospace font on Windows.
Closes #424
2016-09-02 11:35:39 +02:00
Felix Geyer
7d4ef0b8d0 Generate new password whenever the generator widget is opened.
Closes #414
2016-09-02 11:35:39 +02:00
Florian Geyer
8d16522d39 Repair UUID of inconsistent history items.
Closes #130
2016-08-03 23:48:40 +02:00
Felix Geyer
cd1192b409 Allow deleting the recycle bin.
Closes #46
2016-08-03 23:45:04 +02:00
Felix Geyer
bf2fd63131 Fix crash when deleting parent group of recycle bin.
In these cases delete the group instead of trying to move it to the recycle bin.

Closes #520
2016-08-03 23:27:02 +02:00
Felix Geyer
9532bedd7d Update min. length for password generator.
Update the minimum length for the password generator depending on the chosen
options.

Closes #420
2016-07-31 22:07:47 +02:00
Felix Geyer
e9c8363b70 Save to canonical file path so we don't overwrite symlinks.
When saving a database we previously replaced symlinks with a regular file.

Closes #442
2016-07-31 18:29:43 +02:00
Felix Geyer
fb57ed2bcd Add proper error handling when QSaveFile::open() fails.
Based on pull request by Valeriy <jazzvoid@gmail.com>

Closes #450
2016-07-31 17:07:31 +02:00
Felix Geyer
57ec558396 Detect image format solely on content.
Otherwise reading fails if the file extension is wrong.

Closes #512
2016-07-31 15:36:29 +02:00
Felix Geyer
6e2de1cd79 Display proper error message when reading an icon fails.
Refs #512
2016-07-31 14:44:45 +02:00
Felix Geyer
8ace3ab7f2 Don't consider windows with WithdrawnState as top level windows.
Fixes many bogus windows in auto-type window list when using gnome-shell.
2016-07-31 14:44:45 +02:00
Felix Geyer
18e4dca6c9 Explicitly include QFile in TestKeePass2Writer.
Closes #452
2016-07-31 14:44:45 +02:00
Felix Geyer
48eca3e11f Display an error message when opening the database fails.
Closes #462
2016-05-20 16:49:32 +02:00
Felix Geyer
57c1a0f4b6 Show proper error message when key is wrong for .kdb files. 2016-04-09 16:09:53 +02:00
Felix Geyer
bde4d63fdb Fix typo. 2016-04-09 16:02:49 +02:00
Felix Geyer
4867d26f7d Update optional dependencies in the README. 2016-02-13 11:24:11 +01:00
Felix Geyer
9bd3ab717e Print libXtst instead of libXtest in the feature summary.
The protocol is called XTEST but the library libxtst.

Closes #440
2016-02-13 11:13:15 +01:00
Felix Geyer
3679b21701 Fix typo in changelog. 2016-02-02 01:22:48 +01:00
Felix Geyer
49f58b4ed8 Prepare 2.0.2 release. 2016-02-02 01:21:39 +01:00
Felix Geyer
235361faf4 Explicitly cast char constant to QChar. 2016-02-02 00:57:28 +01:00
Felix Geyer
208b803fbe Fix KeePass2Repair to retain multi-byte UTF-8 chars.
Since char is (often) unsigned the ch < 0x20 check matched all
multi-byte encoded UTF-8 chars.
2016-02-02 00:41:16 +01:00
Felix Geyer
8a92cec03f Keep valid surrogate pairs in stripInvalidXml10Chars(). 2016-02-02 00:38:58 +01:00
Felix Geyer
00f068b93e Fix typo in changelog. 2016-01-31 20:00:44 +01:00
Felix Geyer
654353e26b Update translations. 2016-01-31 19:03:25 +01:00
Felix Geyer
d670ef2638 Prepare for 2.0.1 release. 2016-01-31 18:49:35 +01:00
Felix Geyer
aff935b3c7 Properly handle a missing key filename. 2016-01-31 17:08:50 +01:00
Felix Geyer
107c0673c7 Make sure we don't write negative icon ids into the database. 2016-01-31 17:06:51 +01:00
Felix Geyer
c14d04b3e8 Fix crash when icon id is larger than INT_MAX.
In these cases icon id was interpreted as a negative number.
The QList access with a negative index resulted in a crash.
2016-01-31 16:44:34 +01:00
Felix Geyer
7a017041bf Allow opening databases that have no password and keyfile.
Closes #391
2016-01-31 16:17:24 +01:00
Felix Geyer
eb56bd8973 Add repair functionality to strip invalid XML chars.
Refs #392
2016-01-28 23:07:04 +01:00
Felix Geyer
93585aded7 Always display scaled custom icons.
Closes #322
2016-01-26 22:44:38 +01:00
Felix Geyer
38245aa2a9 Add iconScaledPixmap() convenience functions. 2016-01-24 20:12:33 +01:00
Felix Geyer
1f33e6f044 Add Metadata::customIconScaledPixmap(). 2016-01-24 20:12:33 +01:00
Felix Geyer
4752adf9d3 Move pixmap caching to Metadata. 2016-01-24 20:12:21 +01:00
Felix Geyer
2d741afe3e Strip invalid XML chars when writing databases.
These characters are unprintable or just plain invalid.
QXmlStreamReader throws and error when reading XML documents with such chars.

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

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

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

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

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

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

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

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

We ask the window manager nicely to focus the window we want to
type into. kwin seems to follow that (in the default configuration).
2015-09-21 23:12:10 +02:00
Felix Geyer
bb38be40f6 Enable Ctrl+M shortcut to minimize window on all platforms.
Closes #329
2015-09-13 22:33:07 +02:00
Felix Geyer
f236c32063 Clear clipboard when locking databases.
Closes #342
2015-09-13 12:38:19 +02:00
Felix Geyer
236edae60b travis-ci: Backport OS X improvements from master. 2015-09-12 23:35:59 +02:00
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
107 changed files with 12526 additions and 765 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,47 @@
2.0.3 (2016-09-04)
=========================
- Improved error reporting when reading / writing databases fails. [#450, #462]
- Display an error message when opening a custom icon fails.
- Detect custom icon format based on contents instead of the filename. [#512]
- Keep symlink intact when saving databases. [#442].
- Fix a crash when deleting parent group of recycle bin. [#520]
- Display a confirm dialog before moving an entry to the recycle bin. [#447]
- Repair UUIDs of inconsistent history items. [#130]
- Only include top-level windows in auto-type window list when using gnome-shell.
- Update translations.
2.0.2 (2016-02-02)
=========================
- Fix regression in database writer that caused it to strip certain special
characters (characters from Unicode plane > 0).
- Fix bug in repair function that caused it to strip non-ASCII characters.
2.0.1 (2016-01-31)
=========================
- Flush temporary file before opening attachment. [#390]
- Disable password generator when showing entry in history mode. [#422]
- Strip invalid XML chars when writing databases. [#392]
- Add repair function to fix databases with invalid XML chars. [#392]
- Display custom icons scaled. [#322]
- Allow opening databases that have no password and keyfile. [#391]
- Fix crash when importing .kdb files with invalid icon ids. [#425]
- Update translations.
2.0 (2015-12-06)
=========================
- Improve UI of the search edit.
- Clear clipboard when locking databases. [#342]
- Enable Ctrl+M shortcut to minimize the window on all platforms. [#329]
- Show a better message when trying to open an old database format. [#338]
- Fix global auto-type behavior with some window managers.
- Show global auto-type window on the active desktop. [#359]
- Disable systray on OS X. [#326]
- Restore main window when clicking on the OS X docker icon. [#326]
2.0 Beta 2 (2015-09-06)
=========================

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.3")
set(KEEPASSX_VERSION_NUM "2.0.3")
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

@@ -57,12 +57,12 @@ The following libraries are required:
* Qt 4 (>= 4.6)
* libgcrypt
* zlib
* libxtst (optional for auto-type on X11)
* libxi, libxtst (optional for auto-type on X11)
On Debian you can install them with:
```bash
sudo apt-get install build-essential cmake libqt4-dev libgcrypt11-dev zlib1g-dev
sudo apt-get install build-essential cmake libqt4-dev libgcrypt11-dev zlib1g-dev libxi-dev libxtst-dev
```
#### Build Steps

View File

@@ -9,16 +9,24 @@
<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>
<message>
<source>Using:</source>
<translation>S použitím:</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 +48,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 +99,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>
@@ -99,7 +107,7 @@
</message>
<message>
<source>Question</source>
<translation>Otázka</translation>
<translation>Dotaz</translation>
</message>
<message>
<source>Do you really want to use an empty string as password?</source>
@@ -107,7 +115,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 +152,7 @@
</message>
<message>
<source>Unable to open the database.</source>
<translation>Databázi nebylo možné otevřít.</translation>
<translation>Databázi se nedaří otevřít.</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
@@ -163,6 +171,43 @@
<translation>Vyberte soubor s klíčem</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Opravit databázi</translation>
</message>
<message>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Nedaří se otevřít soubor s klíčem</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>Databáze je v pořádku otevřená. Není třeba žádného zásahu.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Nedaří se otevřít databázi.</translation>
</message>
<message>
<source>Success</source>
<translation>Úspěch</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>Databáze je úspěšně opravená
Nyní můžete uložit.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Databázi se nedaří opravit.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -175,7 +220,7 @@
</message>
<message>
<source>Transform rounds:</source>
<translation>Počet průchodů algoritmu:</translation>
<translation>Počet průchodů šifrovacího algoritmu:</translation>
</message>
<message>
<source>Default username:</source>
@@ -183,11 +228,11 @@
</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>
<translation type="unfinished"/>
<translation> MiB</translation>
</message>
<message>
<source>Benchmark</source>
@@ -195,11 +240,11 @@
</message>
<message>
<source>Max. history items:</source>
<translation>Nejvyšší umožněný počet položek historie:</translation>
<translation>Omezit počet uchovávaných předchozích verzí položky na:</translation>
</message>
<message>
<source>Max. history size:</source>
<translation>Nejvyšší umožněný objem dat historie záznamů:</translation>
<translation>Omezit datový objem předchozích verzí položek na:</translation>
</message>
</context>
<context>
@@ -210,7 +255,7 @@
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Databáze aplikace KeePass 2</translation>
<translation>Databáze ve formátu KeePass verze 2</translation>
</message>
<message>
<source>All files</source>
@@ -230,11 +275,11 @@
</message>
<message>
<source>Open KeePass 1 database</source>
<translation>Otevřít databázi aplikace KeePass 1</translation>
<translation>Otevřít databázi ve formátu KeePass verze 1</translation>
</message>
<message>
<source>KeePass 1 database</source>
<translation>Databáze aplikace KeePass 1</translation>
<translation>Databáze ve formátu KeePass verze 1</translation>
</message>
<message>
<source>All files (*)</source>
@@ -251,7 +296,7 @@
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
<translation>%1 bylo změněno.
<translation>%1 bylo změněno.
Uložit změny?</translation>
</message>
<message>
@@ -278,7 +323,7 @@ Uložit změny?</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>Pro databázi, kterou se pokoušíte otevřít, existuje zámek úprav (stejnojmenný
.lock soubor). To znamená, že je nejspíš již otevřená v jiném okně KeePassX
.lock soubor). To znamená, že je nejspíš už otevřená v jiném okně KeePassX
(v případě sdíleného úložiště, třeba i na jiném počítači). Pokud tomu tak není,
je zámek nejspíš pozůstatkem předchozího neočekávaného ukončení aplikace
a je možné ho smazat. V každém případě, dotčenou databázi je možné otevřít
@@ -306,24 +351,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>
@@ -338,7 +390,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>Opravdu chcete nenávratně smazat položku %1?</translation>
<translation>Opravdu chcete nenávratně smazat položku „%1“?</translation>
</message>
<message>
<source>Delete entries?</source>
@@ -362,7 +414,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>Opravdu chcete nenávratně smazat skupinu %1?</translation>
<translation>Opravdu chcete nenávratně smazat skupinu „%1“?</translation>
</message>
<message>
<source>Current group</source>
@@ -374,7 +426,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>Nedaří se spočítat hlavní klíč</translation>
</message>
</context>
<context>
@@ -393,7 +445,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 +485,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 +494,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,23 +549,23 @@ 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>
<translation type="unfinished"/>
<translation>+</translation>
</message>
<message>
<source>-</source>
<translation type="unfinished"/>
<translation>-</translation>
</message>
<message>
<source>Window title:</source>
@@ -563,7 +615,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Repeat:</source>
<translation>Zopakovat:</translation>
<translation>Zopakování hesla:</translation>
</message>
<message>
<source>Gen.</source>
@@ -579,7 +631,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Presets</source>
<translation>Přednastavené</translation>
<translation>Předpřipravené</translation>
</message>
<message>
<source>Notes:</source>
@@ -618,7 +670,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 +693,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 +712,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 +740,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. Ještě jí používá %n položek.</numerusform></translation>
</message>
</context>
<context>
@@ -699,15 +751,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 +773,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 +818,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 ve formátu KeePass verze 1</translation>
</message>
<message>
<source>Error</source>
@@ -774,14 +826,14 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Databázi nelze otevřít.</translation>
<translation>Databázi se nedaří otevřít.</translation>
</message>
</context>
<context>
<name>KeePass1Reader</name>
<message>
<source>Unable to read keyfile.</source>
<translation>Soubor s klíčem nebylo možné načíst.</translation>
<translation>Nedaří se načíst soubor s klíčem.</translation>
</message>
<message>
<source>Not a KeePass database.</source>
@@ -801,7 +853,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 +872,17 @@ 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>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Zvolený soubor je databáze ve starém formátu KeePass 1 (.kdb).
Můžete ho importovat pomocí Databáze Importovat databázi KeePass 1.
Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otevřít ve staré verzi KeePassX 0.4.</translation>
</message>
</context>
<context>
@@ -866,7 +928,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Quit</source>
<translation>Ukončit</translation>
<translation>Ukončit aplikaci</translation>
</message>
<message>
<source>About</source>
@@ -926,7 +988,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 +1012,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>
@@ -982,7 +1044,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Toggle window</source>
<translation>Přepnout okno</translation>
<translation>Zobrazit/skrýt okno</translation>
</message>
<message>
<source>Tools</source>
@@ -990,15 +1052,39 @@ 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>
<message>
<source>Repair database</source>
<translation>Opravit databázi</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Databáze ve formátu KeePass 2</translation>
</message>
<message>
<source>All files</source>
<translation>Všechny soubory</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Uložit opravenou databázi</translation>
</message>
<message>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Zápis do databáze se nezdařil.</translation>
</message>
</context>
<context>
@@ -1025,7 +1111,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Numbers</source>
<translation>Čísla</translation>
<translation>Číslice</translation>
</message>
<message>
<source>Special Characters</source>
@@ -1056,11 +1142,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 +1158,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 +1166,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 +1196,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>
@@ -1144,7 +1230,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Case sensitive</source>
<translation>Rozlišovat velikost písmen</translation>
<translation>Rozlišovat malá/velká písmena</translation>
</message>
<message>
<source>Current group</source>
@@ -1182,27 +1268,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 +1296,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>Zobrazovat 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 +1311,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 +1327,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 +1358,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,20 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX distribueres under betingelserne i GNU General Public License (GPL) version 2 eller (efter eget valg) version 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revision</translation>
</message>
<message>
<source>Using:</source>
<translation>Bruger:</translation>
</message>
</context>
<context>
<name>AutoType</name>
<message>
<source>Auto-Type - KeePassX</source>
<translation type="unfinished"/>
<translation>Auto-indsæt - KeePassX</translation>
</message>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
@@ -40,26 +48,26 @@
<name>AutoTypeSelectDialog</name>
<message>
<source>Auto-Type - KeePassX</source>
<translation type="unfinished"/>
<translation>Auto-indsæt - KeePassX</translation>
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation type="unfinished"/>
<translation>Vælg post til Auto-Indsæt:</translation>
</message>
</context>
<context>
<name>ChangeMasterKeyWidget</name>
<message>
<source>Password</source>
<translation>Adgangskode</translation>
<translation>Kodeord</translation>
</message>
<message>
<source>Enter password:</source>
<translation>Indtast adgangskode</translation>
<translation>Indtast kodeord</translation>
</message>
<message>
<source>Repeat password:</source>
<translation>Gentag adgangskode</translation>
<translation>Gentag kodeord</translation>
</message>
<message>
<source>Key file</source>
@@ -103,11 +111,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 +140,7 @@
</message>
<message>
<source>Password:</source>
<translation>Adgangskode:</translation>
<translation>Kodeord:</translation>
</message>
<message>
<source>Browse</source>
@@ -163,6 +171,43 @@
<translation>Vælg nøglefil</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Reparer database</translation>
</message>
<message>
<source>Error</source>
<translation>Fejl</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Kan ikke åbne nøglefil</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>Databasen åbnede fint. Intet at gøre.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Kan ikke åbne databasen.</translation>
</message>
<message>
<source>Success</source>
<translation>Succes</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>Databasen er blevet succesfuldt repareret
Du kan gemme den nu.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Kan ikke reparere databasen.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -175,7 +220,7 @@
</message>
<message>
<source>Transform rounds:</source>
<translation type="unfinished"/>
<translation>Transformationsrunder:</translation>
</message>
<message>
<source>Default username:</source>
@@ -195,7 +240,7 @@
</message>
<message>
<source>Max. history items:</source>
<translation type="unfinished"/>
<translation>Maks. posthistorik:</translation>
</message>
<message>
<source>Max. history size:</source>
@@ -307,7 +352,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 +367,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 +441,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 +453,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 +469,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 +544,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 +606,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 +614,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 +688,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 +855,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>
@@ -817,6 +869,16 @@ Discard changes and close anyway?</source>
<source>Unable to calculate master key</source>
<translation>Kan ikke beregne hovednøgle</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Den valgte fil er en gammel KeePass 1 databasefil (.kdb).
Du kan importere den ved at klikke Database &gt; &apos;Importér KeePass 1 database&apos;.
Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den importerede database med den gamle KeePassX 0.4 version.</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -937,7 +999,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 +1007,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,22 +1047,46 @@ 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>
<translation>Eksportér til CSV-fil</translation>
</message>
<message>
<source>Repair database</source>
<translation>Reparer database</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>KeePass 2 Database</translation>
</message>
<message>
<source>All files</source>
<translation>Alle filer</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Gem repareret database</translation>
</message>
<message>
<source>Error</source>
<translation>Fejl</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Skrivning til database fejler.</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
<message>
<source>Password:</source>
<translation>Adgangskode:</translation>
<translation>Kodeord:</translation>
</message>
<message>
<source>Length:</source>
@@ -1008,7 +1094,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 +1118,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 +1279,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 +1318,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 +1343,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 +1353,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,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX steht unter der GNU General Public License (GPL) version 2 (version 3).</translation>
</message>
<message>
<source>Revision</source>
<translation>Überarbeitung</translation>
</message>
<message>
<source>Using:</source>
<translation>In Benutzung:</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -162,6 +170,43 @@
<translation>Schlüsseldatei auswählen</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Datenbank reparieren</translation>
</message>
<message>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Schlüsseldatei kann nicht geöffnet werden</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>Datenbank wurde ordnungsgemäß geöffnet. Es gibt nichts zu tun.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Öffnen der Datenbank nicht möglich.</translation>
</message>
<message>
<source>Success</source>
<translation>Erfolg</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>Datenbank erfolgreich repariert
sie kann nun gespeichert werden.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Reparieren der Datenbank nicht möglich.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -320,6 +365,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>
@@ -816,6 +867,16 @@ Discard changes and close anyway?</source>
<source>Unable to calculate master key</source>
<translation>Berechnung des &quot;master keys&quot; gescheitert</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Die ausgewählte Datei ist eine alte KeePass 1 Datenbank (.kdb).
Zum Importieren gehen Sie auf Datenbank &gt; &apos;KeePass 1 Datenbank importieren&apos;.
Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann später nicht mehr mit der alten KeePassX Version 0.4 geöffnet werden.</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -994,6 +1055,30 @@ Discard changes and close anyway?</source>
<source>Export to CSV file</source>
<translation>Als CSV Datei exportieren</translation>
</message>
<message>
<source>Repair database</source>
<translation>Datenbank reparieren</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>KeePass 2 Datenbank</translation>
</message>
<message>
<source>All files</source>
<translation>Alle Dateien</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Reparierte Datenbank speichern</translation>
</message>
<message>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Schreiben der Datenbank fehlgeschlagen.</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1231,7 +1316,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 +1351,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>
@@ -168,6 +172,42 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Success</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -325,6 +365,10 @@ Discard changes and close anyway?</source>
Do you want to save it anyway?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -379,6 +423,14 @@ Do you want to save it anyway?</source>
<source>Unable to calculate master key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Move entry to recycle bin?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do you really want to move entry &quot;%1&quot; to the recycle bin?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -701,6 +753,14 @@ Do you want to save it anyway?</source>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Can&apos;t read icon:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditWidgetProperties</name>
@@ -814,6 +874,10 @@ Do you want to save it anyway?</source>
<source>Unable to calculate master key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeePass2Reader</name>
@@ -833,6 +897,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>
@@ -1011,6 +1082,30 @@ Do you want to save it anyway?</source>
<source>Export to CSV file</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Repair database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save repaired database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>

View File

@@ -9,6 +9,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX es distribuido bajo los términos de la versión 2 de la Licencia Pública GNU (GPL) o por la versión 3 (si así lo prefiere).</translation>
</message>
<message>
<source>Revision</source>
<translation>Revisión</translation>
</message>
<message>
<source>Using:</source>
<translation>Usando:</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -163,6 +171,43 @@
<translation>Seleccionar archivo llave</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Reparar base de datos</translation>
</message>
<message>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>No se puede abrir el archivo llave</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>Base de datos abierta correctamente. Nada que hacer.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>No se pudo abrir la base de datos.</translation>
</message>
<message>
<source>Success</source>
<translation>Éxito</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>La base de datos ha sido reparada correctamente
Ahora puede guardarla.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>No se pudo reparar la base de datos.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -322,6 +367,12 @@ Discard changes and close anyway?</source>
<source>Writing the CSV file failed.</source>
<translation>La escritura del archivo CSV falló.</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 datos que está tratando de guardar está bloqueda por otra instancia de KeePassX.
̉¿Desea guardarla de cualquier manera?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -819,6 +870,16 @@ Discard changes and close anyway?</source>
<source>Unable to calculate master key</source>
<translation>No se puede calcular la clave maestra</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>El archivo seleccionado es una vieja base de datos de KeePass 1 (.kdb).
Puede importarla haciendo click en &apos;Base de datos&apos; &gt; &apos;Importar base de datos de Keepass 1&apos;.
Esta migración es en un único sentido. No podrá abrir la base importada con la vieja versión 0.4 de KeePassX. </translation>
</message>
</context>
<context>
<name>Main</name>
@@ -997,6 +1058,30 @@ Discard changes and close anyway?</source>
<source>Export to CSV file</source>
<translation>Exportar a un archivo CSV</translation>
</message>
<message>
<source>Repair database</source>
<translation>Reparar la base de datos</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Base de datos de KeePass 2</translation>
</message>
<message>
<source>All files</source>
<translation>Todos los archivos</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Guardar base de datos reparada</translation>
</message>
<message>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Fallo al escribir la base de datos.</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1269,10 +1354,6 @@ Discard changes and close anyway?</source>
<source>path to a custom config file</source>
<translation>ruta a un archivo de configuración personalizado</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>contraseña de la base de datos (¡PELIGROSO!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>archivo llave de la base de datos</translation>

View File

@@ -9,6 +9,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX est distribué selon les conditions de la GNU General Public License (GPL) version 2 ou (à votre choix) version 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Version</translation>
</message>
<message>
<source>Using:</source>
<translation>Utilise :</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -25,7 +33,7 @@
<name>AutoTypeAssociationsModel</name>
<message>
<source>Window</source>
<translation>Fenêtre </translation>
<translation>Fenêtre</translation>
</message>
<message>
<source>Sequence</source>
@@ -75,7 +83,7 @@
</message>
<message>
<source>Key files</source>
<translation>Fichiers de clé</translation>
<translation>Fichiers-clés</translation>
</message>
<message>
<source>All files</source>
@@ -116,7 +124,7 @@
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation>Impossible de définir %1 comme fichier-clé:
<translation>Impossible de définir %1 comme fichier-clé :
%2</translation>
</message>
</context>
@@ -163,6 +171,43 @@
<translation>Choisissez un fichier-clé</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Réparer la base de données</translation>
</message>
<message>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Impossible d&apos;ouvrir le fichier-clé</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>La base de données s&apos;est bien ouverte. Aucune action à effectuer.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Impossible d&apos;ouvrir la base de données.</translation>
</message>
<message>
<source>Success</source>
<translation>Succès</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>La base de données a correctement é réparée.
Vous pouvez maintenant la sauvegarder.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Impossible de réparer la base de données.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -187,7 +232,7 @@
</message>
<message>
<source> MiB</source>
<translation>MiB</translation>
<translation> MiB</translation>
</message>
<message>
<source>Benchmark</source>
@@ -226,7 +271,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 +305,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>
@@ -282,7 +327,7 @@ Voulez-vous quand même l&apos;ouvrir ? Dans ce cas, elle sera ouverte en lectur
</message>
<message>
<source>Lock database</source>
<translation>Verrouiiler la base de données</translation>
<translation>Verrouiller la base de données</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
@@ -322,6 +367,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 été verrouillée par une autre instance de KeePassX.
Voulez-vous quand même la sauvegarder ?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -394,7 +445,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>
@@ -439,7 +490,7 @@ Ignorer les changements et fermer ?</translation>
<message>
<source>Unable to save the attachment:
</source>
<translation>Impossible d&apos;enregistrer le fichier attaché:
<translation>Impossible d&apos;enregistrer le fichier attaché :
</translation>
</message>
<message>
@@ -463,7 +514,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 +534,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>
@@ -522,7 +573,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Set custom sequence:</source>
<translation>Définir une séquence personnalisé :</translation>
<translation>Définir une séquence personnalisée :</translation>
</message>
</context>
<context>
@@ -552,7 +603,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Username:</source>
<translation>Non d&apos;utilisateur :</translation>
<translation>Nom d&apos;utilisateur :</translation>
</message>
<message>
<source>Password:</source>
@@ -595,11 +646,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>
@@ -745,7 +796,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Username</source>
<translation>Non d&apos;utilisateur</translation>
<translation>Nom d&apos;utilisateur</translation>
</message>
<message>
<source>URL</source>
@@ -782,7 +833,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Not a KeePass database.</source>
<translation>Ce n&apos;est pas une base de donnée KeePass.</translation>
<translation>Ce n&apos;est pas une base de données KeePass.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
@@ -790,7 +841,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Version de base de donnée KeePass non supportée.</translation>
<translation>Version de base de données KeePass non supportée.</translation>
</message>
<message>
<source>Root</source>
@@ -805,20 +856,30 @@ Ignorer les changements et fermer ?</translation>
<name>KeePass2Reader</name>
<message>
<source>Not a KeePass database.</source>
<translation>Ce n&apos;est pas une base de donnée KeePass.</translation>
<translation>Ce n&apos;est pas une base de données KeePass.</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Version de base de donnée KeePass non supportée.</translation>
<translation>Version de base de données KeePass non supportée.</translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation>Mauvaise clé ou fichier de base de donnée corrompu.</translation>
<translation>Mauvaise clé ou fichier de base de données corrompu.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Impossible de calculer la clé maître</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Le fichier sélectionné est une ancienne base de données pour KeePass 1 (.kdb).
Vous pouvez l&apos;importer en cliquant sur &quot;Base de données&quot; &gt; &quot;Importer une base de données KeePass 1&quot;.
Ceci est une migration à sens unique. Vous ne serez plus en mesure d&apos;ouvrir la base de données importée avec l&apos;ancienne version KeePassX version 0.4.</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -851,7 +912,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Copy attribute to clipboard</source>
<translation>Copier l&apos;attribut dans le presse-papiers</translation>
<translation>Copier l&apos;attribut dans le presse-papier</translation>
</message>
<message>
<source>Groups</source>
@@ -871,19 +932,19 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Open database</source>
<translation>Ouvrir une base de donnée</translation>
<translation>Ouvrir une base de données</translation>
</message>
<message>
<source>Save database</source>
<translation>Enregistrer la base de donnée</translation>
<translation>Enregistrer la base de données</translation>
</message>
<message>
<source>Close database</source>
<translation>Fermer la base de donnée</translation>
<translation>Fermer la base de données</translation>
</message>
<message>
<source>New database</source>
<translation>Nouvelle base de donnée</translation>
<translation>Nouvelle base de données</translation>
</message>
<message>
<source>Add new entry</source>
@@ -911,7 +972,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Save database as</source>
<translation>Enregistrer la base de donnée sous</translation>
<translation>Enregistrer la base de données sous</translation>
</message>
<message>
<source>Change master key</source>
@@ -919,11 +980,11 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Database settings</source>
<translation>Paramètre de la base de donnée</translation>
<translation>Paramètres de la base de données</translation>
</message>
<message>
<source>Import KeePass 1 database</source>
<translation>Importer une base de donnée KeePass 1</translation>
<translation>Importer une base de données KeePass 1</translation>
</message>
<message>
<source>Clone entry</source>
@@ -935,11 +996,11 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Copier le nom d&apos;utilisateur dans le presse-papiers</translation>
<translation>Copier le nom d&apos;utilisateur dans le presse-papier</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Copier le mot de passe dans le presse-papiers</translation>
<translation>Copier le mot de passe dans le presse-papier</translation>
</message>
<message>
<source>Settings</source>
@@ -997,6 +1058,30 @@ Ignorer les changements et fermer ?</translation>
<source>Export to CSV file</source>
<translation>Exporter au format CSV</translation>
</message>
<message>
<source>Repair database</source>
<translation>Réparer la base de données</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Base de données KeePass 2</translation>
</message>
<message>
<source>All files</source>
<translation>Tous les fichiers</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Sauvegarder la base de données réparée</translation>
</message>
<message>
<source>Error</source>
<translation>Erreur</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>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1010,7 +1095,7 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Character Types</source>
<translation>Types de caractère</translation>
<translation>Types de caractères</translation>
</message>
<message>
<source>Upper Case Letters</source>
@@ -1045,7 +1130,7 @@ Ignorer les changements et fermer ?</translation>
<name>QCommandLineParser</name>
<message>
<source>Displays version information.</source>
<translation>Afficher les informations de version</translation>
<translation>Afficher les informations de version.</translation>
</message>
<message>
<source>Displays this help.</source>
@@ -1156,7 +1241,7 @@ Ignorer les changements et fermer ?</translation>
<name>SettingsWidget</name>
<message>
<source>Application Settings</source>
<translation>Paramètre de l&apos;application</translation>
<translation>Paramètres de l&apos;application</translation>
</message>
<message>
<source>General</source>
@@ -1175,19 +1260,19 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>Open previous databases on startup</source>
<translation>Ouvrir les base de données précédentes au démarrage</translation>
<translation>Ouvrir les bases de données précédentes au démarrage</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Sauvegarde automatiquement à la sortie</translation>
<translation>Sauvegarder automatiquement à la sortie</translation>
</message>
<message>
<source>Automatically save after every change</source>
<translation>Sauvegarde automatiquement après chaque modification</translation>
<translation>Sauvegarder automatiquement après chaque modification</translation>
</message>
<message>
<source>Minimize when copying to clipboard</source>
<translation>Réduire lors de la copie dans le presse-papiers</translation>
<translation>Réduire lors de la copie dans le presse-papier</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
@@ -1199,7 +1284,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>
@@ -1222,15 +1307,15 @@ Ignorer les changements et fermer ?</translation>
<name>SettingsWidgetSecurity</name>
<message>
<source>Clear clipboard after</source>
<translation>Vider le presse-papiers après</translation>
<translation>Vider le presse-papier après</translation>
</message>
<message>
<source> sec</source>
<translation>s</translation>
<translation> s</translation>
</message>
<message>
<source>Lock databases after inactivity of</source>
<translation>Verrouiller les bases de donnée après une inactivité de</translation>
<translation>Verrouiller les bases de données après une inactivité de</translation>
</message>
<message>
<source>Show passwords in cleartext by default</source>
@@ -1245,7 +1330,7 @@ Ignorer les changements et fermer ?</translation>
<name>UnlockDatabaseWidget</name>
<message>
<source>Unlock database</source>
<translation>Déverrouiller la base de donnée</translation>
<translation>Déverrouiller la base de données</translation>
</message>
</context>
<context>
@@ -1263,16 +1348,12 @@ Ignorer les changements et fermer ?</translation>
</message>
<message>
<source>filename of the password database to open (*.kdbx)</source>
<translation>Nom de fichier de la base de donnée de mot de pass à ouvrir (*.kdbx)</translation>
<translation>Nom de fichier de la base de données de mot de passe à ouvrir (*.kdbx)</translation>
</message>
<message>
<source>path to a custom config file</source>
<translation>Chemin vers un fichier de configuration personnalisé</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>Mot de passe de la base de donnée (DANGEREUX !)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>Fichier-clé de la base de données</translation>

View File

@@ -7,7 +7,15 @@
</message>
<message>
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation type="unfinished"/>
<translation>KeePassX disebarluaskan dibawah ketentuan dari Lisensi Publik Umum GNU (GPL) versi 2 atau (sesuai pilihan Anda) versi 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revisi</translation>
</message>
<message>
<source>Using:</source>
<translation>Menggunakan:</translation>
</message>
</context>
<context>
@@ -18,7 +26,7 @@
</message>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
<translation>Tidak dapat menemukan entri yang cocok dengan judul jendela</translation>
<translation>Tidak bisa menemukan entri yang cocok dengan judul jendela:</translation>
</message>
</context>
<context>
@@ -51,15 +59,15 @@
<name>ChangeMasterKeyWidget</name>
<message>
<source>Password</source>
<translation>Kata Sandi</translation>
<translation>Sandi</translation>
</message>
<message>
<source>Enter password:</source>
<translation>Masukan kata sandi:</translation>
<translation>Masukkan sandi:</translation>
</message>
<message>
<source>Repeat password:</source>
<translation>Ulangi kata sandi:</translation>
<translation>Ulangi sandi:</translation>
</message>
<message>
<source>Key file</source>
@@ -75,7 +83,7 @@
</message>
<message>
<source>Key files</source>
<translation>Berkas Kunci</translation>
<translation>Berkas kunci</translation>
</message>
<message>
<source>All files</source>
@@ -91,11 +99,11 @@
</message>
<message>
<source>Unable to create Key File : </source>
<translation>Tidak dapat membuat Berkas Kunci :</translation>
<translation>Tidak bisa membuat Berkas Kunci :</translation>
</message>
<message>
<source>Select a key file</source>
<translation>Pilih sebuah berkas kunci</translation>
<translation>Pilih berkas kunci</translation>
</message>
<message>
<source>Question</source>
@@ -103,27 +111,28 @@
</message>
<message>
<source>Do you really want to use an empty string as password?</source>
<translation>Apakah anda ingin menggunakan string kosong sebagai kata sandi?</translation>
<translation>Apakah Anda benar-benar ingin menggunakan lema kosong sebagai sandi?</translation>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Kata sandi yang berbeda diberikan.</translation>
<translation>Sandi berbeda.</translation>
</message>
<message>
<source>Failed to set key file</source>
<translation 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 +140,7 @@
</message>
<message>
<source>Password:</source>
<translation>Kata sandi:</translation>
<translation>Sandi:</translation>
</message>
<message>
<source>Browse</source>
@@ -143,11 +152,11 @@
</message>
<message>
<source>Unable to open the database.</source>
<translation>Tidak dapat membuka basis data</translation>
<translation>Tidak bisa membuka basis data.</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Tidak dapat membuka berkas kunci</translation>
<translation>Tidak bisa membuka berkas kunci</translation>
</message>
<message>
<source>All files</source>
@@ -162,6 +171,43 @@
<translation>Pilih berkas kunci</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Perbaiki basis data</translation>
</message>
<message>
<source>Error</source>
<translation>Galat</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Tidak bisa membuka berkas kunci</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>Basis data terbuka dengan baik. Tidak perlu melakukan apa-apa.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Tidak bisa membuka basis data.</translation>
</message>
<message>
<source>Success</source>
<translation>Sukses</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>Basis data berhasil diperbaiki
Anda bisa menyimpannya sekarang.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Tidak bisa memperbaiki basis data.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -182,7 +228,7 @@
</message>
<message>
<source>Use recycle bin:</source>
<translation type="unfinished"/>
<translation>Gunakan tong sampah:</translation>
</message>
<message>
<source> MiB</source>
@@ -205,7 +251,7 @@
<name>DatabaseTabWidget</name>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation>Root</translation>
</message>
<message>
<source>KeePass 2 Database</source>
@@ -259,7 +305,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 +322,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 +386,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 +394,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 +410,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 +418,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 +453,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>
@@ -411,7 +469,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Different passwords supplied.</source>
<translation>Kata sandi yang berbeda diberikan.</translation>
<translation>Sandi berbeda.</translation>
</message>
<message>
<source>New attribute</source>
@@ -423,7 +481,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 +490,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 +499,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 +526,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 +538,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Open</source>
<translation type="unfinished"/>
<translation>Buka</translation>
</message>
</context>
<context>
@@ -491,11 +549,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 +573,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 +607,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,11 +623,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Expires</source>
<translation>Kadaluarsa</translation>
<translation>Kedaluwarsa</translation>
</message>
<message>
<source>Presets</source>
<translation type="unfinished"/>
<translation>Prasetel</translation>
</message>
<message>
<source>Notes:</source>
@@ -608,7 +666,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 +681,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 +693,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 +708,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 +732,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 +807,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 +822,70 @@ 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>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Berkas yang dipilih adalah basis data KeePass 1 yang lama (.kdb).
Anda bisa mengimpornya dengan mengklik Basis Data &gt; &apos;Impor basis data KeePass 1&apos;.
Ini adalah migrasi satu arah. Anda tidak akan bisa lagi membuka basis data yang diimpor dengan versi lama KeePassX 0.4.</translation>
</message>
</context>
<context>
<name>Main</name>
<message>
<source>Fatal error while testing the cryptographic functions.</source>
<translation type="unfinished"/>
<translation>Galat saat menguji fungsi kriptografi.</translation>
</message>
<message>
<source>KeePassX - Error</source>
@@ -832,7 +900,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 +920,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 +952,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 +988,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 +1000,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 +1008,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 +1036,58 @@ 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>
<message>
<source>Repair database</source>
<translation>Perbaiki basis data</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Basis Data KeePass 2</translation>
</message>
<message>
<source>All files</source>
<translation>Semua Berkas</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Simpan basis data yang sudah diperbaiki</translation>
</message>
<message>
<source>Error</source>
<translation>Galat</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Gagal menyimpan basis data.</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 +1095,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 +1115,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 +1130,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,45 +1166,45 @@ 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>
<translation type="unfinished"/>
<translation>Terjadi kesalahan saat menyimpan ke perangkat:</translation>
</message>
<message>
<source>Error opening underlying device: </source>
<translation type="unfinished"/>
<translation>Terjadi kesalahan saat membuka perangkat:</translation>
</message>
<message>
<source>Error reading data from underlying device: </source>
<translation type="unfinished"/>
<translation>Terjadi kesalahan saat membaca data dari perangkat:</translation>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
<translation>Galat zlib internal ketika dekompress</translation>
<translation>Galat zlib internal ketika dekompres:</translation>
</message>
</context>
<context>
@@ -1134,15 +1226,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 +1272,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 +1280,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 +1292,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 +1315,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,19 @@
<name>AboutDialog</name>
<message>
<source>About KeePassX</source>
<translation>A proposito di KeePassX</translation>
<translation>Informazioni su KeePassX</translation>
</message>
<message>
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX è distribuito sotto i termini della licenza
GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</translation>
<translation>KeePassX è distribuito sotto i termini della licenza GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revisione</translation>
</message>
<message>
<source>Using:</source>
<translation>In uso:</translation>
</message>
</context>
<context>
@@ -45,7 +52,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation>Selezionare una voce per Auto-Type:</translation>
<translation>Seleziona una voce per Auto-Type:</translation>
</message>
</context>
<context>
@@ -56,11 +63,11 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Enter password:</source>
<translation>Inserire password:</translation>
<translation>Inserisci password:</translation>
</message>
<message>
<source>Repeat password:</source>
<translation>Ripetere password:</translation>
<translation>Ripeti password:</translation>
</message>
<message>
<source>Key file</source>
@@ -68,11 +75,11 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Browse</source>
<translation>Sfogliare</translation>
<translation>Sfoglia</translation>
</message>
<message>
<source>Create</source>
<translation>Creare</translation>
<translation>Crea</translation>
</message>
<message>
<source>Key files</source>
@@ -84,7 +91,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Create Key File...</source>
<translation>Creare file chiave...</translation>
<translation>Crea file chiave...</translation>
</message>
<message>
<source>Error</source>
@@ -96,7 +103,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Select a key file</source>
<translation>Selezionare file chiave</translation>
<translation>Seleziona il file chiave</translation>
</message>
<message>
<source>Question</source>
@@ -112,23 +119,24 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Failed to set key file</source>
<translation>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>
<name>DatabaseOpenWidget</name>
<message>
<source>Enter master key</source>
<translation>Inserire password</translation>
<translation>Inserisci la chiave principale</translation>
</message>
<message>
<source>Key File:</source>
<translation>File Chiave:</translation>
<translation>File chiave:</translation>
</message>
<message>
<source>Password:</source>
@@ -136,7 +144,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Browse</source>
<translation>Sfogliare</translation>
<translation>Sfoglia</translation>
</message>
<message>
<source>Error</source>
@@ -160,18 +168,55 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Select key file</source>
<translation>Selezionare file chiave</translation>
<translation>Seleziona file chiave</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Ripara database</translation>
</message>
<message>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Impossibile aprire il file chiave</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>Database aperto correttamente. Nessuna operazione da eseguire.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Impossibile aprire il database</translation>
</message>
<message>
<source>Success</source>
<translation>Successo</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>Il database è stato riparato con successo
Adesso puoi salvarlo.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Impossibile riparare il database</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
<source>Database name:</source>
<translation>Nome database:</translation>
<translation>Nome del database:</translation>
</message>
<message>
<source>Database description:</source>
<translation>Descrizione database:</translation>
<translation>Descrizione del database:</translation>
</message>
<message>
<source>Transform rounds:</source>
@@ -183,7 +228,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
</message>
<message>
<source>Use recycle bin:</source>
<translation>Utilizzare cestino:</translation>
<translation>Utilizza cestino:</translation>
</message>
<message>
<source> MiB</source>
@@ -191,7 +236,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 +263,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 +275,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>
@@ -251,7 +296,7 @@ GNU General Public License (GPL) versione 2 o, a tua scelta, della versione 3.</
<message>
<source>&quot;%1&quot; was modified.
Save changes?</source>
<translation>&quot;%1&quot; è stata modificata.
<translation>&quot;%1&quot; è stata modificato.
Salvare le modifiche?</translation>
</message>
<message>
@@ -260,11 +305,11 @@ Salvare le modifiche?</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Scrittura del database fallita.</translation>
<translation>Scrittura del database non riuscita.</translation>
</message>
<message>
<source>Save database as</source>
<translation>Salvare database come</translation>
<translation>Salva database come</translation>
</message>
<message>
<source>New database</source>
@@ -277,24 +322,24 @@ Salvare le modifiche?</translation>
<message>
<source>The database you are trying to open is locked by another instance of KeePassX.
Do you want to open it anyway? Alternatively the database is opened read-only.</source>
<translation>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>
<translation>Il database che stai tentando di aprire è bloccato da un&apos;altra istanza di KeePassX.
Vuoi aprirlo comunque? Altrimenti il database verrà aperto in sola lettura.</translation>
</message>
<message>
<source>Lock database</source>
<translation>Bloccare database</translation>
<translation>Blocca database</translation>
</message>
<message>
<source>Can't lock the database as you are currently editing it.
Please press cancel to finish your changes or discard them.</source>
<translation>Non è possibile bloccare il database ne modo in cui lo stai modificando.
Premere annulla per terminare le modifiche o scartarle .</translation>
<translation>Non è possibile bloccare il database dato che lo stai modificando.
Premere Annulla per completare le modifiche o scartarle.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation>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 +352,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>
@@ -319,14 +365,20 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Writing the CSV file failed.</source>
<translation>Scrittura del file CSV fallita.</translation>
<translation>Scrittura del file CSV non riuscita.</translation>
</message>
<message>
<source>The database you are trying to save as is locked by another instance of KeePassX.
Do you want to save it anyway?</source>
<translation>Il database che stai tentando di salvare è bloccato da un&apos;altra istanza di KeePassX.
Vuoi salvare comunque?</translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Change master key</source>
<translation>Cambiare password principale</translation>
<translation>Cambia chiave principale</translation>
</message>
<message>
<source>Delete entry?</source>
@@ -370,7 +422,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 +477,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 +490,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>
@@ -447,15 +499,15 @@ Discard changes and close anyway?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>%n settimana(e)</numerusform><numerusform>%n settimana(e)</numerusform></translation>
<translation><numerusform>%n settimana</numerusform><numerusform>%n settimane</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
<translation><numerusform>%n mese(i)</numerusform><numerusform>%n mese(i)</numerusform></translation>
<translation><numerusform>%n mese</numerusform><numerusform>%n mesi</numerusform></translation>
</message>
<message>
<source>1 year</source>
<translation>1 anno</translation>
<translation>Un anno</translation>
</message>
</context>
<context>
@@ -466,15 +518,15 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Add</source>
<translation>Aggiungere</translation>
<translation>Aggiungi</translation>
</message>
<message>
<source>Edit</source>
<translation>Modificare</translation>
<translation>Modifica</translation>
</message>
<message>
<source>Remove</source>
<translation>Rimuovere</translation>
<translation>Rimuovi</translation>
</message>
<message>
<source>Attachments</source>
@@ -482,7 +534,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Save</source>
<translation>Salvare</translation>
<translation>Salva</translation>
</message>
<message>
<source>Open</source>
@@ -493,15 +545,15 @@ Discard changes and close anyway?</source>
<name>EditEntryWidgetAutoType</name>
<message>
<source>Enable Auto-Type for this entry</source>
<translation>Abilitare Auto-Type per questa voce</translation>
<translation>Abilita Auto-Type per questa voce</translation>
</message>
<message>
<source>Inherit default Auto-Type sequence from the group</source>
<translation>Ereditare la sequenza predefinita di Auto-Type dal gruppo</translation>
<translation>Eredita la sequenza predefinita di Auto-Type dal gruppo</translation>
</message>
<message>
<source>Use custom Auto-Type sequence:</source>
<translation>Usare sequenza personalizzata di Auto-Type:</translation>
<translation>Usa sequenza personalizzata di Auto-Type:</translation>
</message>
<message>
<source>+</source>
@@ -517,30 +569,30 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Use default sequence</source>
<translation>Usare sequenza predefinita</translation>
<translation>Usa sequenza predefinita</translation>
</message>
<message>
<source>Set custom sequence:</source>
<translation>Impostare sequenza personalizzata:</translation>
<translation>Imposta sequenza personalizzata:</translation>
</message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
<message>
<source>Show</source>
<translation>Mostrare</translation>
<translation>Mostra</translation>
</message>
<message>
<source>Restore</source>
<translation>Ripristinare</translation>
<translation>Ripristina</translation>
</message>
<message>
<source>Delete</source>
<translation>Eliminare</translation>
<translation>Elimina</translation>
</message>
<message>
<source>Delete all</source>
<translation>Eliminare tutti</translation>
<translation>Elimina tutti</translation>
</message>
</context>
<context>
@@ -559,7 +611,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Repeat:</source>
<translation>Ripetere:</translation>
<translation>Ripeti:</translation>
</message>
<message>
<source>Gen.</source>
@@ -575,7 +627,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Presets</source>
<translation>Programmare</translation>
<translation>Preimpostazioni</translation>
</message>
<message>
<source>Notes:</source>
@@ -598,23 +650,23 @@ 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>
<translation>Ereditare dal gruppo genitore (%1)</translation>
<translation>Eredita dal gruppo genitore (%1)</translation>
</message>
</context>
<context>
@@ -633,7 +685,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Search</source>
<translation>Cercare</translation>
<translation>Cerca</translation>
</message>
<message>
<source>Auto-type</source>
@@ -641,30 +693,30 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation>Ereditare la sequenza predefinita di auto-type dal gruppo</translation>
<translation>Eredita la sequenza predefinita di auto-type dal gruppo</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation>Usare sequenza predefinita</translation>
<translation>Usa sequenza di auto-type predefinita</translation>
</message>
</context>
<context>
<name>EditWidgetIcons</name>
<message>
<source>Use default icon</source>
<translation>Usare icona predefinita</translation>
<translation>Usa icona predefinita</translation>
</message>
<message>
<source>Use custom icon</source>
<translation>Usare icona personalizzata</translation>
<translation>Usa icona personalizzata</translation>
</message>
<message>
<source>Add custom icon</source>
<translation>Aggiungere icona personalizzata</translation>
<translation>Aggiungi icona personalizzata</translation>
</message>
<message>
<source>Delete custom icon</source>
<translation>Rimuovere icona personalizzata</translation>
<translation>Rimuovi icona personalizzata</translation>
</message>
<message>
<source>Images</source>
@@ -676,26 +728,26 @@ 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>
<translation><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voce(i).</numerusform><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voce(i).</numerusform></translation>
<translation><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voce.</numerusform><numerusform>Impossibile eliminare l&apos;icona in quanto è in uso da %n voci.</numerusform></translation>
</message>
</context>
<context>
<name>EditWidgetProperties</name>
<message>
<source>Created:</source>
<translation>Creato:</translation>
<translation>Creazione:</translation>
</message>
<message>
<source>Modified:</source>
<translation>Modificato:</translation>
<translation>Modifica:</translation>
</message>
<message>
<source>Accessed:</source>
@@ -703,7 +755,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Uuid:</source>
<translation>Uuid:</translation>
<translation>UUID:</translation>
</message>
</context>
<context>
@@ -744,7 +796,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Username</source>
<translation>Nome Utente</translation>
<translation>Nome utente</translation>
</message>
<message>
<source>URL</source>
@@ -755,14 +807,14 @@ Discard changes and close anyway?</source>
<name>Group</name>
<message>
<source>Recycle Bin</source>
<translation>Cestino (Gruppo)</translation>
<translation>Cestino</translation>
</message>
</context>
<context>
<name>KeePass1OpenWidget</name>
<message>
<source>Import KeePass1 database</source>
<translation>Importare database KeePass1</translation>
<translation>Importa database KeePass1</translation>
</message>
<message>
<source>Error</source>
@@ -777,7 +829,7 @@ Discard changes and close anyway?</source>
<name>KeePass1Reader</name>
<message>
<source>Unable to read keyfile.</source>
<translation>Impossibile leggere il file chiave.</translation>
<translation>Impossibile leggere il file della chiave.</translation>
</message>
<message>
<source>Not a KeePass database.</source>
@@ -789,15 +841,15 @@ 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>
<translation>Impossibile calcolare la chiave master</translation>
<translation>Impossibile calcolare la chiave principale</translation>
</message>
</context>
<context>
@@ -808,15 +860,25 @@ 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>Chiave errata o file del database danneggiato.</translation>
</message>
<message>
<source>Unable to calculate master key</source>
<translation>Impossibile calcolare la chiave master</translation>
<translation>Impossibile calcolare la chiave principale</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Il file selezionato è un vecchio database KeePass 1 (.kdb).
Puoi importarlo facendo clic su Database &gt; &apos;Importa database KeePass 1&apos;.
Questa è una migrazione in una sola direzione. Non potrai aprire il database importato con la vecchia versione 0.4 di KeePassX. </translation>
</message>
</context>
<context>
@@ -850,7 +912,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,27 +920,27 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>View</source>
<translation>Visualizzare</translation>
<translation>Visualizza</translation>
</message>
<message>
<source>Quit</source>
<translation>Uscire</translation>
<translation>Esci</translation>
</message>
<message>
<source>About</source>
<translation>A Proposito</translation>
<translation>Informazioni</translation>
</message>
<message>
<source>Open database</source>
<translation>Aprire database</translation>
<translation>Apri database</translation>
</message>
<message>
<source>Save database</source>
<translation>Salvare database</translation>
<translation>Salva database</translation>
</message>
<message>
<source>Close database</source>
<translation>Chiudere database</translation>
<translation>Chiudi database</translation>
</message>
<message>
<source>New database</source>
@@ -886,35 +948,35 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Add new entry</source>
<translation>Aggiungere nuova voce</translation>
<translation>Aggiungi nuova voce</translation>
</message>
<message>
<source>View/Edit entry</source>
<translation>Visualizzare/Modificare voce</translation>
<translation>Visualizza/modifica voce</translation>
</message>
<message>
<source>Delete entry</source>
<translation>Eliminare voce</translation>
<translation>Elimina voce</translation>
</message>
<message>
<source>Add new group</source>
<translation>Aggiungere nuovo gruppo</translation>
<translation>Aggiungi nuovo gruppo</translation>
</message>
<message>
<source>Edit group</source>
<translation>Modificare gruppo</translation>
<translation>Modifica gruppo</translation>
</message>
<message>
<source>Delete group</source>
<translation>Eliminare gruppo</translation>
<translation>Elimina gruppo</translation>
</message>
<message>
<source>Save database as</source>
<translation>Salvare database come</translation>
<translation>Salva database come</translation>
</message>
<message>
<source>Change master key</source>
<translation>Cambiare password principale</translation>
<translation>Cambia chiave principale</translation>
</message>
<message>
<source>Database settings</source>
@@ -922,7 +984,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Import KeePass 1 database</source>
<translation>Importare database KeePass 1</translation>
<translation>Importa database KeePass 1</translation>
</message>
<message>
<source>Clone entry</source>
@@ -930,15 +992,15 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Find</source>
<translation>Trovare</translation>
<translation>Trova</translation>
</message>
<message>
<source>Copy username to clipboard</source>
<translation>Copiare nome utente negli appunti</translation>
<translation>Copia nome utente negli appunti</translation>
</message>
<message>
<source>Copy password to clipboard</source>
<translation>Copiare password negli appunti</translation>
<translation>Copia password negli appunti</translation>
</message>
<message>
<source>Settings</source>
@@ -946,15 +1008,15 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Perform Auto-Type</source>
<translation>Eseguire Auto-Type</translation>
<translation>Esegui Auto-Type</translation>
</message>
<message>
<source>Open URL</source>
<translation>Aprire URL</translation>
<translation>Apri URL</translation>
</message>
<message>
<source>Lock databases</source>
<translation>Bloccare database</translation>
<translation>Blocca database</translation>
</message>
<message>
<source>Title</source>
@@ -970,7 +1032,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>
@@ -996,6 +1058,30 @@ Discard changes and close anyway?</source>
<source>Export to CSV file</source>
<translation>Esporta in un file CSV</translation>
</message>
<message>
<source>Repair database</source>
<translation>Ripara database</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>Database KeePass 2</translation>
</message>
<message>
<source>All files</source>
<translation>Tutti i file</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Salva il database riparato</translation>
</message>
<message>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Scrittura del database non riuscita.</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1029,26 +1115,26 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation>Escludere caratteri simili</translation>
<translation>Escludi caratteri simili</translation>
</message>
<message>
<source>Ensure that the password contains characters from every group</source>
<translation>Assicurare che la password contenga caratteri di ogni gruppo</translation>
<translation>Verifica che la password contenga caratteri di ogni gruppo</translation>
</message>
<message>
<source>Accept</source>
<translation>Accettare</translation>
<translation>Accetta</translation>
</message>
</context>
<context>
<name>QCommandLineParser</name>
<message>
<source>Displays version information.</source>
<translation>Mostrare informazioni sulla versione.</translation>
<translation>Mostra informazioni sulla versione.</translation>
</message>
<message>
<source>Displays this help.</source>
<translation>Mostrare questo aiuto.</translation>
<translation>Mostra questo aiuto.</translation>
</message>
<message>
<source>Unknown option &apos;%1&apos;.</source>
@@ -1091,7 +1177,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Writing canceled by application</source>
<translation>Scrittura cancellata dall&apos;applicazione</translation>
<translation>Scrittura annullata dall&apos;applicazione</translation>
</message>
<message>
<source>Partial write. Partition full?</source>
@@ -1136,11 +1222,11 @@ Discard changes and close anyway?</source>
<name>SearchWidget</name>
<message>
<source>Find:</source>
<translation>Trovare:</translation>
<translation>Trova:</translation>
</message>
<message>
<source>Case sensitive</source>
<translation>Case sensitive</translation>
<translation>Riconoscimento di maiuscole e minuscole</translation>
</message>
<message>
<source>Current group</source>
@@ -1170,27 +1256,27 @@ 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>
<translation>Aprire precedente database all&apos;avvio</translation>
<translation>Apri il database precedente all&apos;avvio</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Salvare automaticamente all&apos;uscita</translation>
<translation>Salva automaticamente all&apos;uscita</translation>
</message>
<message>
<source>Automatically save after every change</source>
<translation>Salvare automaticamente dopo ogni modifica</translation>
<translation>Salva automaticamente dopo ogni modifica</translation>
</message>
<message>
<source>Minimize when copying to clipboard</source>
<translation>Minimizzare quando si copia negli appunti</translation>
<translation>Minimizza quando si copia negli appunti</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
<translation>Usare l&apos;icona del gruppo alla creazione di una voce</translation>
<translation>Usa l&apos;icona del gruppo alla creazione di una voce</translation>
</message>
<message>
<source>Global Auto-Type shortcut</source>
@@ -1198,7 +1284,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Use entry title to match windows for global auto-type</source>
<translation>Utilizzare il titolo della voce per abbinare la finestra per auto-type globale</translation>
<translation>Utilizza il titolo della voce per abbinare la finestra per auto-type globale</translation>
</message>
<message>
<source>Language</source>
@@ -1210,18 +1296,18 @@ 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 file di chiavi</translation>
</message>
</context>
<context>
<name>SettingsWidgetSecurity</name>
<message>
<source>Clear clipboard after</source>
<translation>Pulire appunti dopo</translation>
<translation>Pulisci appunti dopo</translation>
</message>
<message>
<source> sec</source>
@@ -1229,22 +1315,22 @@ 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>Blocca i database dopo un&apos;inattività di</translation>
</message>
<message>
<source>Show passwords in cleartext by default</source>
<translation>Mostrare la password in chiaro in maniera predefinita</translation>
<translation>Mostra la password in chiaro in maniera predefinita</translation>
</message>
<message>
<source>Always ask before performing auto-type</source>
<translation>Chiedere sempre prima di eseguire auto-type</translation>
<translation>Chiedi sempre prima di eseguire auto-type</translation>
</message>
</context>
<context>
<name>UnlockDatabaseWidget</name>
<message>
<source>Unlock database</source>
<translation>Sbloccare database</translation>
<translation>Sblocca database</translation>
</message>
</context>
<context>
@@ -1262,16 +1348,12 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>filename of the password database to open (*.kdbx)</source>
<translation>nome del file del database da aprire (*.kdbx)</translation>
<translation>nome del file di database da aprire (*.kdbx)</translation>
</message>
<message>
<source>path to a custom config file</source>
<translation>percorso ad un file di configurazione personalizzato</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>password del database (PERICOLOSO!)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>file chiave del database</translation>

View File

@@ -9,6 +9,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassXはGNU General Public License (GPL) version 2 version 3 ()</translation>
</message>
<message>
<source>Revision</source>
<translation></translation>
</message>
<message>
<source>Using:</source>
<translation>:</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -18,7 +26,7 @@
</message>
<message>
<source>Couldn&apos;t find an entry that matches the window title:</source>
<translation type="unfinished"/>
<translation>:</translation>
</message>
</context>
<context>
@@ -29,11 +37,11 @@
</message>
<message>
<source>Sequence</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<source>Default sequence</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@@ -44,7 +52,7 @@
</message>
<message>
<source>Select entry to Auto-Type:</source>
<translation type="unfinished"/>
<translation>:</translation>
</message>
</context>
<context>
@@ -107,16 +115,17 @@
</message>
<message>
<source>Different passwords supplied.</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<source>Failed to set key file</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<source>Failed to set %1 as the Key file:
%2</source>
<translation type="unfinished"/>
<translation>%1 :
%2</translation>
</message>
</context>
<context>
@@ -147,7 +156,7 @@
</message>
<message>
<source>Can&apos;t open key file</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>All files</source>
@@ -162,6 +171,43 @@
<translation></translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation></translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation></translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation></translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation></translation>
</message>
<message>
<source>Success</source>
<translation></translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>
</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation></translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -205,7 +251,7 @@
<name>DatabaseTabWidget</name>
<message>
<source>Root</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<source>KeePass 2 Database</source>
@@ -286,35 +332,46 @@ Do you want to open it anyway? Alternatively the database is opened read-only.</
<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>現在編集中のため、データベースをロックすることができませんでした。
キャンセルボタンを押し、変更を完了させるか破棄してください。</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation type="unfinished"/>
<translation>このデータベースは一度も保存されていません。
データベースを保存してロックを解除してください。</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation 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>
<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>
@@ -329,7 +386,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 type="unfinished"/>
<translation>本当にエントリー &quot;%1&quot; を永遠に消去しますか?</translation>
</message>
<message>
<source>Delete entries?</source>
@@ -337,7 +394,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Do you really want to delete %1 entries for good?</source>
<translation type="unfinished"/>
<translation>本当に %1 個のエントリーを永遠に消去しますか?</translation>
</message>
<message>
<source>Move entries to recycle bin?</source>
@@ -412,7 +469,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Different passwords supplied.</source>
<translation type="unfinished"/>
<translation>異なるパスワードが入力されました。</translation>
</message>
<message>
<source>New attribute</source>
@@ -442,11 +499,11 @@ Discard changes and close anyway?</source>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>%s週間()</numerusform></translation>
<translation><numerusform>%n週間</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
<translation><numerusform>%nヶ月()</numerusform></translation>
<translation><numerusform>%nヶ月</numerusform></translation>
</message>
<message>
<source>1 year</source>
@@ -496,7 +553,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Use custom Auto-Type sequence:</source>
<translation>使</translation>
<translation>カスタムの自動入力手順を使う:</translation>
</message>
<message>
<source>+</source>
@@ -546,7 +603,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Username:</source>
<translation></translation>
<translation>ユーザ名:</translation>
</message>
<message>
<source>Password:</source>
@@ -679,7 +736,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>%s個のアイテム()使</numerusform></translation>
<translation><numerusform>%n個のアイテムから使われているので、アイコンを削除できません。</numerusform></translation>
</message>
</context>
<context>
@@ -705,7 +762,7 @@ Discard changes and close anyway?</source>
<name>EntryAttributesModel</name>
<message>
<source>Name</source>
<translation type="unfinished"/>
<translation>名前</translation>
</message>
</context>
<context>
@@ -813,6 +870,16 @@ Discard changes and close anyway?</source>
<source>Unable to calculate master key</source>
<translation>マスターキーを計算できません</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation> KeePass 1 (.kdb)
&gt; &apos;KeePass 1 &apos;
KeePassX 0.4 </translation>
</message>
</context>
<context>
<name>Main</name>
@@ -973,7 +1040,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Toggle window</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<source>Tools</source>
@@ -981,15 +1048,39 @@ 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>
<message>
<source>Repair database</source>
<translation></translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>KeePass 2 </translation>
</message>
<message>
<source>All files</source>
<translation></translation>
</message>
<message>
<source>Save repaired database</source>
<translation></translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation></translation>
</message>
</context>
<context>
@@ -1039,11 +1130,11 @@ Discard changes and close anyway?</source>
<name>QCommandLineParser</name>
<message>
<source>Displays version information.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Displays this help.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Unknown option &apos;%1&apos;.</source>
@@ -1082,7 +1173,7 @@ Discard changes and close anyway?</source>
<name>QSaveFile</name>
<message>
<source>Existing file %1 is not writable</source>
<translation> %1 </translation>
<translation> %1 </translation>
</message>
<message>
<source>Writing canceled by application</source>
@@ -1090,14 +1181,14 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Partial write. Partition full?</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
<name>QtIOCompressor</name>
<message>
<source>Internal zlib error when compressing: </source>
<translation>zlibエラーが発生しました</translation>
<translation>zlibエラーが発生しました: </translation>
</message>
<message>
<source>Error writing to underlying device: </source>
@@ -1113,7 +1204,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Internal zlib error when decompressing: </source>
<translation>zlibエラーが発生しました</translation>
<translation>zlibエラーが発生しました: </translation>
</message>
</context>
<context>
@@ -1193,7 +1284,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Use entry title to match windows for global auto-type</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<source>Language</source>
@@ -1205,7 +1296,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<source>Remember last key files</source>
@@ -1261,11 +1352,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>path to a custom config file</source>
<translation type="unfinished"/>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation> (!)</translation>
<translation></translation>
</message>
<message>
<source>key file of the database</source>

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,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX 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>
<message>
<source>Using:</source>
<translation>Maakt gebruik van:</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -163,6 +171,43 @@
<translation>Kies sleutelbestand</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Database repareren</translation>
</message>
<message>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Niet mogelijk om het sleutelbestand te openen</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>Database werd zonder problemen geopend. Niets te doen.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Niet mogelijk om de database te openen.</translation>
</message>
<message>
<source>Success</source>
<translation>Gelukt</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>De database is met succes gerepareerd
U kunt deze nu opslaan.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Niet mogelijk om de database te repareren.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -322,6 +367,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>
@@ -819,6 +870,16 @@ Wijzigingen ongedaan maken en doorgaan met sluiten?</translation>
<source>Unable to calculate master key</source>
<translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Het gekozen bestand is een oude KeePass 1 database (.kdb).
U kunt het importeren door te klikken op Database &gt; &apos;KeePass 1 database importeren&apos;.
Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen met KeePassX 0.4.</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -997,6 +1058,30 @@ Wijzigingen ongedaan maken en doorgaan met sluiten?</translation>
<source>Export to CSV file</source>
<translation>Naar CSV-bestand exporteren</translation>
</message>
<message>
<source>Repair database</source>
<translation>Database repareren</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>KeePass 2 Database</translation>
</message>
<message>
<source>All files</source>
<translation>Alle bestanden</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Gerepareerde database opslaan</translation>
</message>
<message>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Opslaan van de database is mislukt.</translation>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1187,7 +1272,7 @@ Wijzigingen ongedaan maken en doorgaan met sluiten?</translation>
</message>
<message>
<source>Minimize when copying to clipboard</source>
<translation>Minimaliseer bij kopieeren naar klembord</translation>
<translation>Minimaliseer bij kopiëren naar klembord</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
@@ -1269,10 +1354,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,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX é distribuído sob os termos GNU de licença pública geral (GPL) versão 2 ou (á sua escolha) versão 3.</translation>
</message>
<message>
<source>Revision</source>
<translation type="unfinished"/>
</message>
<message>
<source>Using:</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>AutoType</name>
@@ -163,6 +171,42 @@
<translation>Seleccionar o ficheiro chave</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Error</source>
<translation type="unfinished"/>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unable to open the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Success</source>
<translation type="unfinished"/>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unable to repair the database.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -322,6 +366,11 @@ Fechar e Ignorar alterações ?</translation>
<source>Writing the CSV file failed.</source>
<translation>Falha na escrita do ficheiro 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 type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@@ -818,6 +867,13 @@ Fechar e Ignorar alterações ?</translation>
<source>Unable to calculate master key</source>
<translation>Impossível calcular chave mestra:</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>Main</name>
@@ -996,6 +1052,30 @@ Fechar e Ignorar alterações ?</translation>
<source>Export to CSV file</source>
<translation>Exportar para ficheiro CSV</translation>
</message>
<message>
<source>Repair database</source>
<translation type="unfinished"/>
</message>
<message>
<source>KeePass 2 Database</source>
<translation type="unfinished"/>
</message>
<message>
<source>All files</source>
<translation type="unfinished"/>
</message>
<message>
<source>Save repaired database</source>
<translation type="unfinished"/>
</message>
<message>
<source>Error</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the database failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1268,10 +1348,6 @@ Fechar e Ignorar alterações ?</translation>
<source>path to a custom config file</source>
<translation>caminho para um ficheiro de configuração personalizado</translation>
</message>
<message>
<source>password of the database (DANGEROUS!)</source>
<translation>senha da base de dados (PERIGOSO !)</translation>
</message>
<message>
<source>key file of the database</source>
<translation>ficheiro chave da base de dados</translation>

View File

@@ -9,6 +9,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Ревизия</translation>
</message>
<message>
<source>Using:</source>
<translation>С помощью:</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -163,6 +171,43 @@
<translation>Выберите файл-ключ</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Восстановление хранилища</translation>
</message>
<message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Не могу открыть файл-ключ</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Невозможно открыть хранилище.</translation>
</message>
<message>
<source>Success</source>
<translation>Успешно</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>Хранилище было восстановлено.
Теперь Вы можете сохранить его.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Невозможно восстановить хранилище.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -277,7 +322,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>
@@ -286,23 +331,28 @@ Do you want to open it anyway? Alternatively the database is opened read-only.</
<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>Невозможно заблокировать базу данных, так как вы в настоящее время редактируете её.
Пожалуйста нажмите Отмена, чтобы завершить свои изменения или отклонить их.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation type="unfinished"/>
<translation>Эта база данных никогда не была сохранена.
Вы можете сохранить базу данных или остановить её заблокированной.</translation>
</message>
<message>
<source>This database has been modified.
Do you want to save the database before locking it?
Otherwise your changes are lost.</source>
<translation 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 +364,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>
@@ -558,7 +614,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Gen.</source>
<translation type="unfinished"/>
<translation>Генеральный.</translation>
</message>
<message>
<source>URL:</source>
@@ -636,11 +692,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Use default auto-type sequence of parent group</source>
<translation type="unfinished"/>
<translation>Используйте стандартный автоввод из последовательности родительской группы</translation>
</message>
<message>
<source>Set default auto-type sequence</source>
<translation type="unfinished"/>
<translation>Последовательность автоввода указать по умолчанию</translation>
</message>
</context>
<context>
@@ -813,6 +869,16 @@ Discard changes and close anyway?</source>
<source>Unable to calculate master key</source>
<translation>Невозможно вычислить мастер-пароль</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Выбранный файл от старой KeePass 1 базы данных (.kdb).
Вы можете импортировать его, нажав на База Данных &gt; &apos;Импорт KeePass 1 базы данных&apos;.
Это одностороннее перемещение. Вы не сможете открыть импортированный базу данных на старой версии KeePassX 0,4.</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -991,6 +1057,30 @@ Discard changes and close anyway?</source>
<source>Export to CSV file</source>
<translation>Экспортировать в файл CSV</translation>
</message>
<message>
<source>Repair database</source>
<translation>Восстановление хранилища</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation type="unfinished"/>
</message>
<message>
<source>All files</source>
<translation>Все файлы</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Сохранить восстановленное хранилище</translation>
</message>
<message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordGeneratorWidget</name>
@@ -1263,10 +1353,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,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>Keepassx distribueras enligt villkoren i GNU General Public License (GPL) version 2 eller (om du vill) version 3.</translation>
</message>
<message>
<source>Revision</source>
<translation>Revision</translation>
</message>
<message>
<source>Using:</source>
<translation>Använder:</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -111,12 +119,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>
@@ -162,6 +171,43 @@
<translation>Välj nyckel-fil</translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation>Laga databasen</translation>
</message>
<message>
<source>Error</source>
<translation>Fel</translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation>Kan inte öppna nyckelfilen</translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation>Databas öppnades fint. Inget att göra.</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Misslyckades att öppna databasen.</translation>
</message>
<message>
<source>Success</source>
<translation>Succé</translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>Databasens reparation har varit lyckad.
Du kan nu spara den.</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation>Misslyckades med att laga databasen.</translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -276,44 +322,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 på att redigera den.
Tryck avbryt för att ansluta dina ändringar alternativt kasta dem.</translation>
</message>
<message>
<source>This database has never been saved.
You can save the database or stop locking it.</source>
<translation 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 +418,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 +538,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Open</source>
<translation type="unfinished"/>
<translation>Öppna</translation>
</message>
</context>
<context>
@@ -635,11 +693,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 +849,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 +868,17 @@ 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>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Den valda filen är en gammal KeePass 1 databas (.kdb)
Du kan importera den genom att klicka Databas &gt; Importera KeePass 1 databas.
Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas. Det som används i KeePassX 0.4.</translation>
</message>
</context>
<context>
@@ -832,7 +900,7 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Recent databases</source>
<translation>Senast använda databser</translation>
<translation>Senast använda databaser</translation>
</message>
<message>
<source>Help</source>
@@ -976,19 +1044,43 @@ 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>
<message>
<source>Repair database</source>
<translation>Laga databasen</translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>KeePass 2 databas</translation>
</message>
<message>
<source>All files</source>
<translation>Alla filer</translation>
</message>
<message>
<source>Save repaired database</source>
<translation>Spara lagad databas</translation>
</message>
<message>
<source>Error</source>
<translation>Fel</translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation>Misslyckades med att skriva till databasen.</translation>
</message>
</context>
<context>
@@ -1168,11 +1260,11 @@ Discard changes and close anyway?</source>
</message>
<message>
<source>Open previous databases on startup</source>
<translation>Öppna senaste databasen är programmet startar</translation>
<translation>Öppna senaste databasen r programmet startar</translation>
</message>
<message>
<source>Automatically save on exit</source>
<translation>Spara automatiskt är applikationen anslutas</translation>
<translation>Spara automatiskt r applikationen anslutas</translation>
</message>
<message>
<source>Automatically save after every change</source>
@@ -1208,7 +1300,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 +1354,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,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX 使 2 GNU (GPL)( 3 ).</translation>
</message>
<message>
<source>Revision</source>
<translation></translation>
</message>
<message>
<source>Using:</source>
<translation>使:</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -163,6 +171,43 @@
<translation></translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation></translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation></translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation></translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation></translation>
</message>
<message>
<source>Success</source>
<translation></translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>
</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation></translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -307,19 +352,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>
@@ -762,7 +814,7 @@ Discard changes and close anyway?</source>
<name>KeePass1OpenWidget</name>
<message>
<source>Import KeePass1 database</source>
<translation>KeePass 1 </translation>
<translation>导入 KeePass 1 数据库</translation>
</message>
<message>
<source>Error</source>
@@ -818,6 +870,15 @@ Discard changes and close anyway?</source>
<source>Unable to calculate master key</source>
<translation>无法计算主密码</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation> KeePass 1 .kdb
&gt; &apos;KeePass 1
KeePassX 0.4</translation>
</message>
</context>
<context>
<name>Main</name>
@@ -986,15 +1047,39 @@ 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>
<message>
<source>Repair database</source>
<translation></translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>KeePass 2 </translation>
</message>
<message>
<source>All files</source>
<translation></translation>
</message>
<message>
<source>Save repaired database</source>
<translation></translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation></translation>
</message>
</context>
<context>
@@ -1268,10 +1353,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

@@ -9,6 +9,14 @@
<source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassX 使 2 GNU ( 3 )</translation>
</message>
<message>
<source>Revision</source>
<translation></translation>
</message>
<message>
<source>Using:</source>
<translation>使</translation>
</message>
</context>
<context>
<name>AutoType</name>
@@ -163,6 +171,43 @@
<translation></translation>
</message>
</context>
<context>
<name>DatabaseRepairWidget</name>
<message>
<source>Repair database</source>
<translation></translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Can&apos;t open key file</source>
<translation></translation>
</message>
<message>
<source>Database opened fine. Nothing to do.</source>
<translation></translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation></translation>
</message>
<message>
<source>Success</source>
<translation></translation>
</message>
<message>
<source>The database has been successfully repaired
You can now save it.</source>
<translation>
</translation>
</message>
<message>
<source>Unable to repair the database.</source>
<translation></translation>
</message>
</context>
<context>
<name>DatabaseSettingsWidget</name>
<message>
@@ -306,19 +351,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>
@@ -817,6 +869,17 @@ Discard changes and close anyway?</source>
<source>Unable to calculate master key</source>
<translation>無法計算主金鑰</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation> KeePass 1 (.kdb)
&gt; KeePass 1
KeePassX 0.4 </translation>
</message>
</context>
<context>
<name>Main</name>
@@ -985,15 +1048,39 @@ 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>
<message>
<source>Repair database</source>
<translation></translation>
</message>
<message>
<source>KeePass 2 Database</source>
<translation>KeePass 2 </translation>
</message>
<message>
<source>All files</source>
<translation></translation>
</message>
<message>
<source>Save repaired database</source>
<translation></translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Writing the database failed.</source>
<translation></translation>
</message>
</context>
<context>
@@ -1267,10 +1354,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

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

View File

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

View File

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

View File

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

View File

@@ -1,10 +1,11 @@
if(Q_WS_X11)
find_package(X11)
if(PRINT_SUMMARY)
add_feature_info(libXtest X11_XTest_FOUND "The X11 XTEST Protocol library is required for auto-type")
add_feature_info(libXi X11_Xi_FOUND "The X11 Xi Protocol library is required for auto-type")
add_feature_info(libXtst 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,13 +363,21 @@ 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, 2, False, m_atomWmState, &type, &format,
&nitems, &after, &data);
if (data) {
bool result = false;
if (retVal == 0 && data) {
if (type == m_atomWmState && format == 32 && nitems > 0) {
qint32 state = static_cast<qint32>(*data);
result = (state != WithdrawnState);
}
XFree(data);
}
return (retVal == 0) && type;
return result;
}
KeySym AutoTypePlatformX11::charToKeySym(const QChar& ch)
@@ -436,21 +470,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 +542,7 @@ void AutoTypePlatformX11::stopCatchXErrors()
{
Q_ASSERT(m_catchXErrors);
XSync(m_dpy, false);
XSync(m_dpy, False);
XSetErrorHandler(m_oldXErrorHandler);
m_catchXErrors = false;
}
@@ -536,6 +559,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 +612,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 +821,38 @@ int AutoTypePlatformX11::initialTimeout()
return 500;
}
bool AutoTypePlatformX11::raiseWindow(WId window)
{
if (m_atomNetActiveWindow == None) {
return false;
}
XRaiseWindow(m_dpy, window);
XEvent event;
event.xclient.type = ClientMessage;
event.xclient.serial = 0;
event.xclient.send_event = True;
event.xclient.window = window;
event.xclient.message_type = m_atomNetActiveWindow;
event.xclient.format = 32;
event.xclient.data.l[0] = 1; // FromApplication
event.xclient.data.l[1] = QX11Info::appUserTime();
QWidget* activeWindow = QApplication::activeWindow();
if (activeWindow) {
event.xclient.data.l[2] = activeWindow->internalWinId();
}
else {
event.xclient.data.l[2] = 0;
}
event.xclient.data.l[3] = 0;
event.xclient.data.l[4] = 0;
XSendEvent(m_dpy, m_rootWindow, False,
SubstructureRedirectMask | SubstructureNotifyMask,
&event);
XFlush(m_dpy);
return true;
}
Q_EXPORT_PLUGIN2(keepassx-autotype-x11, AutoTypePlatformX11)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

@@ -380,6 +380,10 @@ SymmetricCipherStream* KeePass1Reader::testKeys(const QString& password, const Q
}
}
if (!cipherStream) {
raiseError(tr("Wrong key or database file is corrupt."));
}
return cipherStream.take();
}
@@ -901,10 +905,10 @@ bool KeePass1Reader::parseCustomIcons4(const QByteArray& data)
QByteArray entryUuid = data.mid(pos, 16);
pos += 16;
int iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
quint32 iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
pos += 4;
if (m_entryUuids.contains(entryUuid) && (iconId < iconUuids.size())) {
if (m_entryUuids.contains(entryUuid) && (iconId < static_cast<quint32>(iconUuids.size()))) {
m_entryUuids[entryUuid]->setIcon(iconUuids[iconId]);
}
}
@@ -917,10 +921,10 @@ bool KeePass1Reader::parseCustomIcons4(const QByteArray& data)
quint32 groupId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
pos += 4;
int iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
quint32 iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER);
pos += 4;
if (m_groupIds.contains(groupId) && (iconId < iconUuids.size())) {
if (m_groupIds.contains(groupId) && (iconId < static_cast<quint32>(iconUuids.size()))) {
m_groupIds[groupId]->setIcon(iconUuids[iconId]);
}
}

View File

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

View File

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

View File

@@ -0,0 +1,107 @@
/*
* Copyright (C) 2016 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 or (at your option)
* version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "KeePass2Repair.h"
#include <QBuffer>
#include <QRegExp>
#include "format/KeePass2RandomStream.h"
#include "format/KeePass2Reader.h"
#include "format/KeePass2XmlReader.h"
KeePass2Repair::KeePass2Repair()
: m_db(Q_NULLPTR)
{
}
KeePass2Repair::RepairResult KeePass2Repair::repairDatabase(QIODevice* device, const CompositeKey& key)
{
m_db = Q_NULLPTR;
m_errorStr.clear();
KeePass2Reader reader;
reader.setSaveXml(true);
Database* db = reader.readDatabase(device, key, true);
if (!reader.hasError()) {
delete db;
return NothingTodo;
}
QByteArray xmlData = reader.xmlData();
if (!db || xmlData.isEmpty()) {
delete db;
m_errorStr = reader.errorString();
return UnableToOpen;
}
bool repairAction = false;
QString xmlStart = QString::fromLatin1(xmlData.constData(), qMin(100, xmlData.size()));
QRegExp encodingRegExp("encoding=\"([^\"]+)\"", Qt::CaseInsensitive, QRegExp::RegExp2);
if (encodingRegExp.indexIn(xmlStart) != -1) {
if (encodingRegExp.cap(1).compare("utf-8", Qt::CaseInsensitive) != 0
&& encodingRegExp.cap(1).compare("utf8", Qt::CaseInsensitive) != 0)
{
// database is not utf-8 encoded, we don't support repairing that
delete db;
return RepairFailed;
}
}
// try to fix broken databases because of bug #392
for (int i = (xmlData.size() - 1); i >= 0; i--) {
quint8 ch = static_cast<quint8>(xmlData.at(i));
if (ch < 0x20 && ch != 0x09 && ch != 0x0A && ch != 0x0D) {
xmlData.remove(i, 1);
repairAction = true;
}
}
if (!repairAction) {
// we were unable to find the problem
delete db;
return RepairFailed;
}
KeePass2RandomStream randomStream;
randomStream.init(reader.streamKey());
KeePass2XmlReader xmlReader;
QBuffer buffer(&xmlData);
buffer.open(QIODevice::ReadOnly);
xmlReader.readDatabase(&buffer, db, &randomStream);
if (xmlReader.hasError()) {
delete db;
return RepairFailed;
}
else {
m_db = db;
return RepairSuccess;
}
}
Database* KeePass2Repair::database() const
{
return m_db;
}
QString KeePass2Repair::errorString() const
{
return m_errorStr;
}

View File

@@ -0,0 +1,50 @@
/*
* Copyright (C) 2016 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 or (at your option)
* version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KEEPASSX_KEEPASS2REPAIR_H
#define KEEPASSX_KEEPASS2REPAIR_H
#include <QCoreApplication>
#include <QIODevice>
#include "core/Database.h"
#include "keys/CompositeKey.h"
class KeePass2Repair
{
Q_DECLARE_TR_FUNCTIONS(KeePass2Repair)
public:
enum RepairResult
{
NothingTodo,
UnableToOpen,
RepairSuccess,
RepairFailed
};
KeePass2Repair();
RepairResult repairDatabase(QIODevice* device, const CompositeKey& key);
Database* database() const;
QString errorString() const;
private:
Database* m_db;
QString m_errorStr;
};
#endif // KEEPASSX_KEEPASS2REPAIR_H

View File

@@ -523,6 +523,7 @@ Group* KeePass2XmlReader::parseGroup()
if (m_strictMode) {
raiseError("Invalid group icon number");
}
iconId = 0;
}
else {
if (iconId >= DatabaseIcons::IconCount) {
@@ -702,6 +703,7 @@ Entry* KeePass2XmlReader::parseEntry(bool history)
if (m_strictMode) {
raiseError("Invalid entry icon number");
}
iconId = 0;
}
else {
entry->setIcon(iconId);
@@ -776,6 +778,13 @@ Entry* KeePass2XmlReader::parseEntry(bool history)
}
Q_FOREACH (Entry* historyItem, historyItems) {
if (historyItem->uuid() != entry->uuid()) {
if (m_strictMode) {
raiseError("History element with different uuid");
} else {
historyItem->setUuid(entry->uuid());
}
}
entry->addHistoryItem(historyItem);
}

View File

@@ -374,7 +374,7 @@ void KeePass2XmlWriter::writeEntry(const Entry* entry)
}
if (!value.isEmpty()) {
m_xml.writeCharacters(value);
m_xml.writeCharacters(stripInvalidXml10Chars(value));
}
m_xml.writeEndElement();
@@ -445,7 +445,7 @@ void KeePass2XmlWriter::writeString(const QString& qualifiedName, const QString&
m_xml.writeEmptyElement(qualifiedName);
}
else {
m_xml.writeTextElement(qualifiedName, string);
m_xml.writeTextElement(qualifiedName, stripInvalidXml10Chars(string));
}
}
@@ -549,6 +549,31 @@ QString KeePass2XmlWriter::colorPartToString(int value)
return str;
}
QString KeePass2XmlWriter::stripInvalidXml10Chars(QString str)
{
for (int i = str.size() - 1; i >= 0; i--) {
const QChar ch = str.at(i);
const ushort uc = ch.unicode();
if (ch.isLowSurrogate() && i != 0 && str.at(i - 1).isHighSurrogate()) {
// keep valid surrogate pair
i--;
}
else if ((uc < 0x20 && uc != 0x09 && uc != 0x0A && uc != 0x0D) // control chracters
|| (uc >= 0x7F && uc <= 0x84) // control chracters, valid but discouraged by XML
|| (uc >= 0x86 && uc <= 0x9F) // control chracters, valid but discouraged by XML
|| (uc > 0xFFFD) // noncharacter
|| ch.isLowSurrogate() // single low surrogate
|| ch.isHighSurrogate()) // single high surrogate
{
qWarning("Stripping invalid XML 1.0 codepoint %x", uc);
str.remove(i, 1);
}
}
return str;
}
void KeePass2XmlWriter::raiseError(const QString& errorMessage)
{
m_error = true;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,105 @@
/*
* Copyright (C) 2016 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 or (at your option)
* version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "DatabaseRepairWidget.h"
#include <QFile>
#include <QFileInfo>
#include "ui_DatabaseOpenWidget.h"
#include "core/Database.h"
#include "core/Metadata.h"
#include "format/KeePass2Repair.h"
#include "gui/MessageBox.h"
#include "keys/FileKey.h"
#include "keys/PasswordKey.h"
DatabaseRepairWidget::DatabaseRepairWidget(QWidget* parent)
: DatabaseOpenWidget(parent)
{
m_ui->labelHeadline->setText(tr("Repair database"));
connect(this, SIGNAL(editFinished(bool)), this, SLOT(processEditFinished(bool)));
}
void DatabaseRepairWidget::openDatabase()
{
CompositeKey masterKey;
if (m_ui->checkPassword->isChecked()) {
masterKey.addKey(PasswordKey(m_ui->editPassword->text()));
}
if (m_ui->checkKeyFile->isChecked()) {
FileKey key;
QString keyFilename = m_ui->comboKeyFile->currentText();
QString errorMsg;
if (!key.load(keyFilename, &errorMsg)) {
MessageBox::warning(this, tr("Error"), tr("Can't open key file").append(":\n").append(errorMsg));
Q_EMIT editFinished(false);
return;
}
masterKey.addKey(key);
}
KeePass2Repair repair;
QFile file(m_filename);
if (!file.open(QIODevice::ReadOnly)) {
MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n")
.append(file.errorString()));
Q_EMIT editFinished(false);
return;
}
if (m_db) {
delete m_db;
}
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
KeePass2Repair::RepairResult repairResult = repair.repairDatabase(&file, masterKey);
QApplication::restoreOverrideCursor();
switch (repairResult) {
case KeePass2Repair::NothingTodo:
MessageBox::information(this, tr("Error"), tr("Database opened fine. Nothing to do."));
Q_EMIT editFinished(false);
return;
case KeePass2Repair::UnableToOpen:
MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n")
.append(repair.errorString()));
Q_EMIT editFinished(false);
return;
case KeePass2Repair::RepairSuccess:
m_db = repair.database();
MessageBox::warning(this, tr("Success"), tr("The database has been successfully repaired\nYou can now save it."));
Q_EMIT editFinished(true);
return;
case KeePass2Repair::RepairFailed:
MessageBox::warning(this, tr("Error"), tr("Unable to repair the database."));
Q_EMIT editFinished(false);
return;
}
}
void DatabaseRepairWidget::processEditFinished(bool result)
{
if (result) {
Q_EMIT success();
}
else {
Q_EMIT error();
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2016 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 or (at your option)
* version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KEEPASSX_DATABASEREPAIRWIDGET_H
#define KEEPASSX_DATABASEREPAIRWIDGET_H
#include "gui/DatabaseOpenWidget.h"
class DatabaseRepairWidget : public DatabaseOpenWidget
{
Q_OBJECT
public:
explicit DatabaseRepairWidget(QWidget* parent = Q_NULLPTR);
Q_SIGNALS:
void success();
void error();
protected:
void openDatabase() Q_DECL_OVERRIDE;
private Q_SLOTS:
void processEditFinished(bool result);
};
#endif // KEEPASSX_DATABASEREPAIRWIDGET_H

View File

@@ -27,6 +27,7 @@
#include "core/Metadata.h"
#include "core/qsavefile.h"
#include "format/CsvExporter.h"
#include "gui/Clipboard.h"
#include "gui/DatabaseWidget.h"
#include "gui/DatabaseWidgetStateSync.h"
#include "gui/DragTabBar.h"
@@ -130,11 +131,10 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
// test if we can read/write or read the file
QFile file(fileName);
// TODO: error handling
if (!file.open(QIODevice::ReadWrite)) {
if (!file.open(QIODevice::ReadOnly)) {
// can't open
// TODO: error message
MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n")
.append(file.errorString()));
return;
}
else {
@@ -295,7 +295,7 @@ bool DatabaseTabWidget::saveDatabase(Database* db)
DatabaseManagerStruct& dbStruct = m_dbList[db];
if (dbStruct.saveToFilename) {
QSaveFile saveFile(dbStruct.filePath);
QSaveFile saveFile(dbStruct.canonicalFilePath);
if (saveFile.open(QIODevice::WriteOnly)) {
m_writer.writeDatabase(&saveFile, db);
if (m_writer.hasError()) {
@@ -309,6 +309,11 @@ bool DatabaseTabWidget::saveDatabase(Database* db)
return false;
}
}
else {
MessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ saveFile.errorString());
return false;
}
dbStruct.modified = false;
updateTabName(db);
@@ -385,6 +390,9 @@ bool DatabaseTabWidget::saveDatabaseAs(Database* db)
return false;
}
// refresh fileinfo since the file didn't exist before
fileInfo.refresh();
dbStruct.modified = false;
dbStruct.saveToFilename = true;
dbStruct.readOnly = false;
@@ -632,6 +640,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);
@@ -339,14 +341,24 @@ void DatabaseWidget::deleteEntries()
}
}
else {
if (selected.size() > 1) {
QMessageBox::StandardButton result = MessageBox::question(
QMessageBox::StandardButton result;
if (selected.size() == 1) {
result = MessageBox::question(
this, tr("Move entry to recycle bin?"),
tr("Do you really want to move entry \"%1\" to the recycle bin?")
.arg(selectedEntries.first()->title()),
QMessageBox::Yes | QMessageBox::No);
}
else {
result = MessageBox::question(
this, tr("Move entries to recycle bin?"),
tr("Do you really want to move %n entry(s) to the recycle bin?", 0, selected.size()),
QMessageBox::Yes | QMessageBox::No);
if (result == QMessageBox::No) {
return;
}
}
if (result == QMessageBox::No) {
return;
}
Q_FOREACH (Entry* entry, selectedEntries) {
@@ -491,7 +503,9 @@ void DatabaseWidget::deleteGroup()
}
bool inRecylceBin = Tools::hasChild(m_db->metadata()->recycleBin(), currentGroup);
if (inRecylceBin || !m_db->metadata()->recycleBinEnabled()) {
bool isRecycleBin = (currentGroup == m_db->metadata()->recycleBin());
bool isRecycleBinSubgroup = Tools::hasChild(currentGroup, m_db->metadata()->recycleBin());
if (inRecylceBin || isRecycleBin || isRecycleBinSubgroup || !m_db->metadata()->recycleBinEnabled()) {
QMessageBox::StandardButton result = MessageBox::question(
this, tr("Delete group?"),
tr("Do you really want to delete the group \"%1\" for good?")
@@ -869,8 +883,7 @@ bool DatabaseWidget::dbHasKey() const
bool DatabaseWidget::canDeleteCurrentGroup() const
{
bool isRootGroup = m_db->rootGroup() == m_groupView->currentGroup();
bool isRecycleBin = m_db->metadata()->recycleBin() == m_groupView->currentGroup();
return !isRootGroup && !isRecycleBin;
return !isRootGroup;
}
bool DatabaseWidget::isInSearchMode() const
@@ -982,3 +995,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

@@ -19,6 +19,7 @@
#include "ui_EditWidgetIcons.h"
#include <QFileDialog>
#include <QImageReader>
#include "core/Group.h"
#include "core/Metadata.h"
@@ -98,7 +99,7 @@ void EditWidgetIcons::load(Uuid currentUuid, Database* database, IconStruct icon
m_database = database;
m_currentUuid = currentUuid;
m_customIconModel->setIcons(database->metadata()->customIcons(),
m_customIconModel->setIcons(database->metadata()->customIconsScaledPixmaps(),
database->metadata()->customIconsOrder());
Uuid iconUuid = iconStruct.uuid;
@@ -129,17 +130,21 @@ void EditWidgetIcons::addCustomIcon()
QString filename = QFileDialog::getOpenFileName(
this, tr("Select Image"), "", filter);
if (!filename.isEmpty()) {
QImage image(filename);
QImageReader imageReader(filename);
// detect from content, otherwise reading fails if file extension is wrong
imageReader.setDecideFormatFromContent(true);
QImage image = imageReader.read();
if (!image.isNull()) {
Uuid uuid = Uuid::random();
m_database->metadata()->addCustomIconScaled(uuid, image);
m_customIconModel->setIcons(m_database->metadata()->customIcons(),
m_customIconModel->setIcons(m_database->metadata()->customIconsScaledPixmaps(),
m_database->metadata()->customIconsOrder());
QModelIndex index = m_customIconModel->indexFromUuid(uuid);
m_ui->customIconsView->setCurrentIndex(index);
}
else {
// TODO: show error
MessageBox::critical(this, tr("Error"),
tr("Can't read icon:").append("\n").append(imageReader.errorString()));
}
}
}
@@ -183,7 +188,7 @@ void EditWidgetIcons::removeCustomIcon()
}
m_database->metadata()->removeCustomIcon(iconUuid);
m_customIconModel->setIcons(m_database->metadata()->customIcons(),
m_customIconModel->setIcons(m_database->metadata()->customIconsScaledPixmaps(),
m_database->metadata()->customIconsOrder());
if (m_customIconModel->rowCount() > 0) {
m_ui->customIconsView->setCurrentIndex(m_customIconModel->index(0, 0));

View File

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

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

View File

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

View File

@@ -49,7 +49,8 @@ void KeePass1OpenWidget::openDatabase()
QFile file(m_filename);
if (!file.open(QIODevice::ReadOnly)) {
// TODO: error message
MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n")
.append(file.errorString()));
return;
}
if (m_db) {

View File

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

View File

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

View File

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

View File

@@ -49,7 +49,7 @@ void PasswordComboBox::setEcho(bool echo)
// Qt on Mac OS doesn't seem to know the generic monospace family (tested with 4.8.6)
setStyleSheet("QComboBox { font-family: monospace,Menlo,Monaco; }");
#else
setStyleSheet("QComboBox { font-family: monospace,Courier; }");
setStyleSheet("QComboBox { font-family: monospace,Courier New; }");
#endif
}

View File

@@ -60,7 +60,7 @@ void PasswordEdit::updateStylesheet()
// Qt on Mac OS doesn't seem to know the generic monospace family (tested with 4.8.6)
stylesheet.append("font-family: monospace,Menlo,Monaco; ");
#else
stylesheet.append("font-family: monospace; ");
stylesheet.append("font-family: monospace,Courier New; ");
#endif
}

View File

@@ -88,6 +88,14 @@ void PasswordGeneratorWidget::reset()
updateGenerator();
}
void PasswordGeneratorWidget::regeneratePassword()
{
if (m_generator->isValid()) {
QString password = m_generator->generatePassword();
m_ui->editNewPassword->setEditText(password);
}
}
void PasswordGeneratorWidget::updateApplyEnabled(const QString& password)
{
m_ui->buttonApply->setEnabled(!password.isEmpty());
@@ -111,6 +119,10 @@ void PasswordGeneratorWidget::sliderMoved()
void PasswordGeneratorWidget::spinBoxChanged()
{
if (m_updatingSpinBox) {
return;
}
// Interlock so that we don't update twice - this causes issues as the spinbox can go higher than slider
m_updatingSpinBox = true;
@@ -161,12 +173,39 @@ PasswordGenerator::GeneratorFlags PasswordGeneratorWidget::generatorFlags()
void PasswordGeneratorWidget::updateGenerator()
{
m_generator->setLength(m_ui->spinBoxLength->value());
m_generator->setCharClasses(charClasses());
m_generator->setFlags(generatorFlags());
PasswordGenerator::CharClasses classes = charClasses();
PasswordGenerator::GeneratorFlags flags = generatorFlags();
if (m_generator->isValid()) {
QString password = m_generator->generatePassword();
m_ui->editNewPassword->setEditText(password);
int minLength = 0;
if (flags.testFlag(PasswordGenerator::CharFromEveryGroup)) {
if (classes.testFlag(PasswordGenerator::LowerLetters)) {
minLength++;
}
if (classes.testFlag(PasswordGenerator::UpperLetters)) {
minLength++;
}
if (classes.testFlag(PasswordGenerator::Numbers)) {
minLength++;
}
if (classes.testFlag(PasswordGenerator::SpecialCharacters)) {
minLength++;
}
}
minLength = qMax(minLength, 1);
if (m_ui->spinBoxLength->value() < minLength) {
m_updatingSpinBox = true;
m_ui->spinBoxLength->setValue(minLength);
m_ui->sliderLength->setValue(minLength);
m_updatingSpinBox = false;
}
m_ui->spinBoxLength->setMinimum(minLength);
m_ui->sliderLength->setMinimum(minLength);
m_generator->setLength(m_ui->spinBoxLength->value());
m_generator->setCharClasses(classes);
m_generator->setFlags(flags);
regeneratePassword();
}

View File

@@ -39,6 +39,7 @@ public:
~PasswordGeneratorWidget();
void loadSettings();
void reset();
void regeneratePassword();
Q_SIGNALS:
void newPassword(const QString& password);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

@@ -386,7 +386,12 @@ void TestGroup::testClone()
QVERIFY(clonedSubGroupEntry->uuid() != subGroupEntry->uuid());
QCOMPARE(clonedSubGroupEntry->title(), QString("SubGroupEntry"));
Group* clonedGroupKeepUuid = originalGroup->clone(Entry::CloneNoFlags);
QCOMPARE(clonedGroupKeepUuid->entries().at(0)->uuid(), originalGroupEntry->uuid());
QCOMPARE(clonedGroupKeepUuid->children().at(0)->entries().at(0)->uuid(), subGroupEntry->uuid());
delete clonedGroup;
delete clonedGroupKeepUuid;
delete db;
}

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

@@ -18,8 +18,10 @@
#include "TestKeePass2Writer.h"
#include <QBuffer>
#include <QFile>
#include <QTest>
#include "config-keepassx-tests.h"
#include "tests.h"
#include "FailDevice.h"
#include "core/Database.h"
@@ -27,6 +29,7 @@
#include "core/Metadata.h"
#include "crypto/Crypto.h"
#include "format/KeePass2Reader.h"
#include "format/KeePass2Repair.h"
#include "format/KeePass2Writer.h"
#include "format/KeePass2XmlWriter.h"
#include "keys/PasswordKey.h"
@@ -127,6 +130,34 @@ void TestKeePass2Writer::testDeviceFailure()
delete db;
}
void TestKeePass2Writer::testRepair()
{
QString brokenDbFilename = QString(KEEPASSX_TEST_DATA_DIR).append("/bug392.kdbx");
// master password = test
// entry username: testuser\x10\x20AC
// entry password: testpw
CompositeKey key;
key.addKey(PasswordKey("test"));
// test that we can't open the broken database
KeePass2Reader reader;
Database* dbBroken = reader.readDatabase(brokenDbFilename, key);
QVERIFY(!dbBroken);
QVERIFY(reader.hasError());
// test if we can repair the database
KeePass2Repair repair;
QFile file(brokenDbFilename);
file.open(QIODevice::ReadOnly);
QCOMPARE(repair.repairDatabase(&file, key), KeePass2Repair::RepairSuccess);
Database* dbRepaired = repair.database();
QVERIFY(dbRepaired);
QCOMPARE(dbRepaired->rootGroup()->entries().size(), 1);
QCOMPARE(dbRepaired->rootGroup()->entries().at(0)->username(), QString("testuser").append(QChar(0x20AC)));
QCOMPARE(dbRepaired->rootGroup()->entries().at(0)->password(), QString("testpw"));
}
void TestKeePass2Writer::cleanupTestCase()
{
delete m_dbOrg;

View File

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

View File

@@ -17,6 +17,7 @@
#include "TestKeePass2XmlReader.h"
#include <QBuffer>
#include <QFile>
#include <QTest>
@@ -26,6 +27,7 @@
#include "core/Metadata.h"
#include "crypto/Crypto.h"
#include "format/KeePass2XmlReader.h"
#include "format/KeePass2XmlWriter.h"
#include "config-keepassx-tests.h"
QTEST_GUILESS_MAIN(TestKeePass2XmlReader)
@@ -66,6 +68,18 @@ QDateTime TestKeePass2XmlReader::genDT(int year, int month, int day, int hour, i
return QDateTime(date, time, Qt::UTC);
}
QByteArray TestKeePass2XmlReader::strToBytes(const QString& str)
{
QByteArray result;
for (int i = 0; i < str.size(); i++) {
result.append(str.at(i).unicode() >> 8);
result.append(str.at(i).unicode() & 0xFF);
}
return result;
}
void TestKeePass2XmlReader::initTestCase()
{
QVERIFY(Crypto::init());
@@ -315,7 +329,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);
{
@@ -393,6 +407,8 @@ void TestKeePass2XmlReader::testBroken_data()
QTest::newRow("BrokenGroupReference (not strict)") << "BrokenGroupReference" << false << false;
QTest::newRow("BrokenDeletedObjects (strict)") << "BrokenDeletedObjects" << true << true;
QTest::newRow("BrokenDeletedObjects (not strict)") << "BrokenDeletedObjects" << false << false;
QTest::newRow("BrokenDifferentEntryHistoryUuid (strict)") << "BrokenDifferentEntryHistoryUuid" << true << true;
QTest::newRow("BrokenDifferentEntryHistoryUuid (not strict)") << "BrokenDifferentEntryHistoryUuid" << false << false;
}
void TestKeePass2XmlReader::testEmptyUuids()
@@ -408,6 +424,97 @@ void TestKeePass2XmlReader::testEmptyUuids()
QVERIFY(!reader.hasError());
}
void TestKeePass2XmlReader::testInvalidXmlChars()
{
QScopedPointer<Database> dbWrite(new Database());
QString strPlainInvalid = QString().append(QChar(0x02)).append(QChar(0x19))
.append(QChar(0xFFFE)).append(QChar(0xFFFF));
QString strPlainValid = QString().append(QChar(0x09)).append(QChar(0x0A))
.append(QChar(0x20)).append(QChar(0xD7FF))
.append(QChar(0xE000)).append(QChar(0xFFFD));
// U+10437 in UTF-16: D801 DC37
// high low surrogate
QString strSingleHighSurrogate1 = QString().append(QChar(0xD801));
QString strSingleHighSurrogate2 = QString().append(QChar(0x31)).append(QChar(0xD801)).append(QChar(0x32));
QString strHighHighSurrogate = QString().append(QChar(0xD801)).append(QChar(0xD801));
QString strSingleLowSurrogate1 = QString().append(QChar(0xDC37));
QString strSingleLowSurrogate2 = QString().append(QChar((0x31))).append(QChar(0xDC37)).append(QChar(0x32));
QString strLowLowSurrogate = QString().append(QChar(0xDC37)).append(QChar(0xDC37));
QString strSurrogateValid1 = QString().append(QChar(0xD801)).append(QChar(0xDC37));
QString strSurrogateValid2 = QString().append(QChar(0x31)).append(QChar(0xD801)).append(QChar(0xDC37)).append(QChar(0x32));
Entry* entry = new Entry();
entry->setUuid(Uuid::random());
entry->setGroup(dbWrite->rootGroup());
entry->attributes()->set("PlainInvalid", strPlainInvalid);
entry->attributes()->set("PlainValid", strPlainValid);
entry->attributes()->set("SingleHighSurrogate1", strSingleHighSurrogate1);
entry->attributes()->set("SingleHighSurrogate2", strSingleHighSurrogate2);
entry->attributes()->set("HighHighSurrogate", strHighHighSurrogate);
entry->attributes()->set("SingleLowSurrogate1", strSingleLowSurrogate1);
entry->attributes()->set("SingleLowSurrogate2", strSingleLowSurrogate2);
entry->attributes()->set("LowLowSurrogate", strLowLowSurrogate);
entry->attributes()->set("SurrogateValid1", strSurrogateValid1);
entry->attributes()->set("SurrogateValid2", strSurrogateValid2);
QBuffer buffer;
buffer.open(QIODevice::ReadWrite);
KeePass2XmlWriter writer;
writer.writeDatabase(&buffer, dbWrite.data());
QVERIFY(!writer.hasError());
buffer.seek(0);
KeePass2XmlReader reader;
reader.setStrictMode(true);
QScopedPointer<Database> dbRead(reader.readDatabase(&buffer));
if (reader.hasError()) {
qWarning("Database read error: %s", qPrintable(reader.errorString()));
}
QVERIFY(!reader.hasError());
QVERIFY(!dbRead.isNull());
QCOMPARE(dbRead->rootGroup()->entries().size(), 1);
Entry* entryRead = dbRead->rootGroup()->entries().at(0);
EntryAttributes* attrRead = entryRead->attributes();
QCOMPARE(strToBytes(attrRead->value("PlainInvalid")), QByteArray());
QCOMPARE(strToBytes(attrRead->value("PlainValid")), strToBytes(strPlainValid));
QCOMPARE(strToBytes(attrRead->value("SingleHighSurrogate1")), QByteArray());
QCOMPARE(strToBytes(attrRead->value("SingleHighSurrogate2")), strToBytes(QString("12")));
QCOMPARE(strToBytes(attrRead->value("HighHighSurrogate")), QByteArray());
QCOMPARE(strToBytes(attrRead->value("SingleLowSurrogate1")), QByteArray());
QCOMPARE(strToBytes(attrRead->value("SingleLowSurrogate2")), strToBytes(QString("12")));
QCOMPARE(strToBytes(attrRead->value("LowLowSurrogate")), QByteArray());
QCOMPARE(strToBytes(attrRead->value("SurrogateValid1")), strToBytes(strSurrogateValid1));
QCOMPARE(strToBytes(attrRead->value("SurrogateValid2")), strToBytes(strSurrogateValid2));
}
void TestKeePass2XmlReader::testRepairUuidHistoryItem()
{
KeePass2XmlReader reader;
QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, "BrokenDifferentEntryHistoryUuid");
QVERIFY(QFile::exists(xmlFile));
QScopedPointer<Database> db(reader.readDatabase(xmlFile));
if (reader.hasError()) {
qWarning("Database read error: %s", qPrintable(reader.errorString()));
}
QVERIFY(!reader.hasError());
QList<Entry*> entries = db.data()->rootGroup()->entries();
QCOMPARE(entries.size(), 1);
Entry* entry = entries.at(0);
QList<Entry*> historyItems = entry->historyItems();
QCOMPARE(historyItems.size(), 1);
Entry* historyItem = historyItems.at(0);
QVERIFY(!entry->uuid().isNull());
QVERIFY(!historyItem->uuid().isNull());
QCOMPARE(historyItem->uuid(), entry->uuid());
}
void TestKeePass2XmlReader::cleanupTestCase()
{
delete m_db;

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